Ubuntu 上 Nginx 出现 502 的排查与修复
一、快速定位
sudo tail -f /var/log/nginx/error.log,优先寻找关键词:connect() failed (111: Connection refused)、upstream timed out (110: Connection timed out)、Permission denied。这些分别对应上游未启动/不通、超时、权限问题。sudo nginx -t,确保修改后配置无语法错误。sudo systemctl status php8.1-fpm(版本号按实际),必要时 sudo systemctl restart php8.1-fpm。ss -lntp | grep :9000 或 curl http://127.0.0.1:9000;若用 Unix socket,确认文件存在且权限正确。sudo ufw status、sudo iptables -L -n,确保 9000 或对应端口开放。二、PHP-FPM 专项排查与修复
fastcgi_pass 127.0.0.1:9000;fastcgi_pass unix:/run/php/php8.1-fpm.sock;(路径随版本/发行版可能不同)。listen = /run/php/php8.1-fpm.socklisten.owner = www-data、listen.group = www-data、listen.mode = 0660ss -lntp | grep :9000;若使用 socket,确认文件存在且属主为 www-data。sudo systemctl restart php8.1-fpm && sudo systemctl reload nginx。三、反向代理场景的要点(Node.js、Tomcat、Gunicorn 等)
proxy_pass http://127.0.0.1:3000;proxy_set_header Host $host;proxy_connect_timeout 60s;、proxy_read_timeout 60s;四、权限与安全模块
sudo chown -R www-data:www-data /var/www/htmlfind /var/www/html -type d -exec chmod 755 {} \;find /var/www/html -type f -exec chmod 644 {} \;dmesg | grep apparmorsudo ln -s /etc/apparmor.d/usr.sbin.php-fpm /etc/apparmor.d/disable/ && sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.php-fpmsetenforce 0 做排查(生产环境慎用)。五、常见现象与对应修复对照表
| 现象与日志关键词 | 可能原因 | 快速修复 |
|---|---|---|
connect() failed (111: Connection refused) |
上游未启动/端口不对 | 启动上游(如 systemctl start php8.1-fpm),核对 fastcgi_pass 或 proxy_pass 地址与端口 |
upstream timed out (110: Connection timed out) |
上游响应慢/超时过短 | 增加 proxy_read_timeout 或 FastCGI 超时;优化上游性能 |
Permission denied |
文件/目录或 socket 权限不对 | chown www-data:www-data、chmod 755/644;核对 listen.mode=0660 |
No such file or directory(FastCGI) |
SCRIPT_FILENAME 或 root 路径错误 |
修正 root 与 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
no live upstreams while connecting to upstream |
upstream 列表为空/后端全挂 | 检查 upstream 配置与后端健康状态 |
| 高并发间歇 502 | 进程数不足/内存不足 | 调大 pm.max_children,提升 memory_limit,必要时扩容 |
以上条目覆盖了 连接被拒绝、超时、权限、配置路径、上游不可用、资源不足 等典型场景。