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 用户必须匹配或同组

修复三种思路:

  1. 改 socket 属主(在上游应用的配置里,如 php-fpm 的 listen.owner / listen.group):
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
  1. 把 Nginx 用户加进 socket 属组:usermod -aG www-data nginx(视发行版用户名而定)
  2. 检查 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 连接拒绝的通用修复。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台