一、故障现象
今天本站突然无法访问,浏览器直接提示:504 Gateway Time-out

二、常规排查过程
1. 排查 Nginx 层面
查看Nginx 配置、错误日志,没有任何报错。
尝试修改Nginx代理超时参数、新增超时配置,无效。
2. 排查 Halo 容器状态
执行 docker ps 查看容器:
Halo容器状态正常
Up端口8090映射正常
容器端口映射配置无改动
3. 查看 Halo 运行日志
docker logs halo 查看日志:
服务正常启动
所有插件加载完成
无崩溃、无异常、无报错
4. 关键诡异现象
在服务器本地执行:
curl 127.0.0.1:8090
直观来说是直接卡死,完全无任何响应、也无超时提示。
重启 Halo 容器、重启 Nginx,完全无效。
三、临时解决办法
所有常规排查、配置修改、容器重启都没用,
我尝试直接重启整台云服务器后,网站立刻恢复正常。
四、故障根因分析
所以这不是 Nginx 配置问题、不是 Halo 程序 Bug、不是容器挂掉,
我初步判断真实原因是:
Linux 服务器长期不重启,内核 TCP 连接僵死 + Docker 网络栈僵死,导致 8090 端口被内核挂死、连接卡死。
因为这种情况有以下特征:
Docker 容器进程看着正常,实际网络通路已经僵死
服务日志无任何报错,属于底层网络卡死
本机curl本地端口直接卡死,不通也不报错
重启容器、改Nginx配置都无法释放内核僵死连接
只有整机重启才能重置TCP连接、重置Docker网络栈
五、优化方案
这时候配置一个定时任务,每周凌晨自动重启一次 Docker 服务,提前释放僵死连接,问题就很容易解决了。
因笔者使用的环境是宝塔+Docker+Halo环境,直接进入宝塔面板的【计划任务】页面添加定时任务即可。
1. 进入宝塔计划任务
登录宝塔 → 左侧菜单栏【计划任务】
2. 添加定时任务
任务类型:Shell 脚本
任务名称:随意
每日凌晨自动重启Docker+容器+Nginx执行周期:选择每天
执行时间:设
02:00(凌晨 2 点,低峰期无感知重启)脚本内容:
#!/bin/bash
# 重启Docker服务,释放内核僵死TCP连接
systemctl restart docker
# 等待10秒,确保Docker完全启动
sleep 10
# 重启Halo容器
docker restart halo
# 重启Nginx
systemctl restart nginx
3. 保存设置
点添加任务就完事了,每天凌晨 2 点自动执行,提前清理僵死网络连接。

4. 另一个方法
如果不是宝塔部署的环境,当然也可以使用Linux原生crontab命令配置脚本:
服务器SSH执行crontab -e
然后输入0 2 * * * systemctl restart docker && sleep 10 && docker restart halo && systemctl restart nginx
输入crontab -l即可查验是否成功:

六、复盘
笔者认为此次故障最迷惑人的点:
应用层、容器层、配置层全都正常,问题出在 Linux 内核底层 TCP 和 Docker 网络栈。
现实告诉我排查思维不能只盯着业务日志、程序配置,
遇到「服务看起来正常、端口访问卡死、无日志报错」的诡异 504,
优先怀疑:系统内核僵死连接、Docker 网络栈泄漏。
这种情况实际上软重置Docker网络,能清掉内核僵死连接,不用重启服务器,就能恢复网站。
也就是直接在服务器执行脚本内的三条重置命令即可(重启Docker网络栈、Halo容器、Nginx)
本篇完结,有遗漏的再补充~