「Docker+Apache2.4+PHP-FPM(fastcgi)」で file not found や primary script unknownが出る場合の対処

Nginxの設定手順は山ほどあるんですが、やはりApache+PHP-FPMの設定方法はネットに全然情報がなかったので、結局Apacheの公式ドキュメント見て理解できましたよ…。

この2つを繋げるには、httpd.confの下に以下を追記すればOKです。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#↓外部認証用?必要ならコメント外す
#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
<FilesMatch \.php$>
    #[ベーシック認証用?必要ならコメント外す] 
    #CGIPassAuth On
    SetHandler "proxy:fcgi://php:9000"
    ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html%{reqenv:SCRIPT_NAME}"
</FilesMatch>

重要なのは「SCRIPT_FILENAME」を書き換えること!実はApache公式は少し特殊で、

  • PHP-FPM公式Dockerのドキュメントルートは「/var/www/html」
  • Apache公式Dockerのドキュメントルートは「/usr/local/apache2/htdocs/」

なので、SCRIPT_FILENAMEを再設定しないとファイルが見つからないんですよね。

他につまずいたポイントとしては、最低でもmod_proxy.soとmod_proxy_fcgi.soをLoadModuleしておくことと「proxy:fcgi://php:9000」の「php」のところをDockerコンテナ名にすることですね(localhostや127.0.0.1のままだとコンテナ内に繋げられません)