Apache:500 错误,PHP 仅在一条特定路径上失败

Apache:500 错误,PHP 仅在一条特定路径上失败

我需要另一双眼睛来帮助调试问题。这将是一条很长的消息。我将提供大量背景信息,因为我不确定哪些细节可能很重要。

我们有两台服务器:开发服务器和生产服务器。现有服务器运行的是 RHEL7,即将停用。我正在构建两台新的 RHEL9 VM 来代替它们。

服务器托管各种应用程序。它们彼此独立,每个应用程序都位于文档根目录下的自己的子目录中。文档根目录位于 /var/www/html。

让我头疼的是 Drupal 10.2 的全新安装。我使用 composer 将其安装到 /var/www/drupal,然后在 /var/www/html/databases 处创建指向 /var/www/drupal/web 的符号链接。我不得不稍微调整一下权限,以确保 Apache 用户可以执行所需的所有操作,但很快我就在开发和生产上都安装了可以正常运行的 Drupal。

然后,在我将自定义主题的副本克隆到主题文件夹后不久,开发版上的主题就停止工作了。当我访问时,我收到以下错误消息:

The website encountered an unexpected error. Try again later.

ssl_access_log 显示此错误:

10.133.0.30 - - [21/Feb/2024:13:55:07 -0600] "GET /databases/ HTTP/1.1" 500 61

天哪,500 错误信息。这个错误信息可能意味着任何事情,因此根本就没有任何意义。太棒了。

我将 LogLevel 设置为调试,重现了该问题并检查了 ssl_error_log,其中报告了以下内容:

