Nginx

當上游健康時,什麼會導致 Nginx “對等連接重置”?

  • March 24, 2020

在 AWS Beanstalk 部署(單伺服器)上,Nginx 伺服器與同一主機上的 NodeJS/Express 伺服器通信偶爾會抱怨與上游的連​​接失去。

2020/03/23 10:52:43 [error] 11443#0: *70 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.46.70, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"
2020/03/23 10:52:48 [error] 11444#0: *580 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "POST /api/app/importNutriwebData HTTP/1.1", upstream: "http://172.17.0.3:33080/api/app/importNutriwebData", host: "******"
2020/03/23 10:52:50 [error] 11443#0: *526 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"

發生這種情況沒有任何明顯的原因,包括/health-check非常簡單的response.send("OK");. 它似乎發生在隨機 URL 上。

上游 172.17.0.3 位於執行 Nginx 的同一台機器上。所有下游連接都來自 CloudFront。

在過去的 3-4 年中,相同的設置執行良好,但這些錯誤在 2-3 天后開始增加。我想不出任何可能已經改變的東西,除了可能多出 10% 左右的請求。可能有大約 50 個長期存在的 EventStream 連接,但不會超過 100 個並發連接。我很確定 NodeJS 伺服器沒問題。

我還嘗試升級 Amazon Linux、重啟伺服器、重建整個 EBS 部署——沒有任何改變。

我可以對上游curlURL(http://172.17.0.3:33080/health-check

伺服器有大約 1.5 GB 的可用RAM ,CPU 處於大約 80% 的空閒狀態

打開文件句柄對我來說似乎很低:

$ for pid in $(pidof nginx) ; do sudo ls /proc/$pid/fd | wc -w ; done
130
169
11

$ for pid in $(pidof node) ; do sudo ls /proc/$pid/fd | wc -w ; done
146

會不會是 Nginx 耗盡了某種資源?是時間問題嗎?我能做些什麼來進一步調試呢?

非常感謝任何幫助。

看起來您的 NodeJS 應用程序出於某種原因正在向 nginx 發送 RST 數據包。您可以嘗試tcpdump和/或strace在錯誤發生時擷取網路流量和系統呼叫;然後調查是否有奇怪的事情發生。

這個資源可能很有用,它似乎描述了一個非常相似的問題,與keepalive 超時有關: http: //theantway.com/2017/11/analyze-connection-reset-error-in-nginx-upstream-with-keep-啟動的

引用自:https://serverfault.com/questions/1007979