LNMP故障排查步骤
导读:一、问题确认与信息收集 首先明确故障现象(如网站无法访问、502/500错误、性能卡顿等),收集用户反馈的具体时间及受影响功能;同时查看系统告警信息(如邮件、短信通知)和监控工具(如Zabbix、Prometheus)的异常记录,初步定位故...
一、问题确认与信息收集
首先明确故障现象(如网站无法访问、502/500错误、性能卡顿等),收集用户反馈的具体时间及受影响功能;同时查看系统告警信息(如邮件、短信通知)和监控工具(如Zabbix、Prometheus)的异常记录,初步定位故障范围。
二、系统基础状态检查
- 资源使用分析:使用
top
(按CPU排序)、htop
(更直观的资源监控)、df -h
(磁盘空间)、free -m
(内存使用)、iostat -x 1
(磁盘I/O)等命令,检查CPU、内存、磁盘、网络等资源是否耗尽(如内存占用超过80%、磁盘空间不足10%)。 - 版本兼容性确认:通过
uname -r
(Linux内核版本)、nginx -v
(Nginx版本)、mysql -V
(MySQL版本)、php -v
(PHP版本),确认各组件版本兼容(如Nginx 1.25+与PHP 8.2+的FastCGI协议兼容性)。
三、日志深度分析(核心步骤)
日志是故障定位的关键,需重点检查以下日志的最近10-20条错误记录:
- Nginx错误日志:默认路径为
/var/log/nginx/error.log
(可通过nginx -V
查看自定义路径),主要关注连接拒绝、超时、权限问题(如connect() to unix:/tmp/php-fpm.sock failed (13: Permission denied)
)。 - PHP-FPM错误日志:默认路径为
/var/log/php-fpm.log
或/var/log/php7.4-fpm.log
(取决于PHP版本),主要关注脚本语法错误、进程崩溃(如WARNING: [pool www] child 1234 exited on signal 11 (SIGSEGV) after 10.234 seconds from start
)。 - MySQL错误日志:默认路径为
/var/log/mysql/error.log
或/var/log/mariadb/error.log
,主要关注启动失败、连接数超限、慢查询(如ERROR 1045 (28000): Access denied for user 'root'@'localhost'
)。 - 系统日志:使用
journalctl -xe
(Systemd系统)或tail -f /var/log/messages
,查看内核级错误(如OOM Killer杀死进程)。
四、服务进程与端口状态检查
- 服务运行状态:使用
systemctl status nginx
、systemctl status php-fpm
、systemctl status mysql
(或service mysql status
),确认服务是否处于active (running)
状态;若未运行,尝试启动服务并查看启动日志(journalctl -u nginx -b
)。 - 进程数量监控:使用
ps aux | grep -E 'nginx|php-fpm|mysql'
,检查进程是否存在异常(如PHP-FPM进程数为0,或Nginx主进程不存在)。 - 端口监听检查:使用
netstat -tulnp | grep -E '80|443|9000'
(Nginx默认80/443端口、PHP-FPM默认9000端口)或ss -tulnp | grep -E '80|443|9000'
,确认服务是否在正确端口监听;若端口未监听,可能是配置错误或端口被占用(如netstat -tulnp | grep 9000
显示端口被Apache占用)。
五、配置文件语法与一致性检查
- Nginx配置:使用
nginx -t
命令测试配置文件语法(如/etc/nginx/nginx.conf
及/etc/nginx/sites-enabled/*
下的虚拟主机配置),重点检查server_name
、root
路径、fastcgi_pass
指令(如fastcgi_pass unix:/tmp/php-fpm.sock;
是否与PHP-FPM的listen
指令一致)。 - PHP-FPM配置:检查
/etc/php/7.4/fpm/php.ini
(PHP核心配置)、/etc/php/7.4/fpm/pool.d/www.conf
(进程池配置),重点确认listen
(如listen = /tmp/php-fpm.sock
或listen = 127.0.0.1:9000
)、pm.max_children
(进程数,根据内存调整,如pm.max_children = 50
对应约500MB内存/进程)、user/group
(与Nginx用户一致,如www-data
)。 - MySQL配置:检查
/etc/mysql/my.cnf
或/etc/mysql/mariadb.conf.d/50-server.cnf
,重点确认bind-address
(如bind-address = 127.0.0.1
仅允许本地连接,或0.0.0.0
允许远程连接)、max_connections
(最大连接数,默认151,若并发高需调整)。
六、权限与安全设置检查
- 文件/目录权限:确保Nginx用户(如
www-data
)对网站根目录(如/var/www/html
)有读取权限(chown -R www-data:www-data /var/www/html
、chmod -R 755 /var/www/html
);避免权限过高(如chmod 777
),防止安全风险。 - SELinux设置:若系统启用SELinux(
getenforce
返回Enforcing
),需调整策略允许Nginx访问网站目录(chcon -R -t httpd_sys_rw_content_t /var/www/html
)或允许PHP-FPM连接套接字(setsebool -P httpd_can_network_connect 1
)。 - 防火墙规则:使用
iptables -L -n
或firewall-cmd --list-all
(Firewalld),检查80/443端口是否开放(如firewall-cmd --add-service=http --permanent
、firewall-cmd --reload
);避免误拦截Nginx或PHP-FPM的流量。
七、网络连通性测试
- 服务器自身网络:使用
ping 8.8.8.8
测试网络连通性,traceroute 8.8.8.8
(或mtr 8.8.8.8
)检查路由是否正常;若无法ping通,可能是网卡故障或DNS问题(cat /etc/resolv.conf
检查DNS配置)。 - 端口连通性:使用
telnet 127.0.0.1 80
或nc -zv 127.0.0.1 80
(Netcat),测试Nginx端口是否可从本地访问;若无法连接,可能是Nginx未启动或端口被防火墙拦截。
八、常见问题针对性解决
- 502 Bad Gateway:常见原因包括PHP-FPM未运行、
fastcgi_pass
路径错误、pm.max_children
不足(进程数耗尽)。解决方法:重启PHP-FPM(systemctl restart php-fpm
)、修正Nginx中的fastcgi_pass
指令、调整pm.max_children
(如pm.max_children = 100
,根据服务器内存计算:内存大小(MB)/单个PHP进程内存占用(MB)
,如1GB内存分配10个进程,每个进程约100MB)。 - 500 Internal Server Error:常见原因包括PHP代码语法错误、PHP扩展缺失(如
mysqli
扩展未安装)、权限问题。解决方法:查看PHP错误日志(/var/log/php-fpm/error.log
)定位代码错误、安装缺失扩展(apt install php-mysqli
)、调整文件权限(chown -R www-data:www-data /var/www/html
)。 - 403 Forbidden:常见原因包括Nginx配置中的
deny
指令、权限不足(Nginx用户无法访问目录)。解决方法:检查Nginx配置中的location
块(如deny all;
是否误配置)、调整目录权限(chmod 755 /var/www/html
)。 - MySQL启动失败:常见原因包括配置文件错误(如
datadir
路径不存在)、端口冲突(3306端口被占用)、数据目录权限问题。解决方法:检查my.cnf
配置文件(mysql -t
测试语法)、停止占用端口的服务(kill -9 $(lsof -t -i:3306)
)、修改数据目录权限(chown -R mysql:mysql /var/lib/mysql
)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: LNMP故障排查步骤
本文地址: https://pptw.com/jishu/721875.html