Ubuntu 16.04下以非Root非Sudo用户运行Nginx的方法
如何在Ubuntu 16.04以非Root/非Sudo用户运行Nginx
我完全理解你的顾虑——用Root身份在80端口跑Nginx确实存在不小的安全风险,而且非特权端口的配置确实容易踩坑。你目前的问题在于:你修改的nginx.conf只是让Nginx的worker进程切换到nginxuser,但systemd默认还是以Root身份启动Nginx的主进程,所以执行service nginx start才会要求认证。要实现全程以非特权用户运行,得从systemd配置和目录权限两方面入手:
步骤1:确保nginxuser拥有Nginx所需目录的权限
Nginx需要读写日志、临时文件和PID文件目录,先把这些权限给nginxuser:
# 修改日志目录权限 sudo chown -R nginxuser:nginxuser /var/log/nginx # 修改临时文件目录权限 sudo chown -R nginxuser:nginxuser /var/lib/nginx # 如果PID文件已存在,先停掉Nginx再修改权限 sudo systemctl stop nginx sudo chown nginxuser:nginxuser /run/nginx.pid
如果/run目录重启后会重置PID文件权限,可以把PID文件路径改到nginxuser的家目录:
在/etc/nginx/nginx.conf里修改:
pid /home/nginxuser/nginx.pid;
步骤2:修改Nginx的Systemd服务配置
Ubuntu 16.04的Nginx默认systemd服务会以Root启动,我们需要自定义服务配置来指定运行用户:
- 复制默认服务文件到自定义目录(避免系统更新覆盖):
sudo cp /lib/systemd/system/nginx.service /etc/systemd/system/nginx.service
- 编辑自定义服务文件,添加
User和Group字段:
[Service] # 新增以下两行,指定运行用户和组 User=nginxuser Group=nginxuser # 原有内容保留,确保ExecStart指向正确的Nginx二进制路径 ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload # 如果你改了PID文件路径,同步修改这里的PIDFile # PIDFile=/home/nginxuser/nginx.pid
步骤3:重新加载Systemd并启动Nginx
# 重新加载systemd配置 sudo systemctl daemon-reload # 启动Nginx,此时主进程和worker进程都会以nginxuser运行 sudo systemctl start nginx
如果你不想用sudo启动,可以直接切换到nginxuser手动启动:
su - nginxuser /usr/sbin/nginx # 停止时执行 /usr/sbin/nginx -s stop
验证运行状态
执行以下命令确认所有Nginx进程都属于nginxuser:
ps aux | grep nginx
输出里的主进程(nginx: master process)和worker进程(nginx: worker process)的用户列都应该是nginxuser。
后续iptables端口转发
要让用户访问80端口转发到1025,执行:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 1025 # 保存规则,重启后生效 sudo iptables-save > /etc/iptables/rules.v4
内容的提问来源于stack exchange,提问作者Dr. Phil
相关产品推荐
相关产品推荐

