2020/01/20(月)Debian10で Apache + php-fpm の正しい設定メモ
Apache + php-fpm 環境で Debian 9(jessie) から 10(buster) にアップデートしたら動かなくなったので、メモ。
概要
Debian付属のmod_phpはスレッドセーフではないため、Apacheを event_mpm や worker_mpm で運用している場合は使用できません(prefork専用)。
そもそも今どきmod_phpで動作させるのはナンセンスなので、FastCGIデーモンによるPHP環境 PHP-FPM を使用します。
Debian10での設定
- Apache 2.4
- PHP 7.3 (php7.3-fpm)
apt-get install php-fpm libapache2-mod-fcgid
php-fpmをインストールすることで自動的に「php-fpm7.3」サービスが起動します。
/etc/apache2/conf-available 以下に php7.3-fpm.conf が作られるので、これを有効にします。
cd /etc/apache2/conf-enabled ln -s ../conf-available/php7.3-fpm.conf
proxy_fcgi_moduleが必要なのでこれも有効にします。
cd /etc/apache2/mods-enabled ln -s ../mods-available/proxy_fcgi.load
この状態で、Apacheを再起動すれば有効になっているはずです。ついでに、OPcacheも最初から有効になっています。
php7.3-fpm.confの中身(特に変更せず)
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.php$">
SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch ".+\.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
以前使っていた古い設定
Debian 9(jessie)でも全く同じ設定で動作するのですが、以前は古い設定を使っていました。その設定を書いておきます。
- php-fpm7.0
- libapache2-mod-fastcgi (Debian9までしか提供されず)
Apache2の libapache2-mod-fastcgi(libapache2-mod-fcgidではダメ)を有効化してから、sites-available/000-default.conf 等に以下の設定を行います。
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
AddHandler php7.0-fcgi .php
Action php7.0-fcgi /usr/sbin/php-fpm7.0
FastCgiExternalServer /usr/sbin/php-fpm7.0 -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
FastCgiConfig -maxClassProcesses 100
<Directory /usr/sbin>
<Files php-fpm7.0>
Require all granted
</Files>
</Directory>
</IfModule>
何が変更になったのか
外部プログラムを呼び出して、そこから php-fpm サーバに接続するという形式が無効になったようです。上に書いた古い設定は多くの新しいLinuxディストリビューションで無効になっているようです。
この古い設定を行った場合、エラーログ等はなく「404 Not Found」と言われ白紙のページが出るだけなので混乱します。
現在は Apache に直接組み込んだ FastCGIのProxyのモジュール(proxy_fcgi_module)から、直接php-fpmに接続するようになりました。このほうが遥かに効率的です。
メモ
- php-fpmを利用する場合、SuEXECと併用できない。
- SuEXECと同じことをしたければ、php-fpmデーモン(設定ファイル)を権限(ユーザー)ごとに分ける必要がある。