温馨提示×

LNMP如何故障排查

小樊
46
2025-11-08 11:15:37
栏目: 编程语言

一、故障排查基础流程

  1. 确定问题症状:收集用户反馈(如网站无法访问、页面加载缓慢、功能异常)和系统告警信息,明确故障范围(是单站点还是全站、是前端还是后端问题)。
  2. 检查系统资源:使用top(查看CPU/内存占用)、df -h(查看磁盘空间)、iostat(查看磁盘I/O)、netstat -tuln(查看网络端口占用)等命令,判断是否因资源耗尽(如内存不足、磁盘满)导致故障。
  3. 分析日志文件:日志是定位故障的核心依据,需重点检查:
    • 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(PHP脚本错误);
    • MySQL:/var/log/mysql/error.log(数据库错误)、/var/log/mysql/slow.log(慢查询日志,定位性能瓶颈)。
  4. 验证服务进程:使用ps aux | grep nginxps aux | grep php-fpmps aux | grep mysql确认服务进程是否运行;用systemctl status nginxsystemctl status php-fpmsystemctl status mysql(或service命令)检查服务状态,若进程未启动则尝试重启。
  5. 检查配置文件:逐一验证关键配置文件的正确性:
    • Nginx:nginx -t(测试配置语法,如nginx.conf、站点虚拟主机配置);
    • PHP-FPM:php-fpm -t(测试php-fpm.confpool.d/www.conf中的listen地址、pm.max_children等参数);
    • MySQL:mysqld --validate-config(验证my.cnf配置,如端口、数据目录路径);
      确保无语法错误或路径冲突。
  6. 测试网络连通性:使用ping(测试服务器与客户端网络连通性)、traceroute(追踪路由路径)、telnet <IP> <端口>(如telnet 127.0.0.1 9000测试PHP-FPM端口)或nc -zv <IP> <端口>,排除网络阻断或端口未开放问题。
  7. 排查安全设置:检查防火墙(iptables -Lfirewall-cmd --list-all)是否放行Nginx(80/443端口)、PHP-FPM(默认9000端口)的流量;若启用SELinux,用getenforce查看状态,临时关闭setenforce 0测试是否因SELinux策略导致故障。

二、常见故障及解决方法

  1. 502 Bad Gateway错误
    • 原因:Nginx无法连接到PHP-FPM(最常见)、PHP-FPM进程耗尽、权限不匹配。
    • 解决:① 确认Nginx配置中的fastcgi_pass与PHP-FPM的listen地址一致(如fastcgi_pass unix:/tmp/php-fpm.sock;对应PHP-FPM的listen = /tmp/php-fpm.sock);② 调整PHP-FPM的pm.max_children(如根据服务器内存计算:可用内存/单个PHP进程内存≈进程数,如1GB内存可设为20-30);③ 确保Nginx用户(如www-data)与PHP-FPM的listen.owner/listen.group一致,且网站目录权限为755(文件644)。
  2. PHP脚本错误(白屏/500错误)
    • 原因:PHP代码语法错误、未开启错误显示。
    • 解决:① 在PHP脚本顶部添加error_reporting(E_ALL); ini_set('display_errors', 1);,临时显示错误信息;② 检查/var/log/php-fpm/www-error.log中的具体错误(如未定义函数、文件路径错误);③ 修改php.ini中的display_errors = Onlog_errors = On,重启PHP-FPM使设置生效。
  3. MySQL无法启动
    • 原因:配置文件错误、数据目录权限问题、端口冲突。
    • 解决:① 用mysqld --validate-config测试配置文件语法;② 检查MySQL数据目录(如/var/lib/mysql)权限,确保MySQL用户(如mysql)有读写权限(chown -R mysql:mysql /var/lib/mysql);③ 用netstat -tuln | grep 3306检查端口是否被占用,若被占用则修改my.cnf中的port或停止占用进程。
  4. Nginx无法启动
    • 原因:配置文件语法错误、端口被占用、文件权限问题。
    • 解决:① 运行nginx -t检查配置文件(如nginx.conf中的server_nameroot路径是否正确);② 用netstat -tuln | grep 80检查80端口是否被其他服务(如Apache)占用;③ 确保Nginx配置文件(如/etc/nginx/nginx.conf)和日志文件(如/var/log/nginx/error.log)有正确的读写权限(chown -R root:root /etc/nginxchmod -R 755 /var/log/nginx)。
  5. 资源耗尽(高CPU/内存占用)
    • 原因:PHP-FPM进程数过多、MySQL查询慢、Nginx并发过高。
    • 解决:① 调整PHP-FPM的pm.max_children(如从30调整为20,减少进程数);② 优化MySQL查询(用EXPLAIN分析慢查询,添加索引);③ 调整Nginx的worker_processes(设为CPU核心数,如worker_processes 4)、worker_connections(设为1024,提高并发连接数)。

0