Apache站點下載大文件不完整緣由及解決辦法

今天在本地測試一個JQuery插件,可是瀏覽器裏一直提示JQuery文件第x行缺乏「}」。剛開始覺得是js文件有問題,因此就從官方從新下載了一個JQuery,但仍是有一樣的問題,從新看了一下代碼,沒有發現任何問題。因此我就用火狐測試了一下,也有一樣的錯誤。因而用FireBug看了一下HTTP請求,都是200,沒有問題。可是當我查看請求jquery文件的響應結果時,發現文件是不完整的,只返回了原文件的一小部分。再用迅雷從請求的地址下載這個js文件,能夠下載,下載的文件大小也是對的,可是用編輯器打開後才發現,文件的末尾和原文件是不同的,少了一些代碼,原來請求回來的文件只是原來文件的一部分。接着我又下載了幾個比較小的文件,發現沒有問題,可是稍微大一點的文件,好比100KB以上的文件,下載回來的都是不完整的。這種問題仍是頭一次遇到,沒辦法,百度谷歌一塊兒來,最後終於找到了問題的所在。html

原來是Apache的配置問題,解決辦法以下:jquery

只要把Apache的配置文件httpd.conf裏<IfModule mime_module>塊中的EnableSendfile後的值改成Off便可。
若是沒有這一項本身添加上去:EnableSendfile Off,記住要放到上面的塊中,否則Apache會啓動不起來。
若是無論事能夠把EnableMMAP後的值也設爲Off試試。瀏覽器

緣由分析:服務器

原來在默認狀況下,當處理一個請求並不須要訪問文件內部的數據時(好比發送一個靜態的文件內容),若是操做系統支持,Apache將使用sendfile將文件內容直接發送到客戶端而並不讀取文件。這個sendfile機制避免了分開的讀和寫操做以及緩衝區分配。因爲默認是打開的,但有些操做系統對sendfile系統調用支持不夠。因此會出現沒法傳輸大於必定容量的html頁面。關掉並不影響正常使用。網絡

關於EnableSendfile 指令和EnableMMAP 指令app

EnableSendfile 指令
說明:使用操做系統內核的sendfile支持來將文件發送到客戶端
語法:EnableSendfile On|Off
默認值:EnableSendfile On編輯器

這個指令控制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,這個指令能夠被針對目錄的設置覆蓋:
<Directory "/path-to-nfs-files"> EnableSendfile Off </Directory> 性能


EnableMMAP 指令測試

說明:在遞送中使用內存映射(memory-mapping)來讀取文件
語法:EnableMMAP On|Off
默認值:EnableMMAP On操作系統

此指令指示httpd在遞送中若是須要讀取一個文件的內容,它是否可使用內存映射。當處理一個須要訪問文件中的數據的請求時,好比說當遞送一個使用mod_include進行服務器端分析的文件時,若是操做系統支持,Apache將默認使用內存映射。 這種內存映射有時會帶來性能的提升,但在某些狀況下,您可能會須要禁用內存映射以免一些操做系統的問題: 在一些多處理器的系統上,內存映射會減低一些httpd的性能。 在掛載了NFS的DocumentRoot上,若已經將一個文件進行了內存映射,則刪除或截斷這個文件會形成httpd由於分段故障而崩潰。 在可能遇到這些問題的服務器配置過程當中,您應當使用下面的命令來禁用內存映射: EnableMMAP Off 對於掛載了NFS的文件夾,能夠單獨指定禁用內存映射: <Directory "/path-to-nfs-files"> EnableMMAP Off </Directory>

相關文章
相關標籤/搜索