
我的 ubuntu 實例 (Ubuntu 20.04.1 LTS) 和 apache2 (Apache/2.4.41 (Ubuntu)) 遇到問題。一台虛擬主機正在從已安裝的 cifs 共用中提供一些 html 檔案和文件。 cifs 共享工作正常,檔案系統上的檔案正確。
然而,apache 無法為以二進位形式提供的每種文件類型(如圖像、word 文件、pdf 等)產生正確的回應。例如,當我下載映像時,image.gif
檔案會被下載並儲存到客戶端。當在客戶端上使用文字編輯器開啟檔案時,它看起來如下:
grade, Keep-Alive
Last-Modified: Thu, 12 Nov 2020 10:01:47 GMT
ETag: "b6b-5b3e600040144"
Accept-Ranges: bytes
Content-Length: 2923
Keep-Alive: timeout=5, max=100
Content-Type: image/gif
GIF89av[binary-string starting...]
因此,部分響應標頭現在位於下載的檔案中,這種情況永遠不應該發生。我期待下載的文件以GIF89av
等等開頭。提供基於文字的文件(如 html)不是問題並且可以按預期工作。但是,當我將相同檔案複製到同一伺服器上另一個虛擬主機的文檔根目錄(該伺服器不使用已安裝的 cifs 共用)時,該檔案將正確提供(其中沒有回應標頭)。所以我認為,安裝的 cifs-share 和 apache2 的組合存在一些問題,從而導致了該錯誤。
我已經嘗試了有關共享掛載的各種選項 - 但我認為這是正確的,因為這些檔案直接在沒有 apache 的檔案系統上運作。
共享掛載/etc/fstab
如下
//192.168.0.1/share$ /mnt/share cifs username=user,password=pass,dom=contoso.local 0 0
這幾乎是最基本的方法。我經歷過類似的選項iocharset=utf8
,嘗試了不同的版本(vers=1.0
或vers=3.1
),但這並沒有改變任何東西。 apache 配置也是基本配置,隨 ubunutu 20 一起提供,沒有任何特殊添加或更改。我對 mime 類型有一些經驗,但 apache 應該能夠提供開箱即用的圖像。
另外,我啟動了一個 php-webserver ( php -S 192.168.0.2:8000
) 來在該目錄中進行測試 - 它返回正確的二進位文件,這讓我非常確定錯誤是在 apache 中的某個地方。
是什麼導致了 apache 的這種損壞的響應?
答案1
我遇到了同樣的問題,看來這個問題是最近出現的,可能與 20.04 的核心版本有關?我也確實看到了純文字檔案的問題。您能找到解決方案/解決方法嗎? (抱歉,我沒有代表發表評論)
編輯:我可以在這裡找到錯誤報告: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=900821 在 apache 設定中設定 EnableMMAP 關閉對我有用:
EnableMMAP off
答案2
在“/etc/apache2/apache2.conf”中新增:
EnableSendfile Off
EnableMMAP off
這救了我的命~
答案3
關閉 EnableMMAP 和啟用 Sendfile 關閉的第二個答案似乎已經解決了我的問題。
此指令控制 httpd 是否可以使用核心的 sendfile 支援將檔案內容傳輸到客戶端。預設情況下,當處理請求不需要存取檔案中的資料時(例如,在傳送靜態檔案時),Apache httpd 使用 sendfile 來傳送檔案內容,而無需讀取檔案(如果作業系統支援)。
關閉此功能可以消除內核 sendfile 呼叫中不同或不工作的功能導致問題的可能性。
這是 RHEL 8 4.18.0-305.3.1.el8_4.x86_64 的問題