Ubuntu LNMP网络故障排查流程
一 故障定位与基础检查
- 明确现象与范围:记录出现时间、访问域名/IP、端口(80/443)、错误码(如502/504/403/404)、是否仅内网或公网异常,便于缩小排查面。
- 检查服务状态:确认 Nginx、PHP-FPM、MySQL/MariaDB 处于运行状态,必要时查看自启动与重启结果。
- 资源与系统健康:用 top/htop、df -h、dmesg、/var/log/syslog 排查 CPU/内存/磁盘/内核/系统日志 异常,避免因资源耗尽或只读文件系统导致网络与应用异常。
- 版本与变更:核对 Ubuntu、Nginx、PHP、MySQL 版本与最近变更(上线、配置、包更新、云安全组/本机防火墙调整)。
二 网络连通性与访问控制
- 本机网络与接口:用 ip addr、ip link 确认网卡 UP 且 IP 正确;必要时启用接口并排查链路/驱动。
- 外连与路径:用 ping 测连通性,用 traceroute 定位在哪一跳异常;对外域名用 nslookup/dig 检查 DNS 解析是否正确。
- 端口与监听:用 ss -tulpen | grep -E ‘:(80|443|9000)’ 或 netstat -tulnp | grep -E ‘:(80|443|9000)’ 确认 Nginx(80/443)、PHP-FPM(9000 或 socket) 处于监听;若端口被占用,处理冲突进程。
- 防火墙与安全组:在 UFW 放行 80/443(如:ufw allow 80,443/tcp),云服务器同时检查 安全组/NACL 规则;数据库端口(如 3306)仅内网放通。
- 本机到本机连通性:用 curl -I http://127.0.0.1 与 curl -I http://服务器IP 对比,判断是 Nginx 问题还是外部访问链路问题;远程可用 telnet 服务器IP 80 或 openssl s_client -connect 域名:443 验证端口可达与 TLS 握手。
三 组件与配置专项排查
- Nginx:执行 nginx -t 校验配置;查看 /var/log/nginx/error.log 与 access.log 定位 403/404/502/504 等错误;确认 server_name、root、location ~ .php$ 存在且包含 fastcgi_pass(与 PHP-FPM 的监听方式一致:如 127.0.0.1:9000 或 unix:/run/php/phpX.Y-fpm.sock)。
- PHP-FPM:确认服务运行;核对 /etc/php/ 版本目录与 pool.d/www.conf 的 listen(端口或 socket)、用户组与权限;查看 /var/log/php-fpm/error.log 或 /var/log/phpX.Y-fpm.log 的解析与权限报错。
- MySQL/MariaDB:确认服务运行;检查 /var/log/mysql/error.log;验证应用侧 主机、端口、用户名、密码、权限 是否正确;仅内网开放 3306,避免公网直连。
- 常见错误对照:
- 502 Bad Gateway:多为 PHP-FPM 未启动/崩溃/监听不一致/资源耗尽;检查 PHP-FPM 状态与日志,核对 fastcgi_pass 一致性,必要时调优 pm.max_children 等。
- 504 Gateway Timeout:多为 PHP 执行超时/慢查询/后端阻塞;优化代码与查询、调整 fastcgi_read_timeout/fastcgi_send_timeout,并排查数据库慢查询。
- 403 Forbidden:多为 目录无索引、权限/SELinux/ACL 限制;检查 index 指令、目录权限与 Nginx/系统安全策略。
- 404 Not Found:多为 root 路径错误、location 匹配不当;核对 root 与 try_files。
- PHP 页面空白/下载:多为 Nginx 未把 .php 交给 FastCGI、PHP-FPM 未运行 或 解析器配置错误;核对 location ~ .php$ 与 PHP-FPM 监听。
四 快速排查命令清单
- 服务与配置:
- systemctl:status/restart/reload nginx、phpX.Y-fpm、mysql/mariadb
- 校验:nginx -t;按需检查 PHP-FPM 配置语法
- 监听与占用:
- ss/netstat:ss -tulpen | grep -E ‘:(80|443|9000)’
- lsof:lsof -iTCP:80 -sTCP:LISTEN
- 连通与解析:
- ping、traceroute、nslookup/dig
- 本机/远程:curl -I http://127.0.0.1,curl -I http://服务器IP,telnet 服务器IP 80,openssl s_client -connect 域名:443
- 日志:
- Nginx:/var/log/nginx/error.log、/var/log/nginx/access.log
- PHP-FPM:/var/log/php-fpm/error.log 或 /var/log/phpX.Y-fpm.log
- MySQL:/var/log/mysql/error.log
- 系统:dmesg、/var/log/syslog
- 资源与磁盘:
- top/htop、df -h、du -sh /var/log
五 一键最小化自检脚本
- 说明:将脚本保存为 check_lnmp.sh,执行 bash check_lnmp.sh。它会依次检查服务、端口、连通、Nginx/PHP-FPM 配置与日志可达性,并给出下一步建议。
#!/usr/bin/env bash
set -Eeuo pipefail
echo "=== [1/6] 服务状态 ==="
for svc in nginx php*-fpm mysql; do
if systemctl is-active --quiet "$svc"; then
echo "✔ $svc: running"
else
echo "✖ $svc: not running (systemctl status $svc)"
fi
done
echo -e "\n=== [2/6] 关键端口监听 ==="
for p in 80 443 9000; do
if ss -tulpen | grep -q ":$p "; then
echo "✔ 端口 $p: 监听中"
else
echo "✖ 端口 $p: 未监听"
fi
done
echo -e "\n=== [3/6] 本机访问 ==="
curl -fsI http://127.0.0.1/ | head -n1 || echo "✖ 127.0.0.1 访问失败"
echo -e "\n=== [4/6] 配置语法 ==="
nginx -t && echo "✔ Nginx 配置 OK" || echo "✖ Nginx 配置有误"
echo -e "\n=== [5/6] 日志与目录 ==="
for f in /var/log/nginx/error.log /var/log/php*-fpm.log /var/log/mysql/error.log; do
if [ -r "$f" ]; then
echo "✔ 可读: $f"
else
echo "✖ 不可读/不存在: $f"
fi
done
echo -e "\n=== [6/6] 防火墙与安全组提示 ==="
if command -v ufw >/dev/null 2>&1; then
ufw status verbose || echo "✖ 无法获取 UFW 状态"
else
echo "ℹ UFW 未安装"
fi
echo "ℹ 如在外网访问异常,请同时检查云平台安全组/NACL 是否放行 80/443"
echo -e "\n建议:若本机能访问而外网不能,优先检查 云安全组/本机防火墙、Nginx 监听地址与 server_name、以及端口占用与监听方式一致性。"
- 若脚本提示某项异常,按对应日志与服务项回溯上一节的处理建议即可。