网站突然打不开了?先别急着重启服务器,10个检查点从DNS解析到数据库连接逐个排,80%的问题在第三步就找到了
上个月底,一个客户凌晨两点打电话过来,说网站挂了,首页一片空白,用户群里已经开始炸锅。他第一反应是"服务器是不是崩了",直接按了重启键。重启完了还是打不开——问题出在SSL证书过期了,服务器根本没坏。这次重启把正在跑的定时任务全中断了,数据库有一批写入数据没来得及刷盘,反而多丢了半小时的数据。
"网站打不开"这四个字背后,可能的原因从DNS解析失败到数据库连接池耗尽,至少有十几种。上来就重启服务器,相当于头痛就吃止疼药——可能治标,也可能把真实病因掩盖了,让后面排查更难。把每个环节按顺序过一遍,大多数时候10分钟内就能定位到问题。
网站打不开,从外到内查这五个层级
| 1 | 域名和DNS层:域名过期、DNS解析出错、NS记录指向错误 |
| 2 | 网络和CDN层:CDN节点故障、回源配置错误、防火墙/安全组拦截 |
| 3 | Web服务器层:Nginx/Apache进程挂了、配置错误、SSL证书过期 |
| 4 | 应用服务层:PHP-FPM/Node进程崩溃、代码异常、内存溢出 |
| 5 | 数据层:数据库挂了、磁盘满了、连接池耗尽 |
一、先别碰服务器,用三步确认问题在谁身上

