如果不重新啟動或修改配置,nginx 有時會發送不完整的回應。今天,我可以很好地重現,但仍然不知道出了什麼問題或如何修復。
我將一個 5MB 檔案放入 nginx 設定使用的網站位置/別名路徑。沒有 php5-fpm、模組等,只有 nginx 來提供靜態檔案。
測試時,沒有其他用戶訪問伺服器,除了我的測試請求之外,沒有http訪問。
下載失敗,Google Chrome 在流量日誌中顯示有 2 個請求,儘管我只輸入了一次下載的 http url,並且沒有由我自己發起的重定向或其他第二個請求。
伺服器的 access.log 也有同樣的問題:
測試1
[14/May/2014:14:06:53 +0200]「GET /dev/test_test.m4v HTTP/1.1」206 1「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"
[14/May/2014:14:06:53 +0200]「GET /dev/test_test.m4v HTTP/1.1」200 130680「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KMLKML,例如壁虎)鉻/32.0.1700.10
[14/May/2014:14:07:15 +0200]「GET /dev/test_test.m4v HTTP/1.1」206 1「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"
[14/May/2014:14:07:15 +0200]「GET /dev/test_test.m4v HTTP/1.1」200 114684「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KMLKML,例如壁虎)鉻/32.0.1700.10
您可以看到,始終有一個請求的回應大小=1,而另一個請求的回應大小為混合大小,但>1。然而,瀏覽器中的結果始終是相同的。 => 回應中斷,下載失敗。
為了確保它與 http status/response 206 無關,我將其添加max_ranges 0;
到配置中並重試 -> test2。
測試2
[14/May/2014:14:11:36 +0200]「GET /dev/test_test.m4v HTTP/1.1」200 152460「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KMLHT,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"
[14/May/2014:14:11:38 +0200]「GET /dev/test_test.m4v HTTP/1.1」200 142296「-」「Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KMLHT,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"
在瀏覽器中的結果相同。下載/請求總是失敗,並且 access.log 中的大小總是不同,例如隨機區塊或回應大小。
伺服器狀態:iowait、RAM、CPU 幾乎空閒。沒有高負載或限制。
這是一個已知問題或錯誤嗎?
答案1
對於像這樣簡單的場景,我很確定您的 nginx 伺服器前面有防火牆、IDS/IPS 裝置或其他東西會幹擾下載。如有疑問,請聯絡您的 ISP。