Appearance
Web 应用故障排查与应急响应指南
目标:从“只会照着教程部署”,进阶到“出了问题能自己定位并解决”。
当客户反馈“网站打不开”或“接口请求失败”时,切忌盲目重启服务器或乱改代码。请严格按照本文的排查模型逐步缩小问题范围。
1. 故障排查漏斗模型
故障排查就像漏斗,必须从最外层的网络一直排查到最内层的应用和数据库。任何一步不通,都不要去查下一步。
text
请求发起
│
▼
[1. DNS 解析] ─────── 域名是否正确解析到了服务器 IP?
│
▼
[2. 网络连通性] ───── 服务器公网 IP 是否能 Ping 通?
│
▼
[3. 端口与防火墙] ─── 80/443 或特定业务端口是否开放?
│
▼
[4. Nginx 网关] ───── Nginx 是否在运行?配置是否正确拦截了请求?
│
▼
[5. 应用服务] ─────── 后端 API 容器/进程是否存活?内部是否报错?
│
▼
[6. 外部依赖] ─────── 数据库、Redis 或第三方接口是否挂了?2. 分层排查实战命令
根据上述漏斗模型,对应执行以下验证命令:
2.1 检查 DNS 与网络
- 命令:
ping yourdomain.com - 目的:看返回的 IP 是否是你的服务器 IP。如果 IP 不对,去云平台检查 DNS 解析记录;如果超时,可能是禁 Ping 或服务器彻底宕机。
2.2 检查端口与防火墙
- 命令 (外部测试):在本地电脑执行
telnet your_server_ip 80或curl -I http://your_server_ip。 - 命令 (服务器内检查):登录服务器执行
sudo netstat -tulpn | grep 80。 - 判断:如果服务器内显示端口监听正常,但外部连不上,100% 是云平台安全组或系统防火墙 (
ufw/firewalld) 没放行。
2.3 检查应用服务状态
- Docker 部署:
docker ps检查容器是否是Up状态。如果是Exited,说明程序崩溃了。 - Systemd 部署:
systemctl status your-service检查是否是active (running)。
4. 常见 HTTP 错误码深度解析
当请求成功到达服务器,但返回了错误页面时,错误码是定位问题的最佳线索。
🚨 502 Bad Gateway (网关错误)
这是 Nginx 最常见的报错。意思是 Nginx 正常收到了用户的请求,但Nginx 找不到后端服务。
- 根本原因 1:后端程序根本没启动。
- 排查:
docker ps看 API 容器是不是挂了。
- 排查:
- 根本原因 2:Nginx 配置的转发端口写错了。
- 排查:检查
proxy_pass http://127.0.0.1:5000;这里的端口,后端真的在监听 5000 吗?
- 排查:检查
- 根本原因 3:Docker 网络隔离。
- 排查:如果 Nginx 和 API 都在容器里,
proxy_pass不能写127.0.0.1,必须写 API 的容器名(且需在同一网络下)。
- 排查:如果 Nginx 和 API 都在容器里,
🚨 403 Forbidden (禁止访问)
- 根本原因 1:文件/目录权限不足。
- 排查:Nginx 运行用户(通常是
www-data或nginx)对前端静态文件目录没有读权限。执行chmod -R 755 /path/to/web。
- 排查:Nginx 运行用户(通常是
- 根本原因 2:缺少默认首页。
- 排查:访问了一个目录,但目录下没有
index.html,且 Nginx 没有开启目录浏览权限。
- 排查:访问了一个目录,但目录下没有
🚨 404 Not Found (未找到资源)
- 前端资源 404:部署的路径写错了,或者 Nginx
root / alias路径配置不正确。 - Vue/React 刷新 404:单页应用 (SPA) 路由未交给前端接管。
- 修复:Nginx 配置中必须添加
try_files $uri $uri/ /index.html;。
- 修复:Nginx 配置中必须添加
- API 接口 404:后端路由未匹配,或者 Nginx 反向代理配置少写了
/api前缀。
🚨 500 Internal Server Error (服务器内部错误)
这是后端代码本身出了问题。Nginx 把请求交给了后端,后端代码在执行时抛出了未捕获的异常(Exception)。
- 排查动作:立刻去看后端的日志!
- Docker:
docker logs --tail=100 your-api-container - Systemd:
journalctl -u your-api-service -n 100
- Docker:
- 常见原因:
- 数据库连不上(密码错、IP错、防火墙拦截)。
- 代码里存在空指针引用 (Null Reference)。
- SQL 语法错误或缺少对应的表字段。
5. 服务突发中断应急响应 SOP
当接到“服务彻底挂了”的紧急通知时,按以下步骤处理:
Step 1: 止血与现场保护
- 立即查看监控/资源状态:执行
htop或top。- 如果 CPU 或内存达到 100%,极有可能是遭到了 CC 攻击或存在严重的内存泄漏。
- 检查磁盘是否爆满:执行
df -h。- 如果磁盘使用率 100%:数据库会直接锁死,应用无法写入日志从而崩溃。立刻清理
/var/log或 Docker 废弃镜像 (docker image prune -a)。
- 如果磁盘使用率 100%:数据库会直接锁死,应用无法写入日志从而崩溃。立刻清理
Step 2: 定位死因
看系统状态:
docker ps看看哪些容器挂了。抓取临终日志:不要急着重启!先抓取挂掉之前的日志:
bashdocker logs --tail=500 api-container > crash_log.txt
Step 3: 恢复服务
如果是内存耗尽导致的 OOM (Out of Memory),重启服务通常能短暂恢复业务。
bashdocker compose restart如果是代码 Bug 或数据库锁死,联系研发紧急回滚上一版本。
Step 4: 预防复发
- 将故障原因、排查过程、最终解决方案整理为复盘文档,补充到本知识库中。
- 考虑增加 Prometheus/Grafana 等自动化监控报警体系。
Generated by Ark Gardener based on ops practices.
