最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker遇到502 Bad Gateway問(wèn)題的排查與解決方法

 更新時(shí)間:2026年04月30日 09:03:50   作者:drebander  
本文詳細(xì)描述了線上部署內(nèi)容服務(wù)時(shí)遇到的502 Bad Gateway問(wèn)題,表面現(xiàn)象指向Nginx和Docker網(wǎng)絡(luò),但最終發(fā)現(xiàn)根因在于應(yīng)用代碼中使用不可重入鎖導(dǎo)致的死鎖,通過(guò)調(diào)整鎖的類型并進(jìn)行部署,問(wèn)題得以解決,需要的朋友可以參考下

最近在部署一個(gè)內(nèi)容服務(wù)時(shí),遇到線上 502 Bad Gateway。這次故障非常典型:表面現(xiàn)象全部指向 Nginx 和 Docker 網(wǎng)絡(luò),最終根因卻在應(yīng)用代碼里的一把鎖。完整復(fù)盤如下。

一、項(xiàng)目背景

本次部署結(jié)構(gòu)很常見(jiàn):

  • 業(yè)務(wù)服務(wù)容器:story-service(FastAPI + Uvicorn)
  • 網(wǎng)關(guān)容器:nginx-gateway(反向代理)
  • 兩者都在同一臺(tái)服務(wù)器的 Docker 環(huán)境中
  • 設(shè)計(jì)上通過(guò)同一個(gè) Docker 網(wǎng)絡(luò)互通,Nginx 用容器名反代業(yè)務(wù)服務(wù)

部署完成后,用戶訪問(wèn)接口返回 502,開(kāi)始排查。

二、故障現(xiàn)象

1)宿主機(jī)探活失敗

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

返回:

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

2)容器內(nèi)探活也失敗

容器是精簡(jiǎn)鏡像,沒(méi)有 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

結(jié)果:

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

這一步非常關(guān)鍵:容器內(nèi)回環(huán)都連不上,說(shuō)明不是 Nginx 轉(zhuǎn)發(fā)層的問(wèn)題,應(yīng)用根本沒(méi)監(jiān)聽(tīng)端口。

三、排查命令與結(jié)論

1)查看容器狀態(tài)

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

用于判斷容器是否在異常重啟或退出。

2)查看實(shí)時(shí)日志

docker logs -f story-service

日志顯示數(shù)據(jù)庫(kù)初始化成功,但啟動(dòng)流程停在“確保管理員賬號(hào)”階段,沒(méi)有出現(xiàn) Uvicorn running on ... 監(jiān)聽(tīng)日志。

3)核對(duì)端口映射

docker port story-service

確認(rèn)了映射關(guān)系,但由于容器內(nèi)端口本身未監(jiān)聽(tīng),映射正確也無(wú)效。

4)核對(duì)啟動(dòng)參數(shù)

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

用于確認(rèn) uvicorn 啟動(dòng)參數(shù)和監(jiān)聽(tīng)端口是否一致。

5)核對(duì)網(wǎng)絡(luò)連通基礎(chǔ)

docker network inspect mynet

確認(rèn) Nginx 與業(yè)務(wù)容器都在同一網(wǎng)絡(luò)中,排除基礎(chǔ)網(wǎng)絡(luò)隔離問(wèn)題。

四、根因定位

根因在數(shù)據(jù)庫(kù)初始化鏈路的鎖重入:

  • 應(yīng)用啟動(dòng)時(shí)執(zhí)行 ensure_admin_user()
  • ensure_admin_user() 內(nèi)部可能調(diào)用 create_user()
  • create_user() 又會(huì)走到 get_conn()
  • 多個(gè)函數(shù)嘗試獲取同一把鎖
  • 代碼使用的是 threading.Lock()(不可重入)

結(jié)果是同線程重復(fù)加鎖,啟動(dòng)階段發(fā)生死鎖。進(jìn)程沒(méi)有直接崩潰,但 startup 卡住,服務(wù)端口始終不監(jiān)聽(tīng),最終表現(xiàn)為 502。

五、修復(fù)方式

將數(shù)據(jù)庫(kù)模塊鎖改為可重入鎖:

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

修復(fù)后重新部署,日志出現(xiàn)正常監(jiān)聽(tīng)信息,容器內(nèi) health 可達(dá),Nginx 502 消失,服務(wù)恢復(fù)。

六、兩個(gè)排障細(xì)節(jié)

1)docker exec+ heredoc 不要用-t

錯(cuò)誤寫法會(huì)報(bào):

the input device is not a TTY

正確寫法是 -i

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

2)python:slim沒(méi)有curl/ss是常態(tài)

不必先改鏡像,直接用 Python 內(nèi)置庫(kù)做 HTTP 探活即可完成核心定位。

七、復(fù)盤總結(jié)

