Nginx 报错 (13: Permission denied) 连接上游失败怎么解决
Nginx 连接上游被拒绝时,区分 Unix socket 路径权限与 SELinux/AppArmor 等策略。先核对用户、目录和审计证据,再最小化授权,不盲目放宽权限。
一句话回答:Nginx 连不上上游分两种情况:走 Unix socket(如 fastcgi_pass unix:/run/php-fpm.sock)——socket 文件属主/权限不对,让 Nginx 运行用户(www-data/nginx)能读写即可;走 TCP 端口(proxy_pass http://127.0.0.1:3000)——需检查 SELinux/AppArmor 等强制访问控制与网络策略,结合审计日志确认拒绝原因再最小化授权。
场景一:Unix socket 权限
错误日志形如:connect() to unix:/var/run/app.sock failed (13: Permission denied)
# 看 socket 属主与权限
ls -l /var/run/php-fpm.sock
# srw-rw---- 1 www-data www-data ... → Nginx 用户必须匹配或同组
修复三种思路:
- 改 socket 属主(在上游应用的配置里,如 php-fpm 的
listen.owner/listen.group):
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
- 把 Nginx 用户加进 socket 属组:
usermod -aG www-data nginx(视发行版用户名而定) - 检查 socket 路径各级目录的执行权限与 SELinux 标签;不使用
chmod 666/777扩大访问范围
注意 socket 所在目录也要有执行权限(只给实际需要访问的服务用户或组授权)。
场景二:TCP 上游被 SELinux 拦截
错误日志形如:connect() to 127.0.0.1:3000 failed (13: Permission denied),且 curl 直连 3000 端口正常——权限错误只发生在 Nginx 身上,这是 SELinux 的典型指纹。
# 确认 SELinux 状态
getenforce # Enforcing 只是状态,不足以证明它是根因
sudo ausearch -m AVC -ts recent
# 仅在审计确认 httpd 域网络连接被拒、并批准该权限时使用
# 此布尔值允许较广泛网络连接;先评估本机策略与更窄的代理权限
sudo setsebool -P httpd_can_network_connect 1
审计日志里能看到明确记录:ausearch -m avc -ts recent | grep nginx。
场景三:网络命名空间/容器
Docker/K8s 里 Nginx 与上游不在同一网络命名空间时,localhost 指向容器自己——表现为 connection refused 而非 permission denied,但排查思路类似:确认上游地址在 Nginx 的视角里真实可达。
验证修复
nginx -t && sudo systemctl reload nginx
curl -I http://你的站点 # 不再 502
tail -f /var/log/nginx/error.log
关键接口修复后,可在观测云配置 HTTP 拨测,选择能访问该地址的节点并设置预期状态码,持续检查是否再次出现 502。若再次失败,按拨测时间回查 Nginx 错误日志和 SELinux 审计记录。
常见问题(FAQ)
Q:socket 权限改了,重启 php-fpm 后又坏了?
A:socket 是服务启动时重建的,手工 chmod 不持久。必须改服务配置里的 listen.owner/mode(php-fpm)或 systemd unit 的 SocketMode,让权限随启动自动正确。
Q:setsebool 后重启失效?
A:漏了 -P(persistent)。不带 -P 的 setsebool 只改运行时,重启还原。
Q:Docker 里的 Nginx 报这个错怎么解?
A:容器进程仍受宿主机 SELinux 等策略约束。检查宿主 AVC、实际域标签、挂载标签与网络策略;:z/:Z 只处理卷标签,不是 TCP 连接拒绝的通用修复。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。
- docs.redhat.com:setting up and configuring nginx deploying web servers and reverse proxies
- docs.guance.com:http
- docs.guance.com:synthetic test detection