Linux中LNMP环境调试指南
调试的第一步是明确故障现象,收集用户反馈(如“网站无法访问”“502 Bad Gateway”)和系统告警(如邮件、短信通知),记录故障发生的具体时间、受影响的服务(如Nginx、PHP)及应用模块。这一步能缩小排查范围,避免盲目操作。
使用top(实时显示CPU、内存占用)、htop(增强版top,支持鼠标操作)、df -h(查看磁盘空间使用情况)、free -m(查看内存及交换分区使用情况)等命令,检查服务器资源是否充足。常见资源瓶颈包括:CPU占用过高(如PHP脚本执行缓慢)、内存耗尽(如PHP-FPM进程数过多)、磁盘空间不足(如日志文件过大)。
日志是定位问题的关键线索,需重点检查以下日志文件:
/var/log/nginx/error.log)记录Nginx自身错误(如端口绑定失败、配置语法错误);访问日志(默认/var/log/nginx/access.log)记录用户请求详情(可用于分析请求响应时间、状态码分布)。/var/log/php-fpm/error.log)记录PHP解析错误(如语法错误、扩展缺失);慢查询日志(需开启slowlog配置)记录执行时间超过阈值的PHP脚本(用于优化性能)。/var/log/mysql/error.log)记录数据库启动、连接错误(如无法启动、权限不足);慢查询日志(默认/var/log/mysql/slow.log)记录执行时间超过long_query_time(默认10秒)的SQL语句(用于优化查询)。journalctl -xe(查看系统日志)或/var/log/syslog(Ubuntu)记录系统级错误(如内核崩溃、服务启动失败)。使用ping(测试服务器与外部网络的连通性,如ping www.baidu.com)、traceroute(跟踪网络路径,如traceroute www.baidu.com)、telnet(测试端口连通性,如telnet localhost 80)等命令,排查网络故障(如DNS解析失败、端口被防火墙拦截)。
使用systemctl status nginx、systemctl status php-fpm、systemctl status mysql命令检查各服务的运行状态(若显示“active (running)”则表示正常,若显示“inactive (dead)”则表示未启动)。若服务未启动,可使用systemctl start 服务名命令启动,并通过journalctl -u 服务名查看启动日志,定位启动失败原因(如配置文件错误、端口冲突)。
逐一核对LNMP各组件的配置文件,确保语法正确且无冲突:
/etc/nginx/nginx.conf及站点配置文件(位于/etc/nginx/sites-available/),重点检查listen端口、server_name域名、root根目录路径、fastcgi_pass(指向PHP-FPM的socket或端口,如unix:/run/php/php7.4-fpm.sock)。/etc/php-fpm.d/www.conf),重点检查listen(与Nginx的fastcgi_pass一致)、user/group(Web服务器用户,如www-data)、pm.max_children(进程数,根据服务器内存调整)。/etc/mysql/my.cnf或/etc/my.cnf,重点检查bind-address(允许连接的IP地址,如0.0.0.0表示允许所有IP)、port(默认3306)、max_connections(最大连接数,避免连接数耗尽)。/var/www/html)及其中的文件具有正确的权限(通常为www-data:www-data,即Nginx/PHP-FPM运行的用户),避免权限过高(如chmod 777)导致安全风险,或权限过低(如chmod 644)导致无法读取文件。sestatus命令检查),需调整SELinux策略(如setenforce 0临时关闭,或使用chcon命令修改文件上下文),避免SELinux阻止Nginx访问文件或PHP-FPM连接MySQL。xdebug_start_trace()和xdebug_stop_trace()记录函数调用流程,或通过IDE(如PhpStorm)设置断点,逐步执行代码,定位逻辑错误。strace(跟踪系统调用,如strace -p 进程ID)查看进程的系统调用情况,定位卡顿原因(如频繁的磁盘IO);使用tcpdump(抓取网络包,如tcpdump -i any port 80 -w capture.pcap)分析HTTP请求响应流程,排查网络问题。根据排查结果采取相应措施:
nginx -t(测试Nginx配置语法)、php-fpm -t(测试PHP-FPM配置语法)验证语法正确性,再重启服务(systemctl restart 服务名)。pm.max_children减少PHP-FPM进程数)、清理无用文件(如删除旧日志)。ab工具模拟并发请求)验证问题是否解决。