當請求不存在的 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。