When examining process ownership after installation from nginx.org packages, you'll typically see:
ps aux | grep nginx
root 1234 0.0 0.1 12345 6789 ? Ss 12:34 0:00 nginx: master process
nginx 1235 0.0 0.2 23456 9012 ? S 12:34 0:00 nginx: worker process
The www-data user originates from Debian/Ubuntu conventions where web services traditionally run under this shared account. Key characteristics:
- UID typically 33 across Debian-based systems
- Default group ownership for /var/www
- Used by Apache and other web services by default
Official nginx.org packages create a dedicated 'nginx' user with:
id nginx
uid=998(nginx) gid=996(nginx) groups=996(nginx)
Key security aspects:
- Isolated from other services
- Custom UID/GID outside standard ranges
- Tighter control over required permissions
Sample directory structure permissions for both users:
drwxr-xr-x 2 root root 4096 /etc/nginx
drwxr-xr-x 3 www-data www-data 4096 /var/www/html
drwxr-x--- 2 nginx nginx 4096 /var/cache/nginx
Recommended configuration for production environments:
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
}
}
To switch from nginx to www-data user:
sudo usermod -a -G www-data nginx
sudo chown -R www-data:www-data /var/cache/nginx
sudo sed -i 's/user nginx;/user www-data;/' /etc/nginx/nginx.conf
sudo systemctl restart nginx
For maximum security, implement separate permissions:
sudo mkdir -p /srv/example.com/{public,private}
sudo chown nginx:nginx /srv/example.com/private
sudo chown www-data:www-data /srv/example.com/public
sudo chmod 750 /srv/example.com/private
When installing Nginx from nginx.org repository on Ubuntu 16.04, the default configuration specifies:
user nginx;
This creates a dedicated system user nginx
for worker processes, while Ubuntu's package manager typically uses www-data
. The key differences:
Both users serve the same fundamental purpose but have different permission contexts:
# Typical www-data permissions (Debian/Ubuntu):
drwxr-xr-x 4 www-data www-data 4096 Feb 15 2023 /var/www
-rw-r--r-- 1 www-data www-data 725 Jan 12 2023 /var/www/html/index.nginx-debian.html
# Typical nginx permissions (from nginx.org):
drwxr-xr-x 2 nginx nginx 4096 Nov 30 15:22 /var/cache/nginx
drwx------ 2 nginx nginx 4096 Nov 30 15:22 /var/lib/nginx
The security difference primarily depends on:
- Directory ownership and permissions set during installation
- How your web application files are deployed
- Whether other services need to access the same files
Use www-data when:
# If using Ubuntu/Debian packages
user www-data;
# When integrating with PHP-FPM or other services expecting www-data
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Use nginx when:
# For standalone Nginx installations from source or nginx.org
user nginx;
# When you want strict separation from other web services
chown -R nginx:nginx /var/www/myapp;
To switch users safely:
# Stop Nginx first
sudo systemctl stop nginx
# Change ownership if switching users
sudo chown -R www-data:www-data /var/lib/nginx
sudo chown -R www-data:www-data /var/log/nginx
# Update config file
sudo sed -i 's/user nginx;/user www-data;/' /etc/nginx/nginx.conf
# Verify permissions
sudo nginx -t
sudo systemctl start nginx
For most Ubuntu deployments, using www-data
provides better compatibility with:
- System monitoring tools
- Other web services (Apache, PHP-FPM)
- Automated security updates
However, for dedicated Nginx deployments where you need strict process isolation, the nginx
user may be preferable.