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デーモン(設定ファイル)を権限(ユーザー)ごとに分ける必要がある。