nginx 關於 proxy_pass 重試的問題
高洛峰
高洛峰 2017-05-16 17:23:48
0
1
797

各位大神,我的nginx會透過proxy_pass去調tomcat,但是tomcat會間歇性抽風(fullgc)導致超時,7-8秒吧

我想了一個辦法就是請求第一次的時候設定一個超時時間,比如說1s,如果超時了,就在請求一次(換一台機器)

然後我就有了下面這個nginx配置.(下面是用flask的sleep模擬tomcat的fullgc)

upstream up { server 127.0.0.1:8088; server 127.0.0.1:8089; } server { listen 8087; server_name localhost; access_log logs/host.access.log main; location / { proxy_connect_timeout 1s; proxy_send_timeout 1s; proxy_read_timeout 1s; proxy_next_upstream_timeout 1s; proxy_next_upstream_tries 1; send_timeout 1s; # proxy_next_upstream timeout error; proxy_pass http://up; } }

8088和8089的服務是我用寫的一個mock服務
8088會直接睡秒2s,導致nginx逾時
8089會直接回傳一個"hello world",200

我的期望是
當我用命令列curl反覆請求8087的時候,會始終返回"hello world",雖然有些請求比較快,有些請求比較慢(1s多,因為經過了一次超時請求之後重新進行的請求)

但是結果卻不是這樣

當請求超過1s後,8087他就直接回傳 504錯誤了

#

透過查看nginx後台日誌:
連續列印了3筆超時記錄:

#

但是8088(sleep的那個服務,)只收到了一個請求(有些小異常,用flask寫的)

#

然後我用wireshark抓包發現

#

求助各位大神?
我的配置哪裡有問題嗎??

這裡可能提提供了些無關資訊,如果沒用可以忽略哈~

如過有其他好的處理tomcat fullgc超時問題的,也非常感謝啊~

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆 (1)
给我你的怀抱

You asked for one try, then nginx tries that once.

try 和 retry 是不同的。你 proxy_next_upstream_tries 2; 試試。另外你似乎也誤解了 proxy_next_upstream_timeout 的意思。把它也去掉。

    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!