42

When I first started programming for the web and I wanted to create a new project I was always taught to create a directory in /var/www/. However in a lot of tutorials I read people tend to create a directory in /home/username/.

I don't like the idea of putting it in /home/username/.

Is there a correct place or if not what are the advantages/disadvantages of placing it in certain areas on the file system?

2
  • That's preference ("best" implies that, maybe you should change this to be most secure, etc.) for development mostly. If you are serving them from there too, then you'd probably want something secluded to keep some sort of distance between your personal files and web-share stuff. But there are a million configurations. I stick with /var/www and usually have that on another drive (just preference).
    – nerdwaller
    Aug 22, 2013 at 13:40
  • There is no "best" directory. Its entirely your perference because the phyiscal location of the files does not matter.
    – Ramhound
    Aug 22, 2013 at 13:42

5 Answers 5

62

There is no "best" directory. And while people might argue that this question is subjective, or that the actual placement of files does not matter—and they're right about the latter—there are standardized recommendations on where to put what in Unix-like systems.

The Filesystem Hierarchy Standard defines this and offers you the following:

  • /var – a place to put data that changes during normal operation, like logs, etc. /var/www is the default directory to place web content for Apache, but its usage is not standardized at all and just the "usual" place you'd put it because people don't change the default settings very often.

  • /srv – this directory should contain data that is served by the system. This is usually the place you want. The FHS explains:

    This main purpose of specifying this is so that users may find the location of the data files for particular service, and so that services which require a single tree for readonly data, writable data and scripts (such as cgi scripts) can be reasonably placed. Data that is only of interest to a specific user should go in that users’ home directory. (…)

    One method for structuring data under /srv is by protocol, eg. ftp, rsync, www, and cvs

    So, simply create a /srv/www directory and use this. You can create subfolders for every virtual host you might want to serve with your machine.

  • /home contains files that really should just belong to one user. Apache for example allows userdirs, so you can access a user's web files through http://example.com/~username, and they're served from the public_html directory in the user's home.

    If you use a server that is shared among multiple people, and you want to allow everybody to host their own scripts, this is where they should go. Remember to make the directories writable by the user they belong to only.

In essence /srv/www and /var/www are directories you should create subdirectories in for any web project you might want to host. You can then define different permissions on these directories to allow certain users or user groups to write to them. If you have projects for one user at a time, use /home.

7
  • 3
    The http://example.com/~username usually does not point to /home/username/, but to /home/username/public_html/.
    – choroba
    Aug 22, 2013 at 13:47
  • Yeah, thanks, that should have been added for clarity. Done.
    – slhck
    Aug 22, 2013 at 13:51
  • 2
    After several years of using /var/www it is time for change!
    – sitilge
    Oct 5, 2016 at 9:31
  • Also, www sounds more like a subdomain to me.
    – sitilge
    Oct 5, 2016 at 9:33
  • Just to add... The use of /var/www is a common practice for single site serving instances and as said the default Apache location, whereas using /home/usr/ was/is a common practice for reseller servers or multi-site hosting drawn from the concept of users==clients. Both are just common practices and shlck's answer is a better use of the filesystem's intended purposes.
    – Jools
    Feb 7, 2019 at 13:55
15

Well you can put files anywhere long as things can access them properly, however cluttered filesystems are a headache if someone comes in later.

/srv is most logical plus if you follow Filesystem Hierarchy Standard it would go here.

If you do multiple domains you can do /srv/domain1 /srv/domain2 etc etc then subfolder out inside there /ftp /www /tftp /logs /etc.etc.etc

To me that feels a very solid structure to build upon and easily control

But as an administrator you can do as clean or messy as you wish.

8

Ok easy quick answer.

If your web files on the system will only be accessed by ONE user on the linux system. Use the home directory of the user (~/).

If your web files on the system will be accessed by MULTIPLE users on the linux system. Use /srv/.

This is exactly what http://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#SRVDATAFORSERVICESPROVIDEDBYSYSTEM states.

Here is the quote:

/srv contains site-specific data which is served by this system.

This main purpose of specifying this is so that users may find the location of the data files for particular service, and so that services which require a single tree for readonly data, writable data and scripts (such as cgi scripts) can be reasonably placed. Data that is only of interest to a specific user should go in that users' home directory.

Bonus: www? ftp? Organize by protocol? Huh?

As stated here in http://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#SRVDATAFORSERVICESPROVIDEDBYSYSTEM

  • If your website is only accessed by ONE user on the system and ONLY via the browser (http protocol) then: ~/http/your-website-directory/
  • If your website is only accessed by ONE user on the system and NOT ONLY via the browser but multiple protocols (i.g. http AND tcp AND ...) then: ~/your-website-directory/
  • If your website is accessed by MULTIPLE users on the system and ONLY via the browser (http protocol) then: /srv/http/your-website-directory/
  • If your website is accessed by MULTIPLE users on the system and NOT ONLY via the browser but multiple protocols (i.g. http AND ftp AND ...) then: /srv/your-website-directory/

Huh why not www? This is legacy from the Apache time. www doesn't specify which protocol is being used. Debian still uses this as of today while for example Arch linux uses /srv/http.

3
  • 1
    The FHS specifically mentions "eg. ftp, rsync, www, ...". I would debate whether HTTP and HTTPS count as separate protocols, or just the same protocol with and without TLS. They are both Hypertext Transfer Protocol, just one is Hypertext Transfer Protocol Secure. Usually the same service would serve the content once, using both protocols (with port 80 to get an automatic Let's Encrypt certificate to use for 443). Otherwise there would be multiple methods of FTP, with and without TLS, and any other protocol that has both with and without TLS versions. Feb 8, 2021 at 22:02
  • @SlyGryphon You bring up a valid point actually. Now when I think about it I think just using the protocol and leaving out TLS would make life easier for everyone. Feb 9, 2021 at 10:58
  • @SlyGryphon Removed https. Feb 9, 2021 at 10:59
1

Apache web server have default website under /var/www/ but it is suggesting to put other websites under /srv/

I noticed this on Ubuntu Server 14.04 LTS. Its default apache2.conf file contains commented block:

#<Directory /srv/>
#   Options Indexes FollowSymLinks
#   AllowOverride None
#   Require all granted
#</Directory>
-1

I've come to like the idea of creating a "user group" for my app. So if I have a website/app called "Cowiki", for example, I create a new user and associated group called "cowiki" with a home directory at "/home/cowiki/" under which the site code resides. This could be simple HTML for a static site or a framework's site code (Rails, Phoenix, whatever), internally organized as fits the application/framework.

As I said, I think of these home directories as "user groups". Since they exist as groups in the access settings, I can give actual users permission to the group as needed. For example, maintainers of the site would have full cowiki group access.

The best part of this, and the main reason to do it, is because I always partition my discs such that "/home" is a separate partition (and possibly a separate drive) from "/". That way it is easy to keep my apps backed up, and easily restore a system if the OS needs a reinstall (just don't mount your home partition during install and then switch it over in fstab afterwards -- only trick is to keep user ids the same).

If you keep your web apps in "srv/" you can still get the group benefits by adding a group independent of a adding a new user. But you have to backup "srv/" independently and ideally have yet another partition for it to keep it separate from the OS files. To me that's seems a bit more trouble then it's worth.

0

Not the answer you're looking for? Browse other questions tagged .