Ubuntu LNMP故障排查方法
一 快速定位流程
- 检查服务状态:依次确认 Nginx、PHP-FPM、MySQL/MariaDB 是否运行,命令示例:sudo systemctl status nginx、sudo systemctl status php7.x-fpm、sudo systemctl status mysql。未运行则启动并观察提示。
- 校验配置语法:Nginx 执行 sudo nginx -t;PHP-FPM 与 MySQL 修改配置后也需校验并按需重载。
- 查看关键日志:优先 tail -f 实时观察错误日志,定位首次报错位置与时间点。
- 端口与连通:确认 80/443 端口监听与防火墙放行;远程访问失败同时排查云安全组/本机防火墙。
- 最小复现:临时切换到静态页面与默认站点配置,逐步恢复自定义配置定位问题层。
以上步骤覆盖“服务状态—配置语法—日志—端口—复现”的闭环排查思路,可快速缩小问题范围。
二 常见故障与处理要点
- Nginx 无法启动或端口被占用:执行 sudo nginx -t 检查语法;用 ss -tulpen | grep ‘:80|:443’ 或 netstat -tulnp | grep 80 查找占用进程并释放端口;修复后 sudo systemctl restart nginx。
- 502/504 Bad Gateway:多为 PHP-FPM 未运行或 fastcgi_pass 不匹配。确认 PHP-FPM 运行,核对 Nginx 中 fastcgi_pass 是 unix:/run/php/php7.x-fpm.sock 还是 127.0.0.1:9000,与 /etc/php/7.x/fpm/pool.d/www.conf 的 listen 一致;重启两者并观察错误日志。
- 403 Forbidden:检查站点根目录与文件权限(Nginx 工作进程用户需可读可执行),以及目录中是否存在 index 指令允许的首页文件。
- 404 Not Found:核对 root 路径、location 匹配与 try_files;PHP 文件需交由 FastCGI 处理而非直接静态返回。
- 数据库连接失败:确认 MySQL 服务运行、应用配置的主机/端口/用户/密码正确;如跨主机访问,放行 3306 端口并确认用户权限主机;本地 socket 连接失败检查 /var/run/mysqld 权限与属主。
- 访问很慢或超时:查看 Nginx 与 PHP-FPM 错误日志、慢请求;对 MySQL 开启并分析慢查询日志定位耗时 SQL。
以上为 LNMP 场景高频问题,配合日志与配置一致性核对通常可快速恢复。
三 日志位置与分析方法
- Nginx:访问日志 /var/log/nginx/access.log,错误日志 /var/log/nginx/error.log。常用命令:tail -f、grep “error”、按时间段或关键字过滤统计,用于定位 4xx/5xx、连接超时、权限等问题。
- PHP-FPM:日志路径因版本与配置而异,常见为 /var/log/php7.x**-fpm.log** 或 /var/log/php-fpm/error.log;也可在 php.ini 中设置 error_log 写入自定义文件。建议开启 log_errors 并避免在生产环境 display_errors。
- MySQL/MariaDB:错误日志默认在数据目录,文件名常为 hostname.err;可在 my.cnf 配置中启用并指定 slow_query_log 与 long_query_time 做性能分析。
- 系统侧:结合 dmesg、/var/log/syslog 观察内核与系统级异常(OOM、磁盘、网络)。
通过“组件日志—关键字—时间段—统计”的组合检索,可迅速定位根因并验证修复效果。
四 配置与权限核对清单
- Nginx:确认 include 的文件路径、server_name、root、index、location ~ .php$ 块与 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;修改后执行 sudo nginx -t && sudo systemctl reload nginx。
- PHP-FPM:核对 /etc/php/7.x/fpm/pool.d/www.conf 中的 listen(如 /run/php/php7.x-fpm.sock)、user/group、pm.max_children 等资源参数;与 Nginx 的 fastcgi_pass 保持一致;变更后重启 PHP-FPM。
- MySQL:核对 /etc/mysql/mysql.conf.d/mysqld.cnf 的 bind-address、datadir、socket 等;远程访问需确保 bind-address 与用户权限正确;变更后重启 MySQL。
- 文件与目录:确保站点目录及上级目录对 Nginx/PHP-FPM 工作用户可读(及可执行),日志目录可写;避免因权限或 SELinux/AppArmor 策略导致拒绝访问。
- 防火墙与云安全组:放行 80/443(以及必要的 3306);变更后复测访问。
以上核对项覆盖“配置一致性—资源与权限—网络策略”,是稳定运行的前提。
五 一键排障命令清单
sudo systemctl status nginx
sudo systemctl status php7.4-fpm
sudo systemctl status mysql
sudo nginx -t && sudo systemctl reload nginx
sudo systemctl restart php7.4-fpm
sudo systemctl restart mysql
ss -tulpen | grep ':80\|:443'
ss -lunpt | grep php-fpm
lsof -i :80
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php7.4-fpm.log
sudo tail -f /var/log/mysql/error.log
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
df -h
dmesg | tail -n 50
cat /var/log/syslog | tail -n 50
将版本号(如 7.4)替换为你的实际 PHP 版本;若使用 TCP 方式连接 PHP-FPM,请将 fastcgi_pass 与 listen 调整为 127.0.0.1:9000 并相应检查端口占用。