【Docker+Apache2.4+PHP-FPM(fastcgi)】 file not found や primary script unknownが出る場合の対処
Nginxの設定手順は山ほどあるんですが、やはりApache+PHP-FPMの設定方法はネットに全然情報がなかったので、結局Apacheの公式ドキュメント見て理解できましたよ…。
- Apache2.4系公式Dockerイメージ@Alpine(https://hub.docker.com/_/httpd)
- PHP-FPM(fastcgi)公式DOckerイメージ@Alpine(https://hub.docker.com/_/php)
この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のままだとコンテナ内に繋げられません)