Назад | Перейти на главную страницу

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

Из этот отчет об ошибке Я понял, что эта проблема может быть связана с 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