
Google でいろいろ検索しましたが、確かにこの問題に関する結果はたくさんあります (serverfault.com でも)。しかし、私はまだ問題を解決できていません。
私のセットアップ
WSL2 に Ubuntu 20 をセットアップし、Ansible でプロビジョニングしようとしています。PHP-FPM-7.4 を使用して Apache をセットアップしようとしています。
アパッチ
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 ファイルを呼び出すときに、Web ブラウザーに「ファイルが見つかりません」と表示されることです。
プール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
これは、「apache php-fpm ファイルが見つかりません」を検索したときに Google で最初に表示された結果なので、ここに回答を追加したいと思います。
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}"
すると、応答ヘッダーにこれらが表示されます。