nginx 關(guān)于 proxy_pass 重試的問(wèn)題
問(wèn)題描述
各位大神,我的nginx會(huì)通過(guò)proxy_pass去調(diào)tomcat,但是tomcat會(huì)間歇性抽風(fēng)(fullgc)導(dǎo)致超時(shí),7-8秒吧
我想了一個(gè)辦法就是請(qǐng)求第一次的時(shí)候設(shè)置一個(gè)超時(shí)時(shí)間,比如說(shuō)1s,如果超時(shí)了,就在請(qǐng)求一次(換一臺(tái)機(jī)器)
然后我就有了下面這個(gè)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的服務(wù)是我用寫(xiě)的一個(gè)mock服務(wù)8088會(huì)直接睡秒2s,導(dǎo)致nginx超時(shí)8089會(huì)直接返回一個(gè)'hello world',200
我的期望是當(dāng)我用命令行 curl反復(fù)請(qǐng)求8087的時(shí)候,會(huì)始終返回 'hello world',雖然有些請(qǐng)求比較快,有些請(qǐng)求比較慢(1s多,因?yàn)榻?jīng)過(guò)了一次超時(shí)請(qǐng)求之后重新進(jìn)行的請(qǐng)求)
但是結(jié)果卻并不是這樣
當(dāng)請(qǐng)求超過(guò)1s后,8087他就直接返回 504錯(cuò)誤了
通過(guò)查看nginx后臺(tái)日志:連續(xù)打印了3條超時(shí)記錄:
但是8088(sleep的那個(gè)服務(wù),)僅僅只收到了一個(gè)請(qǐng)求(有些小異常,用flask寫(xiě)的)
然后我用wireshark抓包發(fā)現(xiàn)
求助各位大神?我的配置哪里有問(wèn)題嗎??
這里可能提提供了些無(wú)關(guān)信息,如果沒(méi)用可以忽略哈~
如過(guò)有其他好的處理tomcat fullgc超時(shí)問(wèn)題的,也非常感謝啊~
問(wèn)題解答
回答1:You asked for one try, then nginx tries that once.
try 和 retry 是不同的。你 proxy_next_upstream_tries 2; 試試。另外你似乎也誤解了 proxy_next_upstream_timeout 的意思。把它也去掉。
相關(guān)文章:
1. 老師 我是一個(gè)沒(méi)有學(xué)過(guò)php語(yǔ)言的準(zhǔn)畢業(yè)生 我希望您能幫我一下2. mysql如何配置遠(yuǎn)程php外網(wǎng)鏈接數(shù)據(jù)庫(kù)3. mysql - eclispe無(wú)法打開(kāi)數(shù)據(jù)庫(kù)連接4. 數(shù)據(jù)庫(kù) - mysql中有沒(méi)查看數(shù)據(jù)大小的函數(shù)??6. 導(dǎo)入數(shù)據(jù)庫(kù)不成功7. PHP單例模式8. mysql - 關(guān)于數(shù)據(jù)緩存策略方面的疑惑9. mysql如何判斷數(shù)據(jù)不存在則插入呢?10. mysql無(wú)法刪除字段(錯(cuò)誤1091),但是對(duì)該字段設(shè)置主鍵后就可刪除,為什么?
