温馨提示×

LNMP故障排查实战技巧

小樊
43
2025-11-16 09:50:13
栏目: 编程语言

LNMP故障排查实战技巧

一、快速定位流程

  • 明确症状与影响范围:记录时间、URL/接口、错误码、用户地域,同步收集监控指标(CPU、内存、磁盘IO、网络带宽)。
  • 检查系统资源:用top/htop、vmstat、iostat定位是否资源耗尽(如CPU飙升、内存打满、磁盘满、IO等待高)。
  • 查看关键日志:优先看Nginx error.log、PHP-FPM error.log、MySQL error.log,必要时结合access.log与慢查询日志还原现场。
  • 验证服务进程与端口:用ps、top、netstat确认Nginx、PHP-FPM、MySQL是否在运行并监听正确端口。
  • 校验配置与语法:执行nginx -t、php-fpm -t,必要时用mysql --validate-config验证配置合法性。
  • 网络连通性:用ping、traceroute、telnet排查内外网与端口可达性,确认防火墙/安全组未阻断。
  • 安全与变更审计:核对安全日志、用户权限、防火墙规则,排查异常登录与配置篡改。
  • 修复与优化:按根因调整进程数、缓存、SQL、连接等,并做好备份与回滚预案
  • 记录与复盘:沉淀问题-原因-修复-优化闭环,便于后续快速处置。

二、高频故障与对策

症状 快速检查 常见根因 修复建议
502 Bad Gateway 看Nginx error.log是否提示“connect() to unix:/run/php/… failed”或“Connection refused”;确认PHP-FPM是否存活 fastcgi_pass指向错误;PHP-FPM未启动;进程数不足;权限/套接字问题 修正fastcgi_pass;启动PHP-FPM;调大pm.max_children;统一Nginx与PHP-FPM运行用户;检查listen.owner/group与目录权限
Nginx无法启动 执行nginx -t;netstat查80/443是否被占用 配置语法错误;端口冲突;依赖未起 修正配置并reload;释放或更换端口;确保依赖服务已启动
403 Forbidden 查看Nginx error.log“Permission denied”;ls -l检查目录/文件属主与权限 目录/文件权限或属主错误;SELinux/防火墙策略限制 将网站目录设为www-data:www-data 755/644;按需调整SELinux/防火墙策略
PHP错误不显示 检查php.ini的error_log与PHP-FPM日志;确认display_errors在开发环境开启 错误被记录但未展示;日志路径错误 开启display_errors(仅开发环境);修正error_log路径并赋权;tail -f实时观察日志
MySQL无法启动 查看/var/log/mysql/error.log或/var/log/mariadb/error.log;检查数据目录权限与端口 配置错误;数据目录权限错误;端口冲突;磁盘满 校验配置;chown -R mysql:mysql /var/lib/mysql;释放或更换3306端口;清理磁盘
连接MySQL失败 telnet 主机 3306;核对用户host白名单 监听地址/端口不对;用户host限制;防火墙阻断 修正my.cnf监听;调整用户host;放行3306端口
网站访问慢 top/htop、iostat、MySQL慢查询日志 PHP慢脚本;SQL未优化;连接瓶颈;磁盘IO高 优化代码与SQL;增加缓存;调优连接与缓冲池;排查磁盘IO与慢盘

三、关键命令与日志路径速查

  • 服务状态与启停
    • 检查:systemctl status nginx / mysql / php-fpm
    • 启动/重启:systemctl start|restart nginx / mysql / php-fpm
  • 配置语法校验
    • Nginx:nginx -t
    • PHP-FPM:php-fpm -t
    • MySQL:mysql --validate-config
  • 端口与进程
    • 端口占用:netstat -tulpen | grep -E ‘(:80|:443|:3306)’
    • 进程查看:ps aux | grep -E ‘nginx|php-fpm|mysqld’
  • 日志路径(不同发行版可能略有差异)
    • Nginx:/var/log/nginx/error.log、/var/log/nginx/access.log
    • PHP-FPM:/var/log/php-fpm/error.log、/var/log/php-fpm/www-error.log(或按版本路径如**/var/log/php/7.x/fpm/error.log**)
    • MySQL:/var/log/mysql/error.log(或**/var/log/mariadb/error.log**)
  • 权限与属主(以www-data为例)
    • 目录:chown -R www-data:www-data /var/www/html
    • 权限:find /var/www/html -type d -exec chmod 755 {} ;;find /var/www/html -type f -exec chmod 644 {} ;

四、实战排障最小闭环

  • 第1步:复现与定位
    • 记录时间/URL/状态码;执行tail -f /var/log/nginx/error.log观察最新错误。
  • 第2步:服务与端口
    • 确认Nginx、PHP-FPM、MySQL均active;用netstat排查80/443/3306端口占用与冲突。
  • 第3步:配置与语法
    • 依次执行nginx -t、php-fpm -t、(可选)mysql --validate-config,修正语法后再reload。
  • 第4步:权限与用户
    • 统一Nginx/PHP-FPM运行用户(如www-data),校正网站目录属主与权限,避免“Permission denied”。
  • 第5步:数据库与网络
    • mysql -h 127.0.0.1 -P 3306 -u user -p测试本地连接;必要时telnet 目标IP 3306验证网络与防火墙。
  • 第6步:优化与验证
    • 针对根因优化(如调pm.max_children、优化慢SQL、开启缓存),变更后灰度发布并持续观察日志与监控。

五、预防与优化建议

  • 建立基线监控与告警:覆盖CPU、内存、磁盘IO、网络、连接数、慢查询等关键指标,异常即告警。
  • 规范配置与版本管理:变更前备份,修改后nginx -t/php-fpm -t校验,成功后reload而非粗暴restart。
  • 加固安全策略:最小权限运行服务,定期审计防火墙/SELinux与用户权限,避免弱口令与暴露面。
  • 做好日志治理:为Nginx、PHP-FPM、MySQL配置合适的保留周期与轮转,防止磁盘被日志打满。
  • 持续SQL与代码优化:建立慢查询基线,合理使用索引与缓存,减少阻塞与长事务。

0