源码安装Nginx必须显式配置专用非root用户运行worker进程,主进程以root绑定80/443端口,worker降权为nginx用户处理请求、读写文件和日志;编译时需加--user=nginx --group=nginx参数,并在nginx.conf全局块顶部写入user nginx nginx;,创建无登录用户useradd -r -s /sbin/nologin nginx,验证ps进程身份及文件权限。
源码安装的 Nginx 必须显式配置专用非 root 用户运行 worker 进程,否则默认以 nobody 或 root 启动,存在严重提权风险。关键不是“能不能用非 root 启动”,而是“是否真正隔离了主进程与 worker 的权限边界”——主进程需 root 绑定 80/443,worker 必须降权为专用用户执行请求处理、文件读写和日志写入。
在 ./configure 阶段就应固化用户信息,避免后期配置遗漏:
./configure
--prefix=/opt/nginx
--conf-path=/opt/nginx/conf/nginx.conf
--pid-path=/opt/nginx/logs/nginx.pid
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_v2_module
即使 configure 指定了 user,nginx.conf 全局块顶部仍必须显式写入 user 指令,否则不生效:
user nginx nginx;
专用用户不是可选步骤,而是强制闭环的一环:
useradd -r -s /sbin/nologin nginx
id nginx(应返回 uid/gid)
passwd -S nginx(应显示 LK 表示锁定)
chown -R nginx:nginx /opt/nginx
仅改配置不等于生效,必须通过进程树确认:
– 一行以 root 开头的 master process
– 多行以 nginx(或你指定用户名)开头的 worker process
若全是 nobody → 用户不存在或 user 指令未命中
若显示用户名但无法启动 → 检查 /etc/passwd 中 shell 是否为 /sbin/nologin(合法)
sudo -u nginx ls /opt/nginx/conf(应可读)
sudo -u nginx touch /tmp/test(应允许,说明上下文切换正常)