
我在 Google 上搜尋了很多,確實有很多關於這個問題的結果(甚至在 serverfault.com 上)。但是,我無法用它解決我的問題。
我的設定
我一直在 WSL2 上設定 Ubuntu 20,並嘗試使用 Ansible 對其進行配置。我正在嘗試使用 PHP-FPM-7.4 設定 Apache。
阿帕契
阿帕奇似乎工作正常。我有一個包含 test.html 的文檔根目錄。當我呼叫該 HTML 檔案的直接 URL 時,我會看到應有的內容。
虛擬主機
註:為了方便閱讀,我省略了所有評論
DirectoryIndex index.php index.html
<VirtualHost *:80>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
<VirtualHost *:443>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
SSLEngine on
SSLCipherSuite AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
PHP FPM
現在的問題是當我呼叫 PHP 檔案時:然後我看到「檔案找不到」。在網頁瀏覽器中。
pool.d/www.conf
註:為了方便閱讀,我省略了所有評論
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 5
listen.allowed_clients = 127.0.0.1
錯誤日誌
PHP-FPM 錯誤日誌顯示它運作良好:
[24-Dec-2020 12:16:06] NOTICE: fpm is running, pid 26532
[24-Dec-2020 12:16:06] NOTICE: ready to handle connections
[24-Dec-2020 12:16:06] NOTICE: systemd monitor interval set to 10000ms
Apache 錯誤日誌顯示錯誤:
[Thu Dec 24 12:44:38.779511 2020] [proxy_fcgi:error] [pid 26424:tid 140510559713024] [client ::1:57178] AH01071: Got error 'Primary script unknown'
如何修復/調查?
首先,我發現錯誤訊息「找不到檔案」。很不清楚。誰沒有找到什麼文件?這將幫助我和其他將來遇到此錯誤的人解釋誰拋出了此錯誤以及它的確切含義。
到目前為止,我的結論是 Apache 拋出了錯誤訊息,這意味著它找不到 PHP-FPM 進程。那是對的嗎?
我應該如何進一步調查和解決這個問題?
編輯:新增我的 Apache 和 PHP-FPM 設定。
編輯/重要說明
在改進這篇文章並調查問題時,我發現 Apache 和 PHP-FPM 的基本設定工作正常。
該問題顯然是由以下語句引起的:
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
該語句在先前的設定(使用 Centos)上運作良好,但現在不行。當我將此語句替換為文檔根目錄的靜態路徑時,它工作正常。
我將進一步調查,但如果有人知道如何解決此問題,請告訴我。
答案1
經過更多調查,我發現我的ProxyPassMatch
陳述導致了錯誤。然後我在 StackOverflow 上發現了一篇文章,說不應該使用整個 ProxyPassMatch 語句。
簡單地SetHandler proxy:fcgi://127.0.0.1:9000
(已經在我的虛擬主機中)使 PHP 工作。
答案2
由於這是 Google 在搜尋“apache php-fpm file not find”時給我的第一個結果,我想在這裡添加我的答案。
如果面向 Apache 的文檔根目錄是不同的來自面向 PHP-FPM 的文檔根
就我而言,面向 Apache 的文檔根是/data/.../wwwroot
,面向 PHP-FPM 的文檔根(在容器中運行)是/var/www/html
。
解決方法是調整DOCUMENT_ROOT
和SCRIPT_FILENAME
與ProxyFCGISetEnvIf
:
Define container_root "/var/www/html"
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9000"
ProxyFCGISetEnvIf "true" DOCUMENT_ROOT "${container_root}"
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{HANDLER}${container_root}%{reqenv:SCRIPT_NAME}"
</If>
</FilesMatch>
UnDefine container_root
(關於不同變數存取語法的註解:每種語法適用於來自不同來源的變數。${}
適用於用Define
,或使用-D
命令列參數;%{}
如果為了Apache 定義的變數;並且%{reqenv:}
是一個函數呼叫存取內部環境變數。
您可以透過在該部分的末尾添加以下行來調試這些變數FilesMatch
:
Header always set X-HANDLER "expr=%{HANDLER}"
Header always set X-DOCUMENT_ROOT "expr=%{reqenv:DOCUMENT_ROOT}"
Header always set X-SCRIPT_FILENAME "expr=%{reqenv:SCRIPT_FILENAME}"
Header always set X-SCRIPT_NAME "expr=%{reqenv:SCRIPT_NAME}"
然後您應該在響應標頭中看到這些。