服务器还能 SSH 登录,网站却突然打不开,这种情况其实比整台 VPS 宕机更让人头疼。
因为机器明明还活着,命令也能正常执行,偏偏浏览器访问域名就是超时、502、504,或者直接提示连接失败。
我自己遇到这类问题时,已经很少一上来就重启服务器。SSH 能连,本身就说明机器大概率没有彻底挂掉,问题更可能出在 Web 服务、端口、资源占用、域名解析或者防火墙。
按顺序查,很多时候几分钟就能定位。

先确认网站服务到底还在不在
我第一步不会看域名,而是先看 Nginx 或 Apache 有没有正常运行。
Nginx 可以执行
systemctl status nginx
Apache 则可以看
systemctl status apache2
有些 CentOS 系统服务名是 httpd。
看到 active (running),至少说明 Web 服务进程还在。
状态已经变成 failed,就继续看最近的错误日志。Nginx 可以直接运行
journalctl -u nginx -n 50 --no-pager
很多问题在这里已经能直接看到原因,比如配置文件写错、证书路径丢失、端口被占用,或者重启服务时加载失败。
我比较不建议看到 Nginx 挂了就马上 restart。
先看一眼错误信息,再重启,往往能少走很多弯路。
服务正常,再看 80 和 443 端口
Nginx 显示正常,不代表网站端口一定正常监听。
可以运行
ss -lntp
重点找 80 和 443。
正常情况下,应该能看到对应端口处于 LISTEN 状态。
这里有个很常见的坑。Nginx 虽然启动成功,但配置文件改过以后,某个网站并没有真正监听 443,浏览器访问 HTTPS 自然打不开。
也有可能另一个程序抢占了端口。
比如 Docker 容器、Apache 和 Nginx 同时都想监听 80,最后真正占着端口的并不是你以为的那个服务。
这时候继续折腾 DNS 没什么意义,问题就在服务器里面。
别急着怪服务器,先本机访问一次
确认端口以后,我会在 VPS 自己内部访问网站。
运行
curl -I http://127.0.0.1
需要测试 HTTPS,也可以直接请求实际域名。
这里特别有用。
服务器内部访问正常,外部浏览器却打不开,排查范围一下就小了很多。Nginx、PHP、网站程序大概率还能正常工作,更值得去看安全组、防火墙、DNS 和公网线路。
本机访问也失败,那就继续留在服务器内部查。
这一步相当于把“网站问题”和“网络问题”先分开。
502 和 504,别只盯着 Nginx
很多 WordPress 网站突然打不开,页面会直接出现 502 Bad Gateway。
看到 502 时,我一般不会折腾域名。
Nginx 还能把 502 页面返回给浏览器,本身就证明请求已经到服务器了。真正出问题的往往是 Nginx 后面的 PHP-FPM、Node.js、Python 或其他后端程序。
WordPress 环境可以看看 PHP-FPM 状态。
例如
systemctl status php8.2-fpm
具体版本根据服务器环境调整。
PHP-FPM 挂掉以后,Nginx 还活着,但 PHP 页面已经没人处理,502 就出来了。
504 更偏向后端响应时间过长。数据库卡住、PHP 进程堵塞、第三方接口一直不返回,都可能造成这种现象。
502 更像“后端没接上”,504 更像“后端接上了,但迟迟没回”。
这两个状态码其实已经给了不少排查方向。
磁盘满了,网站也可能突然挂
这一点特别值得检查。
SSH 还能登录,并不代表磁盘还有空间。
运行
df -h
我见过不少网站突然 502、数据库异常,最后发现根分区已经 100%。
MySQL 没空间写数据,PHP 写不了临时文件,日志也无法继续生成,整个网站环境就开始出现各种奇怪的问题。
Docker 用户还要多看一眼。
docker system df
镜像、容器日志、旧版本和缓存,很容易在后台悄悄占掉几十 GB。
网站昨天还正常,今天突然出问题,磁盘空间永远值得顺手看一眼。
CPU 不高,也不代表机器没有资源问题
有些 VPS 看 CPU 只有 20%,感觉资源很充足,但网站依然很卡。
这时我会运行
free -h
重点看 available 和 Swap。
物理内存已经很低,Swap 又大量使用时,网站会明显变慢。机器还能 SSH,不代表 PHP 和数据库还能舒服地工作。
再看一眼
top
PHP-FPM、MySQL、Java 或某个 Docker 容器有没有突然吃掉大量资源,基本都能看出来。
资源问题最麻烦的一点,就是服务器表面上“没死”。
SSH 能连,命令也能执行,真正承受业务的进程却已经在边缘挣扎。
服务器内部都正常,就该往外查了
前面的检查都没发现异常,网站本机访问也正常,这时候才轮到公网层面。
我会重点确认下面几项。
| 检查项 | 常见问题 |
|---|---|
| DNS | 域名解析到了旧 IP |
| 云平台安全组 | 80、443 没放行 |
| 系统防火墙 | UFW、firewalld 拦截 |
| CDN | 回源地址错误或源站被拦 |
| SSL | 证书过期、证书链异常 |
| 公网 IP | IP 被封、路由异常 |
这里最容易遇到的是换过 VPS IP,却忘记同步 DNS。
也有人迁移网站以后,只改了 A 记录,没有检查 CDN 后台里的源站地址,结果用户访问到 CDN,CDN 又一直向旧服务器回源。
服务器内部看起来完全正常,外面就是打不开。
这也是为什么我现在处理网站故障,会刻意把“服务器内部”和“公网访问”分开。
混在一起查,很容易越查越乱。
我现在最常用的排查顺序
网站打不开,但 SSH 还能连,我大致会按这个节奏走。
先看 Web 服务,再看 80 和 443 端口,然后用 curl 做本机访问。接着检查 PHP 或后端进程、磁盘、内存,最后再去看 DNS、防火墙、安全组和 CDN。
这样查的好处是,每一步都在缩小范围。
而不是看到网站打不开,先重启 Nginx,再重启 MySQL,再重启 VPS,最后机器恢复了,却完全不知道问题到底出在哪里。
故障排查最重要的不是把服务器重新弄好,而是知道它为什么坏。
下一次再遇到同样的问题,处理速度会快很多。


