温馨提示×

LNMP服务器故障排查步骤

小樊
50
2025-08-31 07:17:26
栏目: 云计算

一、问题确认
收集用户反馈(如“网站无法访问”“页面显示502错误”)、系统告警信息(如邮件/短信通知),明确故障的具体表现、发生时间及受影响的服务范围(如仅静态页面异常、动态PHP页面报错)。这一步是后续排查的基础,需尽可能详细记录信息。

二、系统资源监控
使用top(查看CPU、内存占用排名)、htop(可视化资源监控)、df -h(磁盘空间使用情况)、iostat(磁盘I/O性能)、netstat -tuln(网络端口监听状态)等命令,检查服务器资源是否充足。重点关注:

  • CPU使用率是否长期超过80%(可能导致PHP-FPM或Nginx进程阻塞);
  • 内存是否耗尽(触发OOM Killer杀死关键进程);
  • 磁盘空间是否不足(导致MySQL无法写入日志或Nginx无法缓存);
  • 网络带宽是否饱和(导致请求延迟或超时)。

三、日志分析
查看各组件的错误日志,定位具体故障原因:

  • Nginx/var/log/nginx/error.log(常见错误包括配置语法错误、端口冲突、权限不足、upstream后端服务不可用);
  • PHP-FPM/var/log/php-fpm/error.log(常见错误包括PHP脚本语法错误、内存耗尽、进程管理配置不当,如pm.max_children设置过小导致请求排队);
  • MySQL/var/log/mysql/error.log(常见错误包括数据库启动失败、连接数超过限制、InnoDB缓冲池溢出、慢查询过多)。
    通过日志中的错误信息(如“Permission denied”“Out of memory”“Too many connections”),可快速定位问题根源。

四、网络连通性测试
使用ping(测试服务器与客户端之间的网络连通性)、traceroute(追踪网络路径,定位中间节点故障)、telnet(测试端口是否可达,如telnet localhost 80测试Nginx端口)等命令,排除网络问题。若ping不通,可能是网络线路故障;若telnet端口失败,可能是防火墙或服务未监听该端口。

五、服务进程与服务状态检查

  1. 检查服务运行状态:使用systemctl status nginxsystemctl status mysqlsystemctl status php-fpm命令,确认各服务是否处于“active (running)”状态。若服务未启动,尝试systemctl start命令启动,并观察启动日志(journalctl -xe)中的错误信息。
  2. 检查进程是否存在:使用ps aux | grep nginxps aux | grep php-fpmps aux | grep mysqld命令,确认进程是否在运行。若进程不存在,可能是服务崩溃或未启动。
  3. 检查端口占用:使用netstat -tuln | grep :80(Nginx默认端口)、netstat -tuln | grep :3306(MySQL默认端口),确认端口未被其他进程占用(如端口被占用,可使用kill -9 <PID>终止冲突进程或修改服务端口)。

六、配置文件检查
逐一检查各组件的配置文件,确保语法正确且配置合理:

  • Nginx/etc/nginx/nginx.conf(主配置文件)、站点配置文件(如/etc/nginx/sites-available/default),重点检查listen端口、server_name域名、root根目录路径、fastcgi_pass(指向PHP-FPM的socket或端口,如fastcgi_pass unix:/run/php/php7.4-fpm.sock;)是否正确;
  • PHP-FPM/etc/php-fpm.d/www.conf(池配置文件)、/etc/php.ini(PHP核心配置),重点检查user/group(与Nginx运行用户一致,如www-data)、listen(与Nginx的fastcgi_pass一致)、pm.max_children(根据服务器内存调整,如pm.max_children = (可用内存 - 系统占用) / 单个PHP进程内存)、pm.start_servers(启动时的进程数);
  • MySQL/etc/mysql/my.cnf(或/etc/my.cnf),重点检查bind-address(是否允许远程连接,如0.0.0.0)、max_connections(最大连接数,避免超过服务器承受能力)、innodb_buffer_pool_size(InnoDB缓冲池大小,建议设置为物理内存的50%-75%)。
    修改配置文件后,使用对应命令检查语法(如nginx -tmysql --help | grep "my.cnf"定位配置文件路径后重启服务),确认无语法错误后再重启服务。

七、安全性评估

  1. 检查防火墙设置:使用firewall-cmd --list-all(CentOS)或iptables -L(Ubuntu)查看防火墙规则,确认80(HTTP)、443(HTTPS)端口是否开放。若未开放,使用firewall-cmd --add-service=http --permanentfirewall-cmd --add-service=https --permanent添加规则并firewall-cmd --reload生效。
  2. 检查SELinux状态:使用getenforce命令查看SELinux是否启用(“Enforcing”表示启用)。若启用,可临时设置为permissive模式(setenforce 0)测试是否因SELinux限制导致故障(如Nginx无法读取网站文件),若故障消失,需调整SELinux策略(如chcon -R -t httpd_sys_rw_content_t /var/www/html修改文件上下文)。
  3. 检查用户权限:确认网站文件及目录的权限是否正确(如chown -R www-data:www-data /var/www/htmlchmod -R 755 /var/www/html),避免Nginx或PHP-FPM因权限不足无法访问文件。

八、问题修复与验证
根据排查结果采取相应措施:

  • 若为配置文件语法错误,修正后重启服务(systemctl restart nginxsystemctl restart php-fpmsystemctl restart mysql);
  • 若为端口冲突,修改服务端口并更新防火墙规则;
  • 若为资源不足,升级服务器配置(如增加内存、更换SSD)或优化服务配置(如调整pm.max_childreninnodb_buffer_pool_size);
  • 若为权限问题,修改文件/目录权限或用户组;
  • 若为安全限制(如SELinux),调整SELinux策略。
    修复后,通过访问网站(如http://服务器IP)、查看服务状态(systemctl status)、检查日志(确认无新错误)等方式验证故障是否解决。

九、总结与记录
详细记录故障现象、排查步骤、根本原因及解决方案(如“2025-08-30 14:30 网站无法访问→检查Nginx日志发现502错误→检查PHP-FPM状态发现进程崩溃→调整pm.max_children从50增加到100→重启PHP-FPM后恢复正常”)。记录的内容可作为后续类似故障的参考,提升排查效率。

0