Optimal Directory Structure for Nginx Web Hosting on Ubuntu: Where to Place www and Site Directories


2 views

When setting up multiple websites on Ubuntu with Nginx, the most conventional approach is to use /var/www/ as the root directory. This follows the Filesystem Hierarchy Standard (FHS) and is widely adopted in the Linux community.

For your specific case with multiple domains, here's the recommended structure:

/var/www/
├── mysite1.co.uk/
│   ├── www/           # Public files
│   ├── logs/          # Site-specific logs
│   └── private/       # Non-public files
└── mysite2.co.uk/
    ├── www/
    ├── logs/
    └── private/

Here's how to create this structure with proper permissions:

sudo mkdir -p /var/www/{mysite1.co.uk,mysite2.co.uk}/{www,logs,private}
sudo chown -R $USER:$USER /var/www
sudo chmod -R 755 /var/www

For each site, create a server block configuration in /etc/nginx/sites-available/:

server {
    listen 80;
    server_name mysite1.co.uk www.mysite1.co.uk;
    
    root /var/www/mysite1.co.uk/www;
    index index.html index.htm;
    
    access_log /var/www/mysite1.co.uk/logs/access.log;
    error_log /var/www/mysite1.co.uk/logs/error.log;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

While /var/www/ is standard, some alternatives exist:

  • /srv/www/ - For service-specific data
  • /home/user/www/ - For development environments

For enhanced security:

sudo chown -R www-data:www-data /var/www/mysite1.co.uk/www
sudo find /var/www/mysite1.co.uk/www -type d -exec chmod 750 {} \;
sudo find /var/www/mysite1.co.uk/www -type f -exec chmod 640 {} \;

After creating the config file, enable it with:

sudo ln -s /etc/nginx/sites-available/mysite1.co.uk /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

When setting up websites on Ubuntu with Nginx, the most common and recommended location is under /var/www/. This directory is specifically designated for web content and follows Linux Filesystem Hierarchy Standard (FHS).

/var/www/
├── domain1.com
│   ├── public_html/  # Public files (equivalent to www/)
│   ├── private/      # Non-public files
│   └── logs/         # Domain-specific logs
└── domain2.com
    ├── public_html/
    ├── private/
    └── logs/

Here's how to properly set up your directory structure for Nginx:

sudo mkdir -p /var/www/mysite1.co.uk/public_html
sudo mkdir -p /var/www/mysite1.co.uk/private
sudo mkdir -p /var/www/mysite2.co.uk/public_html
sudo mkdir -p /var/www/mysite2.co.uk/private

# Set proper permissions
sudo chown -R $USER:$USER /var/www/mysite1.co.uk
sudo chown -R $USER:$USER /var/www/mysite2.co.uk
sudo chmod -R 755 /var/www

For each site, create a server block in Nginx:

server {
    listen 80;
    server_name mysite1.co.uk www.mysite1.co.uk;
    
    root /var/www/mysite1.co.uk/public_html;
    index index.html index.htm index.php;
    
    location /private/ {
        deny all;
        return 404;
    }
    
    # Additional configuration...
}

While /var/www/ is standard, some administrators prefer:

  • /srv/www/ - For service-specific data
  • /home/user/www/ - For development environments

Key factors when choosing location:

  • Security implications
  • Backup strategy
  • Server maintenance procedures
  • Multi-user access requirements

Always follow the principle of least privilege:

# Recommended permission structure
sudo chown -R www-data:www-data /var/www/mysite1.co.uk/public_html
sudo find /var/www/mysite1.co.uk/public_html -type d -exec chmod 750 {} \;
sudo find /var/www/mysite1.co.uk/public_html -type f -exec chmod 640 {} \;