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中使用mysql数据库实现局域网访问

    docker中使用mysql数据库实现局域网访问

    在本篇内容里小编给大家整理了关于docker中使用mysql数据库实现局域网访问相关内容,有需要的朋友们可以学习下。
    2020-03-03
  • 使用docker指令如何删除所有不再使用的镜像

    使用docker指令如何删除所有不再使用的镜像

    这篇文章主要介绍了使用docker指令如何删除所有不再使用的镜像问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Docker创建运行多个mysql容器的方法示例

    Docker创建运行多个mysql容器的方法示例

    这篇文章主要介绍了Docker创建运行多个mysql容器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 用docker部署RabbitMQ环境的详细介绍

    用docker部署RabbitMQ环境的详细介绍

    这篇文章主要介绍了用docker部署RabbitMQ环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 使用Docker部署OpenClaw的完整流程

    使用Docker部署OpenClaw的完整流程

    本文详细介绍了从源码编译到Docker容器化部署OpenClaw的过程,包括编译打包、启动容器、配置Token以及迁移部署的步骤和注意事项,需要的朋友可以参考下
    2026-03-03
  • Docker镜像下载的常见问题及解决办法

    Docker镜像下载的常见问题及解决办法

    在使用Docker时,用户常遇到下载镜像错误,如TLS握手超时、请求取消等,主要由网络状况、配置问题或DockerHub服务导致,本文就来介绍了一下几种解决方法,感兴趣的可以了解一下
    2024-10-10
  • Docker使用Dockerfile来创建镜像

    Docker使用Dockerfile来创建镜像

    本篇文章主要介绍了Docker使用Dockerfile来创建镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Docker 数据存储路径之解决默认docker路径位置磁盘空间不足的问题

    Docker 数据存储路径之解决默认docker路径位置磁盘空间不足的问题

    本文指导如何通过修改daemon.json将Docker数据目录从/var/lib/docker迁移至/mnt/disk/docker,保留所有镜像、容器等数据,无需调整docker.service,步骤包括停止服务、迁移数据、修改配置及重启验证,需要的朋友跟随小编一起学习吧
    2025-08-08
  • docker的overlay2中存的都是什么及如何清理/var/lib/docker/overlay2

    docker的overlay2中存的都是什么及如何清理/var/lib/docker/overlay2

    docke roverlay2是Docker中的存储驱动之一,用于管理镜像和容器层的数据,这篇文章主要给大家介绍了关于docker的overlay2中存的都是什么及如何清理/var/lib/docker/overlay2的相关资料,需要的朋友可以参考下
    2024-04-04
  • Docke容器分离部署LNMP的实现

    Docke容器分离部署LNMP的实现

    这篇文章主要介绍了Docke容器分离部署LNMP的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论