温馨提示×

ubuntu lnmp故障排查方法

小樊
34
2025-12-24 03:32:47
栏目: 智能运维

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_loglong_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);变更后复测访问。
    以上核对项覆盖“配置一致性—资源与权限—网络策略”,是稳定运行的前提。

五 一键排障命令清单

# 1) 服务状态
sudo systemctl status nginx
sudo systemctl status php7.4-fpm   # 按实际版本调整
sudo systemctl status mysql

# 2) 配置语法与重载
sudo nginx -t && sudo systemctl reload nginx
sudo systemctl restart php7.4-fpm
sudo systemctl restart mysql

# 3) 端口与进程
ss -tulpen | grep ':80\|:443'
ss -lunpt | grep php-fpm
lsof -i :80

# 4) 实时日志
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

# 5) 防火墙
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 6) 磁盘与系统
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 并相应检查端口占用。

0