网站无法访问时,别急着重启服务器,先用LNMP环境内置的nginx、PHP-FPM和MySQL自带工具逐层定位,绝大多数原因都能在十分钟内找到。
先分清范围:全站挂还是单站点挂,本地通还是公网不通
动手之前,先用两三分钟确认故障范围,这个问题想清楚,排查方向就明确了一半。
- 打开浏览器访问网站,看是连接超时、连接被拒绝还是返回HTTP错误码。
- 在服务器本机执行
curl -I http://localhost,如果本机正常但公网打不开,优先怀疑防火墙、安全组或CDN配置。 - 如果是多个站点同时打不开,问题大概率出在nginx或PHP-FPM层面;如果只有单个站点出问题,重点看该站点的配置文件、目录权限或数据库连接。
行业共识认为,超过一半的网站无法访问案例,根因在PHP-FPM进程异常或nginx配置语法错误,而LNMP环境自带的工具,恰好能快速验证这两个环节。
lnmp环境网站无法访问原因,先从nginx内置状态与日志找线索
nginx是LNMP的门面,请求进不来、进得去但返回异常,日志里都有记录,别靠猜,直接看日志。
用nginx -t检查配置语法
配置写错是导致网站打不开的高频原因,特别是刚改过伪静态规则、SSL证书或location匹配后。
nginx -t
输出 syntax is ok 和 test is successful 说明配置没问题,如果报错,会精确告诉你第几行有问题,照着改就行,很多新手容易漏掉的一点:改完配置必须用 nginx -s reload 重载,而不是重启服务器。
看error.log定位具体请求失败点
tail -f /var/log/nginx/error.log
这条命令会实时滚动所有站点的错误日志,常见的报错信息有:
connect() failed (111: Connection refused),说明nginx连不上PHP-FPM。recv() failed (104: Connection reset by peer),说明PHP-FPM处理请求时崩溃。open() failed (13: Permission denied),说明站点目录权限不对。
日志会精确到文件路径和行号,照着路径去查,问题通常直接浮出水面。
用access.log分析请求命中情况
如果error.log里没东西,但网站还是打不开,看access.log(如
/var/log/nginx/access.log),重点找最近几分钟该域名的请求记录:
- 请求状态码全是304或403,检查目录权限。
- 状态码404,检查伪静态规则或站点根目录配置。
- 状态码499,说明客户端主动断开,多为PHP处理超时或浏览器等待太久。
用 tail -n 100 access.log | grep 域名 单独过滤目标站点的请求,效率更高,nginx内置的这两个日志就是最直接的排障工具,不需要装任何第三方组件。
nginx 502 bad gateway 解决方法,核心看PHP-FPM运行状态
502是LNMP环境下最折磨人的错误码,页面提示nginx返回网关错误,但问题根源往往不在nginx,而在后端的PHP-FPM。
检查PHP-FPM进程是否存活
ps aux | grep php-fpm
如果看不到master和worker进程,说明PHP-FPM已经挂了,再执行:
systemctl status php-fpm
查看服务状态详细信息,包括启动时间、进程PID、最近几次重启记录,根据LNMP部署方式不同,服务名可能是 php-fpm、php74-fpm 或 php8.2-fpm,用 systemctl list-units | grep php 确认。
看php-fpm.log中的崩溃原因
PHP-FPM日志默认路径在 /var/log/php-fpm.log 或 /usr/local/php/var/log/php-fpm.log(LNMP一键包路径),执行:
tail -n 50 /var/log/php-fpm.log
如果看到 WARNING: [pool www] server reached pm.max_children setting,说明进程数被耗尽,php-fpm无法响应新请求,解决办法是调整 pm.max_children 和 pm.start_servers 参数,在虚拟主机配置或 php-fpm.conf 里修改后重载。
另一种常见崩溃原因是 Segmentation fault,这类情况往往和php扩展冲突有关,比如opcache和某个第三方扩展不兼容,用 php -m 查看已加载扩展,临时禁用最近安装的扩展再观察。
检查php-fpm.sock文件是否存在
nginx连接PHP-FPM有两种方式:TCP端口(如127.0.0.1:9000)和Unix socket(如 /tmp/php-cgi.sock),socket方式下如果文件缺失,nginx会报502。
ls -l /tmp/php-cgi.sock
文件不存在则重启php-fpm;文件在了但权限不对,nginx的worker用户(通常是www)无法访问,也要注意,用
chown www:www /tmp/php-cgi.sock 修改属主即可。
MySQL连接异常也是网站打不开的高发区
PHP程序能跑起来,但一旦查询数据库就报错,页面同样显示无法访问,这种现象常常被误判为PHP问题,其实查一行日志就能分辨。
用mysqladmin ping确认数据库存活
mysqladmin -uroot -p ping
返回 mysqld is alive 说明数据库进程正常,如果报 Access denied,说明密码不对或权限受限;如果报 Can't connect to MySQL server,优先看3306端口是否在监听。
ss -lnt | grep 3306
查看MySQL错误日志
日志路径在配置文件 /etc/my.cnf 的 log-error 参数里指定,常见问题记录:
Table doesn't exist,说明数据库中表被误删。Too many connections,说明连接数达到上限,应用连不上。Disk is full writing,说明服务器磁盘满了,MySQL拒绝新的写入操作。
磁盘满的情况在LNMP环境里经常被忽略,用 df -h 查看分区使用率,长期超过80%使用率的服务器经常出现各种诡异问题,MySQL日志和nginx日志不同,不会滚动清除,排查完记得手动清理或配置日志轮转。
linux服务器网站打不开怎么排查,直接看这份系统层面清单
上面按组件排查覆盖了大部分LNMP场景,但还有一类情况:所有服务都正常,网站还是访问不了,这时要往上看到系统层。
端口监听与防火墙规则
netstat -tlnp | grep -E ":80|:443"
没有监听就说明nginx没起来,监听正常但外部不通,检查防火墙:
iptables -L -n | grep -E "80|443"
CentOS 7以上默认用firewalld,执行 firewall-cmd --list-all 确认端口放行状态,简米云、酷番云等云服务器还需要检查控制台安全组规则,这一点在云上环境比本地防火墙更容易被漏掉。
磁盘写满和inode耗尽
nginx日志写入失败、PHP会话文件创建失败、MySQL表锁死,都可能指向同一个根因:磁盘满了或inode用完了。
df -h df -i
分区使用率100%,列出大文件清理;df -i 显示 IUsed%
接近100%,说明小文件太多,多半是 /tmp 下的php session文件或nginx缓存目录堆积,清空即可恢复。
最后一个高频场景:单站点404或403
LNMP环境下,站点代码目录权限设置为www:www是标配,偶尔改成root用户之后就会出现403。chown -R www:www 站点目录 就能解决。
404则要检查nginx的 try_files 指令,thinkPHP、Laravel这类框架在LNMP下必须配置伪静态,否则所有URL都会找不到页面,LNMP一键包自带的 lnmp vhost add 在添加站点时选择伪静态规则类型,后续修改写在nginx虚拟主机配置里,改完记得 nginx -t 验证再reload。
lnmp环境网站无法访问原因,Q&A常用疑问解答
问:重启nginx和php-fpm之后网站还是502,还有什么内置工具能查?
重启后仍然502,说明配置本身就存在问题,执行 php -l 逐一校验PHP文件语法,重点检查刚改动过的入口文件,再用 strace -p 主进程PID 跟踪进程调用,看卡在哪个系统调用上,最后确认php-fpm监听地址与nginx的 fastcgi_pass 配置是否一致,端口或socket路径写错是重启无法解决的。
问:LNMP和宝塔面板的排查方式有区别吗?
LNMP一键包的环境目录固定,日志路径清晰,直接使用命令行工具排查效率更高,宝塔面板提供web可视化界面,在面板中能直接看到nginx和MySQL的错误日志,但底层原理相同依旧是检查nginx配置文件、PHP-FPM进程状态、MySQL连接数这三个核心环节,面板环境排查时要额外注意,部分版本在面板重载配置时会覆盖自定义设置,手动修改前先备份配置文件,据W3Techs数据,nginx在主流网站服务器中占据相当大比例,linux服务器网站打不开怎么排查这个问题,本质解法都遵循从外到内、从日志到进程、从软件到系统的固定顺序。
问:排查过程中最容易被忽略的配置项是什么?
超出预期的时区设置和默认字符集,PHP默认时区不是Asia/Shanghai时,日志时间可能偏移数小时,排查问题时容易看错时间线,导致难以对应出错时段的请求,MySQL连接时若字符集不统一,程序可能抛出字符编码相关异常,页面表现为空白或500错误,而非直接提示数据库连接失败,相当一部分半故障状态都是这样产生的。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/660363.html





