温馨提示×

LNMP故障如何排查

小樊
38
2025-10-28 18:57:43
栏目: 编程语言

一、故障确认:明确问题边界
首先收集用户反馈(如“网站无法访问”“页面显示502错误”)和系统告警信息(如邮件、短信告警),确定故障的具体表现(如服务不可用、功能异常、性能下降)及受影响的组件(Nginx、MySQL、PHP或网络)。这一步是后续排查的基础,避免盲目操作。

二、系统资源检查:排除资源瓶颈
使用top(查看CPU、内存占用排名)、htop(更直观的资源监控)、df -h(磁盘空间使用情况)、iostat -x 1(磁盘I/O负载)、netstat -s(网络流量统计)等命令,检查系统资源是否充足。常见资源瓶颈包括:

  • CPU占用过高(如PHP-FPM进程占用100% CPU);
  • 内存耗尽(导致系统频繁使用swap分区);
  • 磁盘空间不足(无法写入日志或数据库文件)。
    若资源耗尽,需优化服务配置(如增加服务器资源、调整PHP-FPM进程数)或清理无用文件。

三、日志分析:定位问题根源
查看LNMP组件的错误日志,这是排查故障的关键线索:

  • Nginx:错误日志通常位于/var/log/nginx/error.log,记录HTTP请求错误(如404、500)、SSL配置错误、upstream连接失败等;
  • PHP-FPM:错误日志通常位于/var/log/php-fpm/error.log,记录PHP代码语法错误、数据库连接失败、超时等问题;
  • MySQL:错误日志通常位于/var/log/mysql/error.log(或/var/log/mysqld.log),记录数据库启动失败、表损坏、查询超时等;
  • 慢查询日志:若需分析数据库性能问题,可开启慢查询日志(slow_query_log = ONlong_query_time = 2),定位执行缓慢的SQL语句。

四、服务进程检查:确认服务状态
使用以下命令检查LNMP服务是否正常运行:

  • systemctl status nginx:查看Nginx服务状态(是否处于active (running));
  • systemctl status php-fpm:查看PHP-FPM服务状态(是否处于running);
  • systemctl status mysql:查看MySQL服务状态(是否处于active (running));
  • ps aux | grep nginx:检查Nginx进程是否存在;
  • ps aux | grep php-fpm:检查PHP-FPM进程是否存在(通常有多个worker进程);
  • netstat -tuln | grep ':80\|:443':检查Nginx监听端口是否正常(80/443端口是否处于LISTEN状态)。
    若服务未运行,尝试重启服务(systemctl restart nginx),并查看重启日志(journalctl -xe)获取失败原因。

五、配置文件检查:修正配置错误
检查LNMP组件的配置文件,确保语法正确且配置合理:

  • Nginx:使用nginx -t命令测试配置文件语法(如/etc/nginx/nginx.conf/etc/nginx/sites-available/default),重点检查server_nameroot(网站根目录)、fastcgi_pass(PHP-FPM监听地址,如unix:/run/php/php7.4-fpm.sock127.0.0.1:9000)等配置;
  • PHP-FPM:使用php-fpm -t命令测试配置文件语法(如/etc/php/7.4/fpm/php-fpm.conf/etc/php/7.4/fpm/pool.d/www.conf),重点检查listen(监听地址)、pm.max_children(最大子进程数,需根据服务器内存调整,如pm.max_children = 50表示最多启动50个PHP进程)、user/group(进程属主,通常为www-datanobody)等配置;
  • MySQL:检查my.cnf/etc/my.cnf/etc/mysql/my.cnf)配置,重点检查bind-address(监听地址,如0.0.0.0允许远程访问)、max_connections(最大连接数,避免连接数耗尽)、innodb_buffer_pool_size(InnoDB缓冲池大小,建议设置为物理内存的50%-70%)等配置。

六、网络连通性测试:排除网络问题
使用以下命令测试网络连通性:

  • ping <目标IP>:检查服务器与目标设备(如数据库服务器、客户端)之间的网络是否可达;
  • traceroute <目标IP>:跟踪数据包路由路径,定位网络中断点;
  • telnet <目标IP> <端口>:测试目标端口是否开放(如telnet 127.0.0.1 9000测试PHP-FPM端口是否可达);
  • netstat -tuln | grep <端口>:检查端口是否被其他进程占用(如Nginx和PHP-FPM均监听80端口会导致冲突)。
    若网络不通,需检查防火墙(iptables -L)、SELinux(getenforce)或路由器配置,确保必要端口(80、443、3306、9000)开放。

七、权限与安全检查:避免权限问题

  • 文件/目录权限:确保Nginx用户(通常为www-datanobody)对网站根目录、日志目录有读取权限(如chown -R www-data:www-data /var/www/htmlchmod -R 755 /var/www/html);
  • SELinux:若启用SELinux(getenforce返回Enforcing),需调整SELinux策略(如setsebool -P httpd_can_network_connect_db 1允许Nginx连接数据库);
  • 防火墙:使用iptables -Lfirewall-cmd --list-all检查防火墙规则,确保放行Nginx(80、443端口)、MySQL(3306端口)、PHP-FPM(9000端口)的流量。

八、常见问题针对性解决

  • 502 Bad Gateway:常见原因包括PHP-FPM未运行、fastcgi_pass配置错误、pm.max_children过小(进程数不足导致无法处理请求)。解决方法:重启PHP-FPM(systemctl restart php-fpm)、修正fastcgi_pass路径、调整pm.max_children(如根据服务器内存计算:可用内存/单个PHP进程内存≈pm.max_children);
  • 500 Internal Server Error:通常由PHP代码语法错误、权限问题或配置错误导致。解决方法:查看PHP错误日志(/var/log/php-fpm/error.log),修复代码错误(如缺少分号、括号不匹配),确保Nginx用户有权限访问网站文件;
  • 403 Forbidden:常见原因是Nginx配置中的deny规则或权限不足。解决方法:检查Nginx配置中的location块(如deny all;是否误用),确保Nginx用户对网站目录有读取权限;
  • MySQL启动失败:可能原因包括配置文件错误、数据目录权限问题、端口冲突。解决方法:检查my.cnf语法(mysql --help | grep "my.cnf"定位配置文件路径)、修正数据目录权限(chown -R mysql:mysql /var/lib/mysql)、检查端口是否被占用(netstat -tuln | grep 3306)。

0