需要来自 mod_proxy_fcgi 的有用的错误消息

需要来自 mod_proxy_fcgi 的有用的错误消息

当请求不存在的 php 脚本时,mod_proxy_fcgi 会提供一个相当无用的错误消息,基本上只是说

[proxy_fcgi:error] .... AH01071: Got error 'Primary script unknown\n'

该服务器使用 Apache 2.4.6 (Centos 7),php 处理配置如下:

<FilesMatch \.php$>
  SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

我真的很想知道实际的脚本名称,因为它可能包含有用的信息(例如,指示有缺陷的链接,页面名称中的错误,或者仅仅表明它只是另一个愚蠢的行为,寻找不受保护的 wp-login.php 的服务器)。

我尝试将 LogLevel 从 info 更改为 debug,但错误日志中也充满了有效的 php 脚本访问详细信息,这让错误日志变得非常混乱,因为那些实际上并不是错误。

有没有办法获得更有用的 proxy_fcgi 错误消息,其中包括不存在的 php 脚本的实际脚本名称?

答案1

您可以定义包含 %L 的 ErrorLogFormat,然后在 CustomLog 格式 %L 中执行相同操作

这将使 Apache 记录一个特定的 id,并将错误日志条目绑定到访问日志条目中,然后您需要做的就是 grep。

例子:

ErrorLogFormat "[%{u}t] [%-m:%l] [%L] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"

LogFormat "%h %l %u [%L] %t \"%r\" %>s \"%{Referer}i\" \"%{User-Agent}i\"" combined

因此,下次当您看到错误时,请检查其中的 ID,并在 access.log 中查找相同的 ID

答案2

我会获取记录错误的时间,然后在该时间前后搜索访问日志以查找返回失败的请求。这应该有助于追踪脚本。

答案3

有问题的错误来自 FastCGI 应用程序(无论哪个应用程序正在监听端口 9000),而不是 Apache。Apache 只是报告 FastCGIFCGI_STDERR流中返回的内容。

如果 Apache 正在与 PHP-FPM 通信(这似乎是可能的),您可以查看 PHP-FPM 的日志。您可以检查文件error_log中的指令php-fpm.conf以找出 PHP-FPM 在哪里记录错误。那里应该有更多线索。

答案4

一个解决方案是在将文件传递给处理程序之前检查文件是否存在,这是默认的 Debian配置文件建议。

<FilesMatch ".+\.ph(ar|p|tml)$">
    <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
    </If>
</FilesMatch>

这样,如果该文件不存在,Apache 将处理它,而不是 PHP。

相关内容