很多人一看到网站打不开,第一反应就是SSH连服务器。但在动手之前,有三个动作可以帮你在60秒内把问题范围缩小一半。
第一步:确认是"只有你打不开"还是"所有人都打不开"。换个设备(手机切4G/5G流量)、换个网络(连隔壁WiFi),再访问一次。如果换了设备和网络都能打开,问题在你自己这边——可能是公司网络防火墙拦截了、DNS缓存问题、或者你的IP被服务器ban了。如果所有人都打不开,那继续往下排查。
第二步:用在线检测工具确认全局状态。打开 DownForEveryoneOrJustMe.com 或者拨测工具(boce.com、站长工具的超级ping),从全国多个节点检测网站是否能访问。如果全球节点都超时或报错,确认是服务器端问题。
第三步:看一眼浏览器显示的报错信息。不同报错直接指向不同原因,这是最省时间的线索:
"无法访问此网站" / 连接超时
服务器没响应。可能是服务器宕机、网络不通、防火墙拦截。先ping IP看通不通。
"ERR_CONNECTION_REFUSED"
端口没开。Web服务没启动,或者防火墙把端口封了。检查Nginx/Apache是否在运行。
"DNS_PROBE_FINISHED_NXDOMAIN"
DNS解析失败。域名过期、NS记录错误、或者DNS服务商出问题了。
SSL证书错误 / "连接不是私密连接"
SSL证书过期或配置错误。先看证书有效期,再看证书路径是否正确。
502 / 503 / 504 错误页面
Nginx在运行但后端挂了。502是后端返回了无效响应,503是后端不可用,504是后端超时。
空白页 / 500 Internal Server Error
程序代码报错了。PHP/Python/Node代码有bug,或者数据库连接失败导致程序崩溃。
二、DNS和域名——被忽略的第一道关
DNS是网站访问链路上最容易被跳过的一环,但它出问题的概率比你想象的高。域名过期忘记续费、DNS服务商故障、NS记录被误改、甚至DNS劫持,都会让网站"凭空消失"。
排查DNS有三个命令,按顺序跑一遍:
# 1. 先查域名能不能解析出IPnslookup yourdomain.com# 如果返回 "server can't find" — 域名可能过期了,去注册商后台看# 2. 用Google DNS绕过本地缓存再查一次nslookup yourdomain.com 8.8.8.8# 8.8.8.8能解析但本地不行 — 本地DNS缓存问题,执行 ipconfig /flushdns# 3. 查NS记录确认DNS服务器指向对不对nslookup -type=ns yourdomain.com# NS记录指向了不认识的DNS服务商 — 可能被劫持或配置被改过域名过期的征兆很容易被忽略
域名过期后不是立刻就不能访问的。一般会有30天左右的赎回宽限期(Redemption Grace Period),期间网站还能正常打开。但如果恰好在这个阶段发现网站打不开,去域名注册商后台看一眼到期时间——这是最容易被忽略但最好查的一步。另外,如果注册邮箱已经不用了,可能收不到续费提醒,建议在注册商后台设置短信提醒或多邮箱通知。
还有一种情况是DNS解析正常,但解析出来的IP不对。比如刚迁移了服务器,DNS记录改了但还没全球生效(TTL设太长的话最长要等48小时)。或者CDN切换时回源IP配错了。这时候先用ping yourdomain.com看看解析出来的IP是不是你预期的那个。
三、网络层——ping得通不代表网站能打开
DNS解析正常,IP也对,但网站还是打不开,下一步就是检查网络连通性。这里有一个新手特别容易犯的误区:ping通了就觉得网络没问题。ping用的是ICMP协议,很多服务器为了安全会禁ping,ping不通不代表服务器挂了。反过来,ping通了也只能说明服务器在线,不代表80/443端口开了。
真正有用的是端口连通性测试:
# Windows PowerShellTest-NetConnection -ComputerName IP地址 -Port 80Test-NetConnection -ComputerName IP地址 -Port 443# Linux/Macnc -zv IP地址 80nc -zv IP地址 443# 也可以用curl直接测试HTTP响应curl -I http://IP地址curl -I https://IP地址| 端口测试结果 | 意味着什么 | 优先排查方向 |
|---|---|---|
| Connection timed out | 数据包根本没到服务器,或到了但被丢弃 | 云安全组 → 服务器防火墙 → 机房网络故障 |
| Connection refused | 数据包到了,但端口没服务在监听 | Nginx/Apache没启动 → 监听端口配错 → 服务崩了 |
| 连接成功 + 有HTTP响应 | 网络和Web服务都正常 | 问题在应用层(代码、数据库、CDN配置等) |
如果是超时,最常被忽略的是云服务商的安全组/防火墙规则。很多人在服务器内部把iptables配好了,却忘了云控制台的安全组入站规则里根本没放行80/443端口。两个地方都要检查。另外,用了高防IP或DDoS清洗服务的,高防回源IP可能变了,需要更新回源配置。
四、CDN——加速层反而可能是故障源
用了CDN的网站,出问题时排查要加一个环节。CDN节点本身可能故障、回源配置可能被误改、HTTPS证书在CDN层面可能过期了而源站证书是新的——这些都会导致网站打不开。
CDN故障快速判断方法
· 在本地hosts文件中把域名指向源站IP,如果能正常访问,说明源站没问题,CDN层面有问题
· 用 curl -H "Host: yourdomain.com" http://源站IP 直接回源测试,绕过CDN看源站响应
· 登录CDN控制台,看回源状态码分布——如果大量502/503,说明CDN到源站之间的链路有问题
· 检查CDN的HTTPS证书:有些CDN需要单独上传SSL证书,源站换了证书但CDN没同步更新,用户就会看到证书错误
五、Web服务器——看状态码比看日志更快
网络通了,端口也开了,下一步看Web服务器本身。SSH连上服务器后,先别急着看日志——先看Nginx/Apache的进程状态,很多问题一眼就能看出来。
# 看Nginx是不是在运行systemctl status nginx# active (running) = 正常;inactive (dead) = 挂了;failed = 启动失败# 看有没有在监听80和443端口ss -tlnp | grep -E ':80|:443'# 没有输出 = Nginx没在监听这些端口# 测试Nginx配置文件有没有语法错误nginx -t# syntax error = 配置文件有bug不同HTTP状态码背后的原因差异很大,能帮你快速定位是Web服务器自身问题还是后端问题:

