Apache 在访问 `/` 时使用 FallbackResource 挂起 5 秒

Jac*_*ack 4 php apache-2.2

我正在使用 PHP 5.4.21 运行 Apache 2.4.6 (Amazon) 的标准安装,对我的虚拟主机使用以下配置:

DirectoryIndex index.php
# ...
FallbackResource /index.php
Run Code Online (Sandbox Code Playgroud)

index.php是简单的缩影:

<?php echo "Hello world";
Run Code Online (Sandbox Code Playgroud)

访问http://<server-name>/神秘地仅在五秒钟后显示完整页面!任何其他页面都有预期的响应时间(很快)。

我发现这五秒与该Keep-Alive功能的默认等待时间有关;在这种情况下,直到 Apache 在该等待时间之后切断连接后,才会发送分块响应的最后几个字节。顺便说一句,这也完全破坏了持久连接本来可以为您带来的任何收益。

这是Apache的一个已知错误还是我在这里遗漏了一些非常明显的东西?

Jac*_*ack 7

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>
Run Code Online (Sandbox Code Playgroud)

此语句之后的任何指令,例如虚拟主机中的指令,都不会覆盖此设置;相反,它被添加到一个页面堆栈中,当请求索引时将尝试这些页面。当您在读取请求后立即执行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
Run Code Online (Sandbox Code Playgroud)

虽然我不能确切地说出原因,但DirectoryIndex在指定之前必须清除任何先前的指令DirectoryIndex index.php,即index.php必须是尝试处理请求的第一页。

这可以使用以下配置来完成:

DirectoryIndex disabled
DirectoryIndex index.php
Run Code Online (Sandbox Code Playgroud)