Nginx工作进程读取文件失败的核心是确保user指令指定的用户能走通访问路径,需三步:显式配置user nginx nginx;创建系统用户nginx;按最小权限原则设置目录x权限和文件r权限。

Nginx 工作进程读取文件失败,核心不是“加权限”,而是让 `user` 指令指定的用户真正能走通访问路径。关键在三步:明确声明运行身份、创建对应系统用户、按最小权限原则配属主和目录权限。
显式配置 user 指令
打开 /etc/nginx/nginx.conf,在 main 块顶部(注释之后、events 之前)写明:
user nginx nginx;
不要留空、不要注释、不要只写用户名不写组。旧版本 Nginx 对单参数 user 解析不一致,双参数写法可避免歧义。
配置后重载验证:
sudo nginx -t && sudo systemctl reload nginx
再查进程实际运行身份:
ps aux | grep 'nginx: worker' | head -1
UID 列应显示 nginx 用户对应的数字 ID(非 0)。
创建并确认系统用户
若系统中尚无 nginx 用户,需手动创建:
- sudo useradd -r -s /sbin/nologin -M nginx(-r 表示系统用户,-M 不建家目录,-s 禁止登录)
- 确认存在:id nginx 应返回 uid/gid 信息
- 检查是否被其他服务占用同名用户(如 Apache 的 www-data),避免冲突
匹配目录与文件权限
worker 进程只能以 nginx 身份访问资源,所以路径权限必须支持“进入目录 + 读取文件”两个动作:
- 目录必须有 x 权限(否则无法 cd 进入,也就无法读其下文件)
- 文件必须有 r 权限(否则即使路径可达也无法读内容)
- 推荐做法:网站根目录设为 root:nginx,权限 755(即 sudo chown root:nginx /var/www/html && sudo chmod 755 /var/www/html)
- 上传目录等需写入的路径,单独设为 nginx:nginx,权限 750,并禁用脚本执行(如 location ~ \.(php|pl|py|jsp|asp|sh)$ { deny all; })
区分关键路径的权限策略
不同用途路径不能套用同一权限模板:
- 日志目录(如 /var/log/nginx):属主 root:nginx,权限 750 —— 主进程由 root 启动,worker 仅需追加写入日志文件,无需写目录本身
- SSL 私钥(如 /etc/ssl/private/example.key):属主 root:root,权限 600 —— 仅 master 进程读取,worker 不接触
- 临时目录(如 /var/lib/nginx/client_body_temp):属主 nginx:nginx,权限 700 —— worker 需完全控制临时文件生命周期