| 状态码 | 含义 | 最常见的真实原因 | 先查什么 |
|---|---|---|---|
| 502 | Bad Gateway | Nginx连上了后端,但后端返回了无效响应,或进程崩了 | systemctl status php-fpm |
| 503 | Service Unavailable | 后端服务完全不可用——进程挂了、所有节点健康检查失败、触发限流 | 重启后端服务,反复503则查资源耗尽 |
| 504 | Gateway Timeout | 后端处理请求超时——慢SQL、外部API卡住、数据库连接池满了 | 查慢查询日志、数据库连接数 |
| 500 | Internal Server Error | 程序代码抛异常——PHP语法错误、文件权限不对、.htaccess冲突 | 看PHP错误日志:tail -100 /var/log/php-fpm/www-error.log |
| 403 | Forbidden | 文件权限问题、目录索引被禁、IP被Nginx deny拦截 | ls -la /var/www/网站目录 |
六、服务器资源——三大杀手:磁盘满、内存爆、CPU打满
服务器资源耗尽是最常见但最容易排查的一类故障。SSH连上服务器后,三个命令就能看清全貌:
# 1. 磁盘空间——最容易被忽略的故障源df -h# 根分区 / 的 Use% 接近 100%,服务会陆续挂掉# 定位大文件:du -sh /* 2>/dev/null | sort -rh | head -20# 2. 内存——OOM Killer 会随机杀进程free -h# available 接近0,查谁在吃内存:ps aux --sort=-%mem | head -10# 查OOM历史:dmesg | grep -i "killed process"# 3. CPU——load average超过核心数说明在排队uptime# 4核服务器load average超过4就说明有进程在排队等CPU磁盘满的特殊情况
最常见的是日志文件撑爆磁盘。/var/log/nginx/下的access.log可能几个GB。另一种是inode耗尽——df -h显示有空间但df -i显示inode用完了(小文件太多),同样无法写入。
内存满不等于马上挂
Linux会用空闲内存做文件缓存,free -h里的available才是真正可用的。但swap使用率很高的话说明物理内存确实不够了,性能会明显下降。
七、数据库——连不上比代码bug更常见
很多500错误追到最后,根因是数据库。MySQL/MariaDB进程挂了、连接数满了、磁盘满了写不进去——都会让网站直接白屏或者报500。
数据库快速排查四步
1. 进程还在不在:systemctl status mysql(或mariadb)。如果挂了,先看错误日志:tail -100 /var/log/mysql/error.log
2. 能不能连上:mysql -u root -p -e "SELECT 1;"。连不上检查socket文件路径、端口是否在监听、密码是否被改。
3. 连接数是不是满了:进MySQL执行 SHOW STATUS LIKE 'Threads_connected'; 和 SHOW VARIABLES LIKE 'max_connections';。Threads_connected接近max_connections时新请求就进不来了。
4. 有没有慢查询卡住:SHOW FULL PROCESSLIST; 看有没有State是"Sending data"或"Locked"跑了几十秒的查询。这些慢查询会堵住连接池,导致整个网站无响应。
数据库连接数满有两种处理方式。临时方案是调大max_connections(SET GLOBAL max_connections = 500;),但这只是缓解,治标不治本。根因通常是某个页面的SQL查询没加索引、或者有未关闭的数据库连接。查看哪些用户/IP占用连接最多:SELECT user, host, count(*) FROM information_schema.processlist GROUP BY user, host;
八、SSL证书——过期了比黑客攻击更让人崩溃
SSL证书过期导致的网站打不开,有一个特点:用户看到的不是"打不开",而是红色的安全警告页面。大部分用户看到这个页面就直接关掉了,不会点"继续访问"——等于网站实质上不可用。而且这个问题排查起来特别简单,但很多人第一时间想不到。
# 查看证书有效期echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates# 输出示例:notBefore=Jun 15 00:00:00 2025 GMTnotAfter=Jun 15 23:59:59 2026 GMT# 如果 notAfter 已经过了当前时间 = 证书过期了除了过期,SSL证书还有几种常见问题:证书域名不匹配(www和不带www的域名需要通配符证书或SAN证书)、证书链不完整(只装了服务器证书没装中间证书)、Let's Encrypt自动续期脚本没跑成功(crontab里的certbot renew没执行)。
最容易翻车的场景:网站迁移后SSL没同步
把网站从一台服务器迁移到另一台,域名解析已经切过来了,但新服务器上忘了部署SSL证书。老服务器上证书还在、网站也能访问(如果用IP直接连老服务器),但从域名访问已经是新服务器了——用户看到的就是证书错误。这种情况迁移checklist里必须包含SSL证书部署确认这一项。
九、被攻击或被墙——外部因素排查
如果前面所有内部环节都排查过了没有问题,那就要考虑外部因素了。DDoS攻击、域名被墙、IP被列入黑名单——这些都不在服务器上,但一样会导致网站打不开。
DDoS攻击
流量异常暴增,带宽被打满。用iftop或nload看实时流量,如果入站流量远超正常值,大概率是被打了。先切到高防IP或CDN清洗。
域名被墙
国内部分用户打不开、国外能打开。用boce.com或itdog.cn从全国节点测试,如果只有国内节点超时,域名可能被GFW屏蔽了。
IP被列入黑名单
用mxtoolbox.com查IP是否在Spamhaus等黑名单中。共享IP容易被同IP段的"邻居"牵连,换独立IP可以解决。
ISP线路故障
某个运营商到你的机房线路断了。用不同网络(电信/联通/移动)分别测试,如果只有一个运营商打不开,就是线路问题,联系机房或切BGP线路。
域名被墙这种情况,对做跨境业务或多站点矩阵的团队影响特别大。一个域名被墙了,如果不及时发现,流量就白白丢了。用UC建站系统的多站看板可以统一监控所有站点的索引量和访问状态,哪个站出现异常能第一时间收到预警,不用一个一个站点手动检测——几十个站的时候手动查一遍就得大半天。
十、别再等到出事了才装监控
排查方法讲完了,但比"怎么排查"更重要的是"怎么提前知道"。大部分网站故障如果能提前预警,根本不会发展到"用户发现网站打不开了"这一步。磁盘快满了、CPU持续高负载、SSL证书快过期了——这些都有明显的早期信号。
| 监控维度 | 推荐工具/方案 | 监控什么 |
|---|---|---|
| HTTP可用性 | UptimeRobot(免费50个监控)、Better Uptime、自建cron+curl脚本 | 每1-5分钟检测一次网站是否返回200状态码 |
| SSL证书 | UptimeRobot SSL监控、certbot renew定时任务+邮件通知 | 证书到期前30天、7天、1天分别提醒 |
| 服务器资源 | Netdata、Prometheus+Grafana、云服务商自带监控 | CPU>80%、内存>90%、磁盘>85%时告警 |
| 域名到期 | 注册商后台短信/邮件提醒 + 日历提醒 | 域名到期前60天、30天、7天提醒 |
| 服务进程 | Monit、Supervisor、systemd自动重启 | Nginx/PHP-FPM/MySQL进程挂了自动拉起+通知 |
最小成本方案:UptimeRobot免费版监控HTTP状态 + 服务器上配一个cron脚本每天检查磁盘和证书,有问题发邮件或企业微信通知。这个组合零成本,但能覆盖80%的故障预警场景。
如果管理的站点比较多(几十上百个),一个一个配监控就不现实了。UC建站系统的多站看板可以把所有站点的索引量、访问状态、SSL证书到期时间统一展示在一个页面上,哪个站出问题一眼就能看到——不用在UptimeRobot里翻来翻去找是哪个域名挂了。独立部署架构下每个站有独立IP和独立环境,一个站挂了不影响其他站,排查范围也缩小到单站层面。
网站打不开时的排查顺序,贴服务器旁边
| 1 | 换设备/网络确认是不是只有你打不开 → 是=查本地,否=继续 |
| 2 | 看浏览器报错信息 → 不同报错指向不同方向 |
| 3 | nslookup查DNS → 解析不出=域名过期/DNS故障 |
| 4 | nc/telnet测端口 → 超时=防火墙/安全组;拒绝=Nginx没启动 |
| 5 | systemctl status看服务进程 → Nginx/PHP-FPM/MySQL是否在运行 |
| 6 | df -h + free -h + uptime → 磁盘/内存/CPU是否正常 |
| 7 | tail -100看错误日志 → Nginx error.log + PHP error.log + MySQL error.log |
| 8 | openssl查证书有效期 → 过期=续期+部署 |
| 9 | SHOW PROCESSLIST查数据库 → 连接数满/慢查询卡住 |
| 10 | 拨测工具全国节点检测 → 排查域名被墙/IP被黑/线路故障 |
说穿了,"网站打不开"这件事最大的坑不是技术上的——是情绪上的。用户群在炸、老板在催、自己心里慌,一慌就容易跳过排查直接重启,反而把简单问题复杂化。上面这10个检查点按顺序走一遍,大多数情况走到第三步(看浏览器报错)+第五步(检查服务进程)就已经定位到问题了。剩下的只是执行修复,而不是盲目猜。
还有一条经验:每次故障处理完之后,花五分钟写一个简单的故障记录。什么时间、什么现象、什么原因、怎么解决的。下次再出问题,翻翻记录可能三分钟就找到答案——因为同类型的问题大概率会反复出现。
