加载中

Loading...

文章背景图

记一次诡异的504超时:容器正常、日志无错、仅重启服务器恢复

2026-05-14
2
-
- 分钟
|

一、故障现象

今天本站突然无法访问,浏览器直接提示: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 端口被内核挂死、连接卡死。

因为这种情况有以下特征:

  1. Docker 容器进程看着正常,实际网络通路已经僵死

  2. 服务日志无任何报错,属于底层网络卡死

  3. 本机curl本地端口直接卡死,不通也不报错

  4. 重启容器、改Nginx配置都无法释放内核僵死连接

  5. 只有整机重启才能重置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)

本篇完结,有遗漏的再补充~

评论交流

文章目录