需要來自 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。

相關內容