通過Nginx訪問後端應用,ERR_CONTENT_LENGTH_MISMATCH 問題的解決

遇到兩個問題
1. 選擇日期功能,不起作用了
2. 下載稍大一點的文件,只能下載一小半
頁面調試發現有ERR_CONTENT_LENGTH_MISMATCH錯誤

系統:CentOS,Nginx,proxy到後端的tomcat

原因:nginx會緩存大文件到proxy_temp目錄中,然而對這個目錄沒有讀寫權限


解決過程:

頁面調試,拋出錯誤:net::ERR_CONTENT_LENGTH_MISMATCH
在chrome下,請緩存或強制刷新,response的status code爲200
不強制刷新,response的status code爲206
response header裏面,content-length 的長度和目標文件的實際長度是一致的
都會出上面這個content length mismatch錯誤
如果不通過nginx,直接訪問tomcat,沒有這個錯誤,系統功能正常。

各種搜,先查到了一個帖子,問題描述很相似,提到是nginx gzip壓縮,由於nginx對文件做了壓縮準備,按照壓縮後的長度來處理數據流,但通過proxy傳過來的數據實際沒有被壓縮,沒有傳完,ngnix就關閉連接了。
從log來看,tomcat這邊確實出現了很多org.apache.catalina.connector.ClientAbortException,與前面出現ERRO_CONTENT_LENGTH_MISMATCH的請求相匹配。

開始學習nginx gzip的配置(準備另做一篇筆記)

問題沒有解決,先睡覺,醒了繼續搞

醒了,還是沒頭緒,老老實實去查log
/var/log/nginx/error.log
啊哈,問題在這裏:
[plain] view plain copy
  1. 2015/05/30 00:11:53 [crit] 8808#0: *60 open() "/var/cache/nginx/proxy_temp/2/01/0000000012" failed (13: Permission denied) while reading upstream, client:...  

proxy_temp目錄,owner是root,rwx權限,其他用戶沒有權限。
nginx是以nginx用戶身份運行的,沒有權限,boom!

解決方法:
1. 用root身份運行nginx
2. 將proxy_temp目錄的owner設置爲nginx
3. 將proxy_temp目錄的group設置爲nginx,並賦予rwx權限
4. 禁用cache

不想用root去運行nginx,選擇了方法3,讓系統先work

遺留的問題:
1. proxy_temp目錄的owner一開始爲什麼是root?應該是root嗎?
2. 選擇方法3後,發現對於同一個文件,會生成多份cache,這不合理,爲什麼會這樣?
3. 對於我們這個情況,需要cache嗎?會不會禁用cache纔是更合理的選擇

>> to be continued

黃鶴
2015-05-30

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