Docker遇到502 Bad Gateway问题的排查与解决方法

 更新时间:2026年04月30日 09:03:50   作者:drebander  
本文详细描述了线上部署内容服务时遇到的502 Bad Gateway问题,表面现象指向Nginx和Docker网络,但最终发现根因在于应用代码中使用不可重入锁导致的死锁,通过调整锁的类型并进行部署,问题得以解决,需要的朋友可以参考下

最近在部署一个内容服务时,遇到线上 502 Bad Gateway。这次故障非常典型:表面现象全部指向 Nginx 和 Docker 网络,最终根因却在应用代码里的一把锁。完整复盘如下。

一、项目背景

本次部署结构很常见:

  • 业务服务容器:story-service(FastAPI + Uvicorn)
  • 网关容器:nginx-gateway(反向代理)
  • 两者都在同一台服务器的 Docker 环境中
  • 设计上通过同一个 Docker 网络互通,Nginx 用容器名反代业务服务

部署完成后,用户访问接口返回 502,开始排查。

二、故障现象

1)宿主机探活失败

curl -i http://127.0.0.1:8070/health

返回:

curl: (56) Recv failure: Connection reset by peer

2)容器内探活也失败

容器是精简镜像,没有 curl/ss,改用 Python 探活:

docker exec -i story-service python - <<'PY'
import urllib.request
for p in (8080, 8070):
    url=f"http://127.0.0.1:{p}/health"
    try:
        with urllib.request.urlopen(url, timeout=3) as r:
            print(url, "OK", r.status, r.read().decode("utf-8", "ignore"))
    except Exception as e:
        print(url, "FAIL", repr(e))
PY

结果:

  • http://127.0.0.1:8080/health -> Connection refused
  • http://127.0.0.1:8070/health -> Connection refused

这一步非常关键:容器内回环都连不上,说明不是 Nginx 转发层的问题,应用根本没监听端口。

三、排查命令与结论

1)查看容器状态

docker ps -a --filter "name=story-service"

用于判断容器是否在异常重启或退出。

2)查看实时日志

docker logs -f story-service

日志显示数据库初始化成功,但启动流程停在“确保管理员账号”阶段,没有出现 Uvicorn running on ... 监听日志。

3)核对端口映射

docker port story-service

确认了映射关系,但由于容器内端口本身未监听,映射正确也无效。

4)核对启动参数

docker inspect story-service --format '{{.Path}} {{range .Args}}{{.}} {{end}}'

用于确认 uvicorn 启动参数和监听端口是否一致。

5)核对网络连通基础

docker network inspect mynet

确认 Nginx 与业务容器都在同一网络中,排除基础网络隔离问题。

四、根因定位

根因在数据库初始化链路的锁重入:

  • 应用启动时执行 ensure_admin_user()
  • ensure_admin_user() 内部可能调用 create_user()
  • create_user() 又会走到 get_conn()
  • 多个函数尝试获取同一把锁
  • 代码使用的是 threading.Lock()(不可重入)

结果是同线程重复加锁,启动阶段发生死锁。进程没有直接崩溃,但 startup 卡住,服务端口始终不监听,最终表现为 502。

五、修复方式

将数据库模块锁改为可重入锁:

  • threading.Lock() 改为 threading.RLock()

修复后重新部署,日志出现正常监听信息,容器内 health 可达,Nginx 502 消失,服务恢复。

六、两个排障细节

1)docker exec+ heredoc 不要用-t

错误写法会报:

the input device is not a TTY

正确写法是 -i

docker exec -i story-service python - <<'PY'
...
PY

2)python:slim没有curl/ss是常态

不必先改镜像,直接用 Python 内置库做 HTTP 探活即可完成核心定位。

七、复盘总结

这次故障最容易误判为“网络问题”,但真正根因是“应用启动死锁”。
有效的排障顺序是:

  1. 先看应用是否真正监听端口(容器内回环探活)
  2. 再看端口映射
  3. 最后看 Nginx 与 Docker 网络

502 出现时,先证明“后端服务真的活着”,再谈代理层配置,效率最高。

到此这篇关于Docker遇到502问题的排查与解决方法的文章就介绍到这了,更多相关Docker遇到502问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何修改Docker镜像的映射端口号

    如何修改Docker镜像的映射端口号

    这篇文章主要介绍了如何修改Docker镜像的映射端口号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Docker常见问题深度剖析(多种类似命令之间的区别)

    Docker常见问题深度剖析(多种类似命令之间的区别)

    本文剖析了Docker的底层命令,包括容器的生命周期管理、镜像数据的持久化与迁移,以及资源的回收机制,本文将围绕容器的生命周期管理(Create/Start/Run)、镜像的持久化与迁移(Import/Load)以及资源的回收机制(Rm/Rmi/Prune)展开剖析,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Docker创建tomcat容器实例后无法访问(HTTP状态404)

    Docker创建tomcat容器实例后无法访问(HTTP状态404)

    本文主要介绍了Docker创建tomcat容器实例后无法访问,HTTP状态显示404,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 关于构建aarch64环境Mysql8.0的Docker镜像问题

    关于构建aarch64环境Mysql8.0的Docker镜像问题

    这篇文章主要介绍了构建aarch64环境Mysql8.0的Docker镜像,需要的朋友可以参考下
    2022-04-04
  • Dockerfile 中 VOLUME 与 docker -v 的区别说明

    Dockerfile 中 VOLUME 与 docker -v 的区别说明

    这篇文章主要介绍了Dockerfile 中 VOLUME 与 docker -v 的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 如何查看docker镜像的dockerfile

    如何查看docker镜像的dockerfile

    这篇文章主要介绍了如何查看docker镜像的dockerfile问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Docker Compose在不同环境的多种安装方式

    Docker Compose在不同环境的多种安装方式

    这篇文章主要介绍了Docker Compose在不同环境的多种安装方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Docker部署springboot项目到腾讯云的实现步骤

    Docker部署springboot项目到腾讯云的实现步骤

    本文主要介绍了Docker部署springboot项目到腾讯云的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • docker设置代理通过代理服务器拉取镜像方式

    docker设置代理通过代理服务器拉取镜像方式

    这篇文章主要介绍了docker设置代理通过代理服务器拉取镜像方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Docker部署MySQL主从复制的实现

    Docker部署MySQL主从复制的实现

    本文主要介绍了Docker部署MySQL主从复制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10

最新评论