Php

訪問 / 時,Apache 使用 FallbackResource 掛起五秒鐘

  • January 4, 2022

我正在為我的虛擬主機使用以下配置執行 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

引用自:https://serverfault.com/questions/559067