Apache網站下載大檔案不完整原因及解決方法

黄舟
發布: 2016-12-21 11:34:36
原創
2215 人瀏覽過

今天在本地測試一個JQuery插件,但是瀏覽器裡一直提示JQuery檔案第x行缺少「}」。

剛開始以為是js檔案有問題,所以就從官方重新下載了一個JQuery,但還是有同樣的問題,重新看了一下程式碼,沒有發現任何問題。

所以我就用火狐測試了一下,也有同樣的錯誤。於是用FireBug看了一下HTTP請求,都是200,沒問題。

但是當我查看請求jquery文件的回應結果時,發現文件是不完整的,只回傳了原始文件的一小部分。

再用迅雷從請求的地址下載這個js文件,可以下載,下載的文件大小也是對的,但是用編輯器打開後才發現,文件的末尾和原文件是不一樣的,少了一些代碼,原來請求回來的文件只是原來文件的一部分。接著我又下載了幾個比較小的文件,發現沒有問題,但稍微大一點的文件,例如100KB以上的文件,下載回來的都是不完整的。這種問題還是頭一次遇到,沒辦法,百度谷歌一起來,最後終於找到了問題的所在。原來是Apache的設定問題,解決方法如下:

只要把Apache的設定檔httpd.conf裡 區塊中的EnableSendfile後的值改為Off即可。
如果沒有這項自己加上去:EnableSendfile Off,記得要放到上面的區塊中,不然Apache會啟動不起來。
如果不管事可以把EnableMMAP後的值也設為Off試試。

原因分析:

原來在預設情況下,當處理一個請求並不需要存取檔案內部的資料時(例如傳送一個靜態的檔案內容),如果作業系統支持,Apache將使用sendfile將檔案內容直接發送到客戶端而不讀取文件。這個sendfile機制避免了分開的讀取和寫入操作以及緩衝區分配。由於預設是開啟的,但有些作業系統對sendfile系統呼叫支援不夠。所以會出現無法傳輸大於一定容量的html頁面。關掉並不影響正常使用。

關於EnableSendfile 指令和EnableMMAP 指令

EnableSendfile 指令


說明
這個指令控制httpd是否可以使用作業系統核心的sendfile支援來將檔案傳送到客戶端。預設情況下,當處理一個請求並不需要存取檔案內部的資料時(例如發送一個靜態的檔案內容),如果作業系統支持,Apache將使用sendfile將檔案內容直接傳送到客戶端而並不讀取文件。譯者註:Linux2.4/2.6核心都支援。
這個sendfile機制避免了分開的讀和寫操作以及緩衝區分配,但是在一些平台或一些文件系統上,最好禁止這個特性來避免一些問題:

一些平台可能會有編譯系統檢測不到的有缺陷的sendfile支持,特別是將在其他平台上使用交叉編譯得到的二進位檔案運行於當前對sendfile支援有缺陷的平台時。

在Linux上啟用IPv6時,使用sendfile將會觸發某些網路卡上的TCP校驗和卸載bug。
當Linux運作在Itanium處理器上的時候,sendfile可能無法處理大於2GB的檔案。
對於一個透過網路掛載了NFS檔案系統的DocumentRoot (例如:NFS或SMB),核心可能無法可靠的透過自己的緩衝區服務網路檔案。
如果出現以上情況,你應當禁用sendfile :
EnableSendfile Off
針對NFS或SMB,這個指令可以被針對目錄的設定覆蓋:
EnableSendfile Off


EnableMMAP 指令


說明:在遞送中使用記憶體映射(memory-mapping)來讀取檔案
語法:EnableMMAP On|Off

預設值:EnableMMAP

此指令指示httpd在遞送中如果需要讀取一個檔案的內容,它是否可以使用記憶體映射。當處理一個需要存取檔案中的資料的請求時,比如說當遞送一個使用mod_include進行伺服器端分析的檔案時,如果作業系統支持,Apache會預設使用記憶體映射。
這種記憶體映射有時會帶來效能的提高,但在某些情況下,您可能會需要停用記憶體映射以避免一些作業系統的問題:
在一些多處理器的系統上,記憶體映射會減低一些httpd的性能。
在掛載了NFS的DocumentRoot上,若已經將一個檔案進行了記憶體映射,則刪除或截斷這個檔案會造成httpd因為分段故障而崩潰。
在可能遇到這些問題的伺服器設定過程中,您應使用下面的命令來停用記憶體對映:
EnableMMAP Off
對於掛載了NFS的資料夾,可以單獨指定停用記憶體對映:
EnableMMAP Off

以上是Apache網站下載大檔案不完整原因及解決方法的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門推薦
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!