這次故障最容易誤判為“網(wǎng)絡(luò)問(wèn)題”,但真正根因是“應(yīng)用啟動(dòng)死鎖”。
有效的排障順序是:

  1. 先看應(yīng)用是否真正監(jiān)聽(tīng)端口(容器內(nèi)回環(huán)探活)
  2. 再看端口映射
  3. 最后看 Nginx 與 Docker 網(wǎng)絡(luò)

當(dāng) 502 出現(xiàn)時(shí),先證明“后端服務(wù)真的活著”,再談代理層配置,效率最高。

到此這篇關(guān)于Docker遇到502問(wèn)題的排查與解決方法的文章就介紹到這了,更多相關(guān)Docker遇到502問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker中使用mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)局域網(wǎng)訪問(wèn)

    docker中使用mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)局域網(wǎng)訪問(wèn)

    在本篇內(nèi)容里小編給大家整理了關(guān)于docker中使用mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)局域網(wǎng)訪問(wèn)相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 使用docker指令如何刪除所有不再使用的鏡像

    使用docker指令如何刪除所有不再使用的鏡像

    這篇文章主要介紹了使用docker指令如何刪除所有不再使用的鏡像問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Docker創(chuàng)建運(yùn)行多個(gè)mysql容器的方法示例

    Docker創(chuàng)建運(yùn)行多個(gè)mysql容器的方法示例

    這篇文章主要介紹了Docker創(chuàng)建運(yùn)行多個(gè)mysql容器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 用docker部署RabbitMQ環(huán)境的詳細(xì)介紹

    用docker部署RabbitMQ環(huán)境的詳細(xì)介紹

    這篇文章主要介紹了用docker部署RabbitMQ環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 使用Docker部署OpenClaw的完整流程

    使用Docker部署OpenClaw的完整流程

    本文詳細(xì)介紹了從源碼編譯到Docker容器化部署OpenClaw的過(guò)程,包括編譯打包、啟動(dòng)容器、配置Token以及遷移部署的步驟和注意事項(xiàng),需要的朋友可以參考下
    2026-03-03
  • Docker鏡像下載的常見(jiàn)問(wèn)題及解決辦法

    Docker鏡像下載的常見(jiàn)問(wèn)題及解決辦法

    在使用Docker時(shí),用戶常遇到下載鏡像錯(cuò)誤,如TLS握手超時(shí)、請(qǐng)求取消等,主要由網(wǎng)絡(luò)狀況、配置問(wèn)題或DockerHub服務(wù)導(dǎo)致,本文就來(lái)介紹了一下幾種解決方法,感興趣的可以了解一下
    2024-10-10
  • Docker使用Dockerfile來(lái)創(chuàng)建鏡像

    Docker使用Dockerfile來(lái)創(chuàng)建鏡像

    本篇文章主要介紹了Docker使用Dockerfile來(lái)創(chuàng)建鏡像,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Docker 數(shù)據(jù)存儲(chǔ)路徑之解決默認(rèn)docker路徑位置磁盤空間不足的問(wèn)題

    Docker 數(shù)據(jù)存儲(chǔ)路徑之解決默認(rèn)docker路徑位置磁盤空間不足的問(wèn)題

    本文指導(dǎo)如何通過(guò)修改daemon.json將Docker數(shù)據(jù)目錄從/var/lib/docker遷移至/mnt/disk/docker,保留所有鏡像、容器等數(shù)據(jù),無(wú)需調(diào)整docker.service,步驟包括停止服務(wù)、遷移數(shù)據(jù)、修改配置及重啟驗(yàn)證,需要的朋友跟隨小編一起學(xué)習(xí)吧
    2025-08-08
  • docker的overlay2中存的都是什么及如何清理/var/lib/docker/overlay2

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

    docke roverlay2是Docker中的存儲(chǔ)驅(qū)動(dòng)之一,用于管理鏡像和容器層的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于docker的overlay2中存的都是什么及如何清理/var/lib/docker/overlay2的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Docke容器分離部署LNMP的實(shí)現(xiàn)

    Docke容器分離部署LNMP的實(shí)現(xiàn)

    這篇文章主要介紹了Docke容器分離部署LNMP的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論

平顺县| 叶城县| 峨山| 湟源县| 普兰县| 徐水县| 阳江市| 蓬莱市| 台前县| 巴中市| 绥化市| 法库县| 探索| 斗六市| 广汉市| 渝北区| 来宾市| 炉霍县| 屏边| 茶陵县| 沽源县| 屏东市| 绥江县| 麻城市| 永济市| 横山县| 凤庆县| 镇赉县| 昌都县| 余江县| 城市| 淄博市| 棋牌| 宁乡县| 岑巩县| 临安市| 聂荣县| 高雄市| 阳高县| 文成县| 长泰县|