VPS 上的网站突然打不开了,这种情况每个站长都会遇到。别慌,这篇文章帮你系统地排查问题。
先搞清楚是你一个人打不开,还是所有人都打不开:
# 用 curl 测试网站是否能响应
curl -I https://你的域名.com
# 或者用在线工具
# https://downforeveryoneorjustme.com/
# https://www.isitdownrightnow.com/
如果只有你打不开,可能是本地 DNS 缓存或网络问题。刷新一下 DNS:
# Windows
ipconfig /flushdns
# macOS
sudo dscacheutil -flushcache
# Linux
sudo systemd-resolve --flush-caches
DNS 配置错误是最常见的原因之一。
# 查看域名解析到哪个 IP
dig 你的域名.com +short
# 或者用 nslookup
nslookup 你的域名.com
解析出来的 IP 应该是你 VPS 的 IP。如果不是,登录域名服务商后台检查 A 记录配置。
DNS 修改后需要等待生效,通常 TTL 设置多久就等多久,一般 5 分钟到 24 小时不等。
# ping 你的 VPS IP
ping 你的VPS_IP
# 检查 SSH 能否连接
ssh root@你的VPS_IP
如果 ping 不通或 SSH 连不上:
- 登录 VPS 服务商后台,检查机器状态
- 尝试通过 VNC/控制台登录
- 检查是否欠费停机
登录 VPS 后,首先看 Web 服务器有没有在跑:
# 查看 Nginx 状态
systemctl status nginx
# 如果没运行,启动它
systemctl start nginx
# 检查配置是否正确
nginx -t
# 查看错误日志
tail -100 /var/log/nginx/error.log
# 查看 Apache 状态
systemctl status apache2 # Ubuntu/Debian
systemctl status httpd # CentOS/RHEL
# 启动服务
systemctl start apache2
# 检查配置
apachectl configtest
# 查看错误日志
tail -100 /var/log/apache2/error.log
常见的 Web 服务器启动失败原因:
- 配置文件语法错误
- 端口被占用
- SSL 证书路径错误
# 查看 80 和 443 端口是否在监听
ss -tlnp | grep -E ':80|:443'
# 或者用 netstat
netstat -tlnp | grep -E ':80|:443'
正常输出应该类似:
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=7))
如果没有进程监听这些端口,说明 Web 服务器没有正确运行。
防火墙可能把 HTTP/HTTPS 流量挡住了。
# 查看规则
iptables -L -n
# 允许 80 和 443 端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
# 查看状态
firewall-cmd --state
# 开放端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# 查看状态
ufw status
# 允许 Web 流量
ufw allow 'Nginx Full' # 或 'Apache Full'
别忘了检查云服务商的安全组,AWS、阿里云、腾讯云等都有安全组设置,需要在后台放行 80 和 443 端口。
如果 HTTP 能访问但 HTTPS 打不开,通常是证书问题。
# 检查证书是否过期
openssl s_client -connect 你的域名.com:443 2>/dev/null | openssl x509 -noout -dates
# 或者直接查看证书文件
openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates
证书过期的话,用 certbot 重新申请:
# 重新申请 Let's Encrypt 证书
certbot renew --force-renewal
# 重启 Web 服务器
systemctl reload nginx
资源耗尽也会导致网站无法访问。
# 查看内存使用
free -h
# 查看 CPU 和进程
top -bn1 | head -20
# 查看磁盘空间
df -h
# 查看 inode 使用(小文件太多会用完 inode)
df -i
如果内存用完了,OOM Killer 可能杀掉了你的 Web 服务器或 PHP 进程。
# 检查是否有进程被 OOM 杀掉
dmesg | grep -i "out of memory"
# 或查看系统日志
grep -i "oom" /var/log/syslog
临时解决:重启服务,长期解决:升级内存或优化应用。
# 找出大文件
du -sh /* | sort -hr | head -10
# 清理日志文件(谨慎操作)
truncate -s 0 /var/log/nginx/access.log
# 清理旧的软件包缓存
apt clean # Debian/Ubuntu
yum clean all # CentOS
如果是 WordPress、Laravel 这类 PHP 网站,还要检查 PHP-FPM:
# 查看 PHP-FPM 状态
systemctl status php8.1-fpm # 版本号根据实际情况
# 查看 PHP-FPM 错误日志
tail -100 /var/log/php8.1-fpm.log
常见的 PHP 问题:
- 内存限制太小:修改 php.ini 中的
memory_limit - 执行时间超时:调整
max_execution_time - PHP-FPM 进程数不够:调整
pm.max_children
有时候服务器本身没问题,是应用代码出错了。
# 查看应用日志
# WordPress
tail -100 /var/www/html/wp-content/debug.log
# Laravel
tail -100 /var/www/html/storage/logs/laravel.log
启用调试模式可以看到具体错误信息,但生产环境记得关掉调试模式,否则会泄露敏感信息。
| 错误码 | 含义 | 排查方向 |
|---|---|---|
| 502 Bad Gateway | 后端服务无响应 | 检查 PHP-FPM、应用进程 |
| 503 Service Unavailable | 服务暂时不可用 | 检查负载、资源使用 |
| 504 Gateway Timeout | 后端处理超时 | 增加超时时间、优化代码 |
| 500 Internal Server Error | 服务器内部错误 | 查看应用日志、PHP 错误 |
| 403 Forbidden | 权限被拒绝 | 检查文件权限、Nginx 配置 |
| 404 Not Found | 页面不存在 | 检查 URL、路由配置 |
按这个顺序排查,基本能覆盖 90% 的情况:
- DNS → 解析是否正确
- 网络 → VPS 是否在线、能否 ping 通
- 端口 → 80/443 是否监听
- 防火墙 → 是否放行 Web 端口
- Web 服务器 → Nginx/Apache 是否运行
- SSL → 证书是否有效
- 资源 → CPU/内存/磁盘是否充足
- 后端 → PHP-FPM/应用服务是否正常
- 应用日志 → 具体错误信息
与其出问题再排查,不如提前做好监控:
- 设置 Uptime 监控(UptimeRobot、Better Uptime 免费版够用)
- 配置服务器监控(Prometheus + Grafana)
- 设置日志告警
- 定期更新 SSL 证书(certbot 默认会自动续期)
- 配置日志轮转,避免日志文件撑爆磁盘
网站打不开的原因很多,但排查思路是固定的:从网络层到应用层,一层层往上查。掌握了这套方法,以后遇到问题就不会手忙脚乱了。
如果按照这个流程排查完还是找不到原因,可以把错误日志发到技术论坛或者 VPS 服务商的工单系统,让专业人士帮你看看。