[Wed Feb 21 13:55:07.118063 2024] [ssl:info] [pid 7769:tid 7944] [client 10.133.0.30:64845] AH01964: Connection to child 81 established (server undcflwebdev0.und.edu:443)
[Wed Feb 21 13:55:07.118300 2024] [ssl:debug] [pid 7769:tid 7944] ssl_engine_kernel.c(2391): [client 10.133.0.30:64845] AH02043: SSL virtual host for servername undcflwebdev0.und.edu found
[Wed Feb 21 13:55:07.118492 2024] [core:debug] [pid 7769:tid 7944] protocol.c(2460): [client 10.133.0.30:64845] AH03155: select protocol from , choices=h2,http/1.1 for server undcflwebdev0.und.edu
[Wed Feb 21 13:55:07.120744 2024] [ssl:debug] [pid 7769:tid 7944] ssl_engine_kernel.c(2251): [client 10.133.0.30:64845] AH02041: Protocol: TLSv1.3, Cipher: TLS_AES_256_GCM_SHA384 (256/256 bits)
[Wed Feb 21 13:55:07.120862 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(508): AH00831: socache_shmcb_store (0x16 -> subcache 22)
[Wed Feb 21 13:55:07.120889 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(745): AH00842: expiring 11 and reclaiming 0 removed socache entries
[Wed Feb 21 13:55:07.120901 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(765): AH00843: we now have 0 socache entries
[Wed Feb 21 13:55:07.120911 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(862): AH00847: insert happened at idx=0, data=(0:32)
[Wed Feb 21 13:55:07.120917 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(865): AH00848: finished insert, subcache: idx_pos/idx_used=0/1, data_pos/data_used=0/230
[Wed Feb 21 13:55:07.120923 2024] [socache_shmcb:debug] [pid 7769:tid 7944] mod_socache_shmcb.c(530): AH00834: leaving socache_shmcb_store successfully
[Wed Feb 21 13:55:07.121011 2024] [ssl:debug] [pid 7769:tid 7944] ssl_engine_kernel.c(415): [client 10.133.0.30:64845] AH02034: Initial (No.1) HTTPS request received for child 81 (server undcflwebdev0.und.edu:443)
[Wed Feb 21 13:55:07.121357 2024] [authz_core:debug] [pid 7769:tid 7944] mod_authz_core.c(815): [client 10.133.0.30:64845] AH01626: authorization result of Require all granted: granted
[Wed Feb 21 13:55:07.121390 2024] [authz_core:debug] [pid 7769:tid 7944] mod_authz_core.c(815): [client 10.133.0.30:64845] AH01626: authorization result of <RequireAny>: granted
[Wed Feb 21 13:55:07.121491 2024] [authz_core:debug] [pid 7769:tid 7944] mod_authz_core.c(815): [client 10.133.0.30:64845] AH01626: authorization result of Require all granted: granted
[Wed Feb 21 13:55:07.121514 2024] [authz_core:debug] [pid 7769:tid 7944] mod_authz_core.c(815): [client 10.133.0.30:64845] AH01626: authorization result of <RequireAny>: granted
[Wed Feb 21 13:55:07.121680 2024] [proxy:debug] [pid 7769:tid 7944] mod_proxy.c(1520): [client 10.133.0.30:64845] AH01143: Running scheme unix handler (attempt 0)
[Wed Feb 21 13:55:07.121703 2024] [proxy_ajp:debug] [pid 7769:tid 7944] mod_proxy_ajp.c(795): [client 10.133.0.30:64845] AH00894: declining URL fcgi://localhost/var/www/html/databases/index.php
[Wed Feb 21 13:55:07.121719 2024] [proxy_fcgi:debug] [pid 7769:tid 7944] mod_proxy_fcgi.c(1069): [client 10.133.0.30:64845] AH01076: url: fcgi://localhost/var/www/html/databases/index.php proxyname: (null) proxyport: 0
[Wed Feb 21 13:55:07.121736 2024] [proxy_fcgi:debug] [pid 7769:tid 7944] mod_proxy_fcgi.c(1078): [client 10.133.0.30:64845] AH01078: serving URL fcgi://localhost/var/www/html/databases/index.php
[Wed Feb 21 13:55:07.121758 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(2568): AH00942: FCGI: has acquired connection for (*:80)
[Wed Feb 21 13:55:07.121776 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(2626): [client 10.133.0.30:64845] AH00944: connecting fcgi://localhost/var/www/html/databases/index.php to localhost:8000
[Wed Feb 21 13:55:07.121792 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(2662): [client 10.133.0.30:64845] AH02545: fcgi: has determined UDS as /run/php-fpm/www.sock
[Wed Feb 21 13:55:07.122008 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(2852): [client 10.133.0.30:64845] AH00947: connected /var/www/html/databases/index.php to httpd-UDS:0
[Wed Feb 21 13:55:07.122082 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(3222): AH02823: FCGI: connection established with Unix domain socket /run/php-fpm/www.sock (*:80)
[Wed Feb 21 13:55:07.150902 2024] [proxy:debug] [pid 7769:tid 7944] proxy_util.c(2584): AH00943: FCGI: has released connection for (*:80)
[Wed Feb 21 13:55:07.151140 2024] [ssl:debug] [pid 7769:tid 7944] ssl_engine_io.c(1151): [client 10.133.0.30:64845] AH02001: Connection closed to child 81 with standard shutdown (server undcflwebdev0.und.edu:443)

虽然没有明显的证据,但我思考问题可能是这一行:

[Wed Feb 21 13:55:07.121703 2024] [proxy_ajp:debug] [pid 7769:tid 7944] mod_proxy_ajp.c(795): [client 10.133.0.30:64845] AH00894: declining URL fcgi://localhost/var/www/html/databases/index.php

如果我理解正确的话,FCGI 是 Apache 和 PHP 之间的接口。如果 FCGI 拒绝连接,则 PHP 脚本将不会被解释,并且一切都会停止。

我们安装了 SELinux,但它经常导致问题,所以我暂时将其关闭。但这没有帮助——即使将 SELinux 置于宽容模式,问题仍然会发生。所以我不认为这是 SELinux 的问题。

服务器上的其他一切都运行良好。我有多个 PHP 应用程序位于它们自己的文件夹中,它们运行顺畅。所以我推断这也许是符号链接的问题。我删除了链接,并将其替换为一个名为“databases”的普通文件夹,其中包含一个名为“Hello world”的 index.html 文件。它运行得很好。我将那个 index.html 重命名为 index.php,它立即失败,并显示与上述相同的错误消息。一时兴起,我将那个 index.php 文件复制到“test.php”并访问它。它运行正常!

与此同时,机器上的其他所有 PHP 应用程序都继续顺利运行。此外,生产服务器上的 Drupal 安装尽管处于符号链接中,但运行良好。据我所知,问题只发生在确切路径 /var/www/html/databases/index.php 上,无论数据库是实际文件夹还是符号链接。实际上,服务器上的其他所有 PHP 文件都运行良好。

我谷歌了一下。我没有找到遇到同样问题的人。我确实发现有些人在安装了反向代理的服务器上报告了错误代码 AH00894。这让我停下来思考,因为我确实设置了反向代理。服务器上的其他应用程序之一很古老、很笨重,而且令人讨厌地无法替代。它不会在 PHP 5.6 以上版本中运行。所以我运行了一个提供 PHP 5.6 环境的 docker 容器。Apache 配置为通过反向代理与 docker 实例通信,因此:

# Listen to all traffic on port 80.
<VirtualHost *:80>

   # Keep the original host name.
   ProxyPreserveHost On

   # Redirect all traffic for the /archon folder to :8080 instead.
   ProxyPass /archon http://localhost:8080/
   ProxyPassReverse /archon http://localhost:8080/

</VirtualHost>

在 ssl.conf 中我再次得到了以下位:

SSLProxyEngine On

ProxyPreserveHost On

# Prevent SSL offloading
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"

# Redirect all traffic for the /archon folder to :8080 instead.
ProxyPass /archon http://localhost:8080/
ProxyPassReverse /archon http://localhost:8080/

代理应用程序运行良好。我可以去https://dev.example.com/archon/然后它就加载了。但是我想知道代理是否会以某种方式干扰 drupal 实例。

所以我禁用了所有代理。我注释掉了虚拟主机和 ssl.conf 中的所有代理配置行,然后重新启动了 Apache。我确认 archon 已按预期停止工作,然后尝试了我的 Drupal。它产生了完全相同的错误。所以我重新打开了所有代理。

此时,我已经为这个问题绞尽脑汁两天了。如果我没有看错日志,问题在于 FCGI 拒绝连接。但我不知道它为什么拒绝。为什么服务器上的所有其他 PHP 应用程序都运行良好?生产服务器的配置与开发服务器相同,但生产可以运行,而开发却不行。为什么?服务器上的所有其他 PHP 文件都运行良好。为什么?为什么这个 URL 总是死机,而其他一切都正常?

我或许可以将 index.php 文件重命名为其他名称,然后使用 .htaccess 文件将该文件名标识为文件夹的索引。这可能是一种解决方法。但这非常尴尬,我担心重命名 Drupal 的核心文件会导致意外问题。我不知道 Drupal 的代码是否在任何地方将该文件名硬编码。

我被困住了。我不知道还能做些什么来弄清楚这个可恶的东西到底出了什么问题。新服务器预计将于 26 日星期一上线。我的时间快用完了,这是我的最后一个障碍。任何建议都将不胜感激。

答案1

Apache 只500在日志中显示,因为您正在使用php-fpm,并且 Apache 不知道问题的详细信息。它只是转发错误代码。

php-fpm有自己的日志文件,其中显示详细的错误消息。

相关内容