You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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启动,我们需要自定义服务配置来指定运行用户:

  1. 复制默认服务文件到自定义目录(避免系统更新覆盖):
sudo cp /lib/systemd/system/nginx.service /etc/systemd/system/nginx.service
  1. 编辑自定义服务文件,添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:42:29