原文地址:http://lixiangfeng.com/blog/article/content/7982719
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連接了,但是由於對nginx的錯誤配置,導致接口訪問完成后http連接並沒有被釋放掉,所以導致連接數越來越大,最終nginx崩潰。
4.那么這個問題應該如何解決呢?
將keepalive_timeout時間調小會導致上傳操作可能無法完成;調大點的話,許多無效的http連接占據着nginx的連接數
這貌似是一個兩難的問題
先寫到這,正在尋找解決方案
方案一:將接口請求,后台管理,文件上傳這三個業務邏輯分開,nginx對這三種業務邏輯分開轉發,每個業務邏輯單獨設置一個keepalive-timeout(未實驗)