訪問 /
時,Apache 使用 FallbackResource 掛起五秒鐘
我正在為我的虛擬主機使用以下配置執行 Apache 2.4.6 (Amazon) 和 PHP 5.4.21 的標準安裝:
DirectoryIndex index.php # ... FallbackResource /index.php
我
index.php
是簡單的縮影:<?php echo "Hello world";
僅在五秒鐘後神秘地訪問
http://<server-name>/
顯示整個頁面!任何其他頁面都有預期的響應時間(很快)。我發現這五秒鐘與該
Keep-Alive
功能的預設等待時間有關;在這種情況下,分塊響應的最後幾個字節不會發送,直到 Apache 在等待時間之後切斷連接。順便說一句,這也完全破壞了持久連接會給您帶來的任何收益。這是 Apache 的一個已知錯誤,還是我在這裡遺漏了一些非常明顯的東西?
2017/04/18:這已在 Apache 2.4.25 中修復:https ://bz.apache.org/bugzilla/show_bug.cgi?id=58292
錯誤摘要的解釋:
如果在子請求上執行 FallBackResource,則伺服器永遠不會發送最後一個塊,從而導致某些客戶端出現掛起。
發生這種情況是因為 EOS 儲存桶被子請求過濾器剝離,如果多個子請求過濾器最終在一個列表中,則不會正確刪除
此行為僅在應用壓縮時才明顯,因為這依賴於知道流何時結束;並且 5s 是使用的預設套接字超時。
舊答案
從這個錯誤報告中,我意識到這個問題可能與
DirectoryIndex
指令有關。標準 Apache 安裝在配置中包含以下部分:
<IfModule dir_module> DirectoryIndex index.html </IfModule>
此語句之後的任何指令,例如虛擬主機中的指令,都不會覆蓋此設置;相反,它會被添加到請求索引時將嘗試的頁面堆棧中。當您在讀取請求後立即執行
strace httpd -X
並檢查呼叫時,可以確認此行為,例如:stat()
stat("/path/to/vhost/index.html", 0x7fff9dc41b90) = -1 ENOENT stat("/path/to/vhost/index.php", {st_mode=S_IFREG|0664, st_size=130, ...}) = 0
雖然我無法確切說明原因,但
DirectoryIndex
在指定之前必須清除任何先前的指令DirectoryIndex index.php
,即index.php
必須是嘗試處理請求的第一頁。這可以使用以下配置來完成:
DirectoryIndex disabled DirectoryIndex index.php