http的keepalive參數設置策略

1.項目環境:nginx(前段代理,僅作代理用途)+3個tomcat(都在同一個服務器上),做的web項目

2.涉及到的業務邏輯:文件上傳(可能有大文件,比如說android遊戲,100m);客戶端接口請求;網站後臺管理

3.問題重現流程:

   3.1 配置好tomcat後,直接加上nginx前段代理(僅配置了http代理)

   3.2 問題一:當管理員後臺上傳文件時,大文件無法上傳成功,出現time-out,經重複測試,發現上傳時間超過1分鐘以後,就會返回超時信息,小文件沒有問題

   3.2 經調研得知nginx默認設置的http連接超時時間爲75s,超過75s,會斷掉當前的http連接,而大文件上傳時經常會超過75s,這就導致大文件無法上傳成功,當時的解決方案是,設置nginx http連接超時時間爲30分鐘,即參數keepalive_timeout=1800;文件上傳問題基本解決;

   3.4項目運行2天后,發現服務器突然宕機了,重啓nginx可以解決問題,但是2個小時後又再次宕機,重啓nginx又解決了問題,調研了一箇中午,並且查看nginx的錯誤日誌(socket() failed (24: Too many open files) while connecting to upstream),發現問題來源與nginx的連接數(設置的默認值爲1024)達到上限

   3.5發現這個問題後,我就想應該把nginx的連接數調大點,於是設置 worker_connections  10240;重啓nginx,短時間沒有出現問題,但是運行過程中,我再次查看錯誤日誌,發現(socket() failed (24: Too many open files) while connecting to upstream)時不時的出現

   3.6 此時發現調整nginx的連接數並不能完全解決問題,於是google,百度之,發現問題所在,罪魁禍首是:nginx的keepalive_timeout(參看http://fengzheng369.blog.163.com/blog/static/752209792012418103813580/ )設置項時間太長,客戶端接口訪問其實是一個比較快速的過程,訪問完成了已經不需要繼續使用http連接了,但是由於對nginx的錯誤配置,導致接口訪問完成後http連接並沒有被釋放掉,所以導致連接數越來越大,最終nginx崩潰。

 

4.那麼這個問題應該如何解決呢?

將keepalive_timeout時間調小會導致上傳操作可能無法完成;調大點的話,許多無效的http連接佔據着nginx的連接數

這貌似是一個兩難的問題

 

先寫到這,正在尋找解決方案


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章