1. 程式人生 > >nginx反向代理tomcat一段時間後出現的ERR_CONTENT_LENGTH_MISMATCH異常

nginx反向代理tomcat一段時間後出現的ERR_CONTENT_LENGTH_MISMATCH異常

使用nginx代理tomcat上的web專案。專案上線了一段時候後,訪問專案出現了css檔案或js檔案的ERR_CONTENT_LENGTH_MISMATCH異常,而不能載入這些檔案。

查詢網上給出的解答,一般是說在nginx的proxy_temp下的快取檔案的所有者不是nginx啟動者而導致啟動者不能訪問這些快取檔案而出現這個問題,需要將所有者改為啟動者,ps nginx可以檢視啟動者是誰;另外還需要在nginx的配置檔案nginx.conf中,在worker_processes  1;之前加上user root;比如root為啟動者。這樣可以正常訪問快取檔案,而不會出現這個問題了。

檢視自己的伺服器,確實proxy_temp的所有者是nobody,而啟動者是root,為了方便,直接將proxy_temp下的快取檔案全部rm,並且也修改了nginx.conf檔案。果然,再次訪問專案,正常了,不報ERR_CONTENT_LENGTH_MISMATCH異常了。

結果,到第二天,訪問專案時,又出現這個異常了。為了排查問題,直接使用tomcat的8080埠訪問專案,沒有問題,說明可能還是nginx代理的問題。於是,試圖檢視nginx.conf檔案,結果vi時,提示出現Write error in swap file問題。查詢,同目錄下,沒有.swap檔案,所以不是上次錯誤退出而導致的nginx.conf.swap檔案沒有清除的問題。經查,是因為/磁碟滿了。df -h確實/掛載點滿了。看來需要先解決磁碟滿的問題。於是從/開始,du -h --max-depth=1,一層一層追查,到底是哪些個無關緊要的檔案過於龐大,以便刪除之。最後的結果竟然是nginx/logs/access.log高達幾個G的大小,將磁碟撐滿。雖然日誌檔案很重要,但是,正常執行也很重要,如果確實需要日誌檔案,可以先將其備份出來,再刪除。刪除access.log檔案後,試著訪問專案,正常了。

推測,這個問題的原因可能是,由於磁碟滿了,nginx嘗試將訪問記錄寫入access.log時失敗,於是可能不能按照其原來的步驟,也就是寫入log,讀取proxy_temp下的快取檔案,響應給客戶端,由於不能正常讀取快取,導致客戶端不能得到快取中的某些大檔案,如css或js等。nginx底層究竟是不是這樣運作的,筆者不知道。這個只是猜測。不管怎樣,問題解決了。隨便,又查看了下tomcat的logs檔案,確實也佔了很大的空間,看來,就算沒有出現這個問題,對於增量大而快的日誌檔案也是要妥善處理的,否則,伺服器遲早會吃飽。