私のセットアップ

私のセットアップ

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_ROOTSCRIPT_FILENAMEProxyFCGISetEnvIf:

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}"

すると、応答ヘッダーにこれらが表示されます。

関連情報