更新于
凌晨两点网站打不开:一个人值班时的前 15 分钟排查顺序
半夜被用户消息或告警叫醒,说网站打不开,手边只有笔记本或手机。第一反应往往是“先重启整台机器”,但重启可能抹掉故障现场,也可能让数据库在写入中途被打断。本文给一个人值班的开发者或创始人一个固定的前 15 分钟顺序:先确认影响 → 再看机器还活着吗 → 入口和应用在不在跑 → 只看故障窗口的日志 → 写下三行再动手。以下适用于常见的 Linux VPS(systemd、Nginx、Docker);路径、服务名和端口请按你的实际环境替换。本文只做第一轮分流,深入步骤链接到对应的专题指南。
1. 第 0–2 分钟:从外面确认影响
在你自己的电脑上执行(不是在服务器上),把 example.com 换成你的域名:
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' --max-time 10 https://example.com/
dig +short example.com A
dig +short example.com AAAA
000或超时:请求没拿到任何 HTTP 响应,常见方向是 DNS、网络、防火墙/安全组、TLS 握手,或者机器本身不可达。502/504:网关(Nginx 或 CDN)还在,但没从上游拿到有效响应,后面重点查应用,参见 Nginx 502 Bad Gateway。500:请求到达了应用,应用自己报错,重点看应用日志。200:从你这里能打开,可能只是部分地区、部分路径或部分用户有问题,先问清楚是哪个页面、哪个网络。dig返回的地址和你预期的服务器(或 CDN)地址不一致:先查 DNS 是否被改动或过期。
这组命令不能说明:单个网络位置的结果不代表所有用户;如果前面有 CDN,看到的状态码可能是 CDN 生成的错误页,不是源站的真实状态。可以再用手机流量打开一次作对照。
2. 第 2–5 分钟:机器还活着吗
先试着 SSH 登录。如果 SSH 连不上,先去云厂商控制台看实例状态、监控图和安全组,必要时用控制台自带的 VNC/串口登录;这种情况下 OpsMate 也连不上这台机器,帮不上忙。能登录的话:
uptime
nproc
free -h
df -h
df -i
uptime的 load average 要和nproc的核数对比:持续明显高于核数,说明有任务在排队(CPU 或 I/O)。free -h看available一列,而不是used:Linux 会把空闲内存拿来做缓存,used高不等于内存不够。df -h某个分区 100%,或df -i的 inode 100%:写入会失败,数据库和应用经常因此挂掉,转到 磁盘占用突然飙升 做分流,不要急着删文件。
这组命令不能说明:是哪个进程在占资源,也看不到故障发生那一刻的峰值;它们只是当前快照。
3. 第 5–8 分钟:入口和应用在不在跑
systemctl --failed --no-pager
systemctl status nginx --no-pager
sudo ss -ltnp
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
systemctl --failed列出启动失败的服务;空列表不代表应用正常,有些应用不是用 systemd 管的。ss -ltnp看 80/443 和应用端口有没有进程在监听(需要 sudo 才能看到进程名)。Nginx 在、应用端口却没人监听,基本对上 502 的常见原因。docker ps -a里某个容器是Restarting或Exited,转到 Docker 容器反复重启。
再在服务器上直接请求一次应用,绕开 DNS、CDN 和 Nginx(端口和路径只是示例,换成你的实际上游和一个安全的健康检查路径):
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 http://127.0.0.1:3000/
本机能返回正常状态码、外面却打不开,问题更可能在 Nginx、防火墙、证书或 DNS;本机也失败,就先查应用。注意:端口在监听不等于应用健康,应用可能在监听但每个请求都卡住或报错。
4. 第 8–12 分钟:只看故障窗口的日志
先问自己“大概从几点开始坏的”,然后只看那段时间附近的日志,不要从头翻:
journalctl -p err --since "30 min ago" --no-pager | tail -n 100
sudo tail -n 100 /var/log/nginx/error.log
docker logs --since 30m --tail 200 --timestamps YOUR_CONTAINER
sudo dmesg -T | grep -i -E 'out of memory|killed process' | tail -n 20
journalctl -p err只显示 err 及以上级别;很多应用把错误写在自己的日志文件里,这里没有不代表没出错。Nginx 的
error.log路径以你的配置为准;connect() failed (111: Connection refused)一类记录指向上游没在监听。docker logs从退出前的第一条异常看起,而不是只看最后一行。YOUR_CONTAINER换成实际容器名。dmesg里出现Out of memory/Killed process,说明内核在某个时间点杀过进程;时间要和故障时间对得上才算相关证据。如果日志里提到磁盘写满,可以再看 Docker 日志占满磁盘。
分享或提交这些日志前,先遮盖密码、令牌、连接串、客户邮箱和内部地址。
5. 第 12–15 分钟:动手前先写三行
在任何重启或修改之前,先写下来(发到自己的笔记或团队群都行):
现象:几点开始、谁受影响、外部 curl 结果。
证据:哪条命令、哪行输出支持你的判断;哪些还没确认。
最小动作 + 回退:准备做的那一个动作,做完怎么验证,失败了怎么退回去。
几个常见的最小动作,每一个都是需要你拍板的变更,不是诊断步骤:
只重启出问题的那一个服务或容器,而不是整台机器。重启会清掉进程内存里的现场;先把上面几步的输出复制保存下来。
修改 Nginx 配置前先备份原文件,改完用
sudo nginx -t检查语法,再安排 reload;出问题就把备份放回去再 reload。磁盘写满时,只清理已确认可以丢弃的内容,业务数据先备份或快照。
最近刚发布过版本、证据指向新代码:回滚到上一版本通常比半夜现场修更稳妥,前提是你知道数据库迁移能不能回退。
整机重启放到最后。重启前检查
/var/log/journal目录是否存在:不存在时,journal 可能只保存在内存里,重启后这次启动的日志会丢失。
做完动作后,再跑一遍第 1 步的外部 curl 和第 2 步的资源检查,确认恢复,并记下时间。
在 OpsMate 里怎么走这 15 分钟
OpsMate 把 SSH 终端和 AI 放在同一个服务器页面。上面的命令你可以直接在终端里手敲;记不清命令时,也可以用一句话把情况告诉 AI。AI 会提出排查命令,除了看日志,也可以用 ps、df、ss、docker、journalctl 这类命令做检查;命令跑完后,点击「需要分析」,AI 会根据输出给出结论。命令和输出都留在终端里,方便你核对,也方便事后复盘。人在外面时,巡检和 Telegram 告警可以先把异常推给你。只收 Telegram 告警不需要把凭证存到云端;想直接从 Telegram 远程 SSH 排障,才需要把该服务器的凭证托管到云端,参见 用 Telegram 收服务器告警。手机上具体怎么操作,见 在 Telegram 里处理服务器问题。
边界要说清楚:
SSH 连不上的机器,OpsMate 也连不上,要先走云厂商控制台。
AI 以排查为主:危险命令会被拦截。重启服务、日志轮转这类低风险处置默认会自动执行。本文里的回滚、改配置都由你决定。OpsMate 自己会做什么、不会做什么,以官网 常见问题 为准。
AI 的结论是排查起点,需要用命令输出核对,不能当作根因证明。
点击「需要分析」后,命令输出会发送给云端 AI 分析;桌面端默认保证的只是 SSH 凭证留在本机。输出里有客户信息或密钥时,不要直接点「需要分析」,先自己脱敏,再把脱敏后的片段交给 AI。
说明性示例
说明性示例(不是真实客户案例):凌晨两点,外部 curl 返回 502。服务器能登录,uptime 负载不高;systemctl status nginx 显示 Nginx 正常运行,但 ss -ltnp 里应用的 3000 端口没有进程监听。docker ps -a 显示应用容器反复 Restarting,docker logs 里第一条异常是数据库写入失败。回头看 df -h,根分区 100%。这时 502 只是表象,真正要处理的是磁盘:先按磁盘指南确认是日志还是业务数据占满,只清理确认可丢弃的内容,再观察容器是否自己恢复。如果在第一步就重启了整台机器,磁盘依然是满的,问题会在几分钟后重演,而且现场记录更少。
AI 排查提示词
网站从大约 30 分钟前开始打不开。请先只做检查、不做任何改动,看看这台服务器的:负载、可用内存、磁盘容量和 inode、失败的 systemd 服务、监听端口、Docker 容器状态,以及最近 30 分钟的系统、Nginx 和应用错误日志。请区分已证实的事实和推测,并列出还缺少哪些信息。不要重启服务、删除文件或修改配置;如果需要变更,先给出最小步骤、风险、验证方法和回退方案,等我确认。
试用
每月免费 500 次 AI 调用;服务器数量不限。桌面端默认把 SSH 凭证保留在本机。
需要帮助理解排查结果?
OpsMate 帮助开发者和运维人员用 AI 辅助排查,由你核对证据。点击「需要分析」后,命令输出会发送给云端 AI 分析,请先去除敏感信息。
免费开始 本地凭证桌面端