Nginx+PHP FPMのサイト環境でPHPの処理にUNIXドメインソケットを使っている場合、何気なくDebianでPHPをアップグレードすると、「502 Bad Gateway」となってハマる場合があるので注意を。
NginxでUNIXドメインソケット経由でPHP FPMを使っている場合、
fastcgi_pass unix:/var/run/php5-fpm.sock
のような設定を記述するが、/var/run/php5-fpm.sockのパーミッションはPHP FPMのデフォルト設定だとこれまで、
srw-rw-rw- 1 www-data www-data php5-fpm.sock
のようになっていた。ところが、セキュリティ上の問題で5.4.4-14+deb7u9からのデフォルトは、
srw------- 1 www-data www-data php5-fpm.sock
と変更されている。
Nginxの起動ユーザーをデフォルトの「nginx」から「www-data」に変更して運用している環境では問題ないが、「nginx」のままで運用していれば、php5-fpm.sockへのアクセスパーミッションがなくなることになり、502エラーとなるというお話。
対処方法は2つ
ということで、「502 Bad Gateway」となってしまったという場合には、実行ユーザーがnginxのままになっていると思われるので、/etc/nginx/nginx.confを、
user nginx; ↓ user www-data;
のように修正して、Nginxを再起動ればOKだ。ログファイルやキャッシュのディレクトリ・ファイルのパーミッションは別途確認しておいたほうがいいだろう。
もしくは、ローカルユーザーが安全と言い切れる環境なら、PHP FPMのパーミッションを以前ようにゆるく設定すれば良い。具体的には、/etc/php5/fpm/pool.d/www.confにおいて、
listen = /var/run/php5-fpm.sock listen.mode = 0666
のような設定が必要になる。設定を変更したら、「/etc/init.d/php5-fpm restart」で再起動を行えば完了である。
注意はちゃんと書いてある
このあたりの情報はアップデートのメッセージに書いてある。斜め読みしていたのでアップデート前に気が付かなかったが、エラーログを見て「あぁ」という結末。
php5 (5.4.4-14+deb7u9) stable; urgency=medium * The default PHP FPM socket permission has been changed from 0666 to 0660 to mitigate security vulnerability (CVE-2014-0185) in PHP FPM that allowed any local user to run a PHP code under the active user of FPM process via crafted FastCGI client. The default Debian setup now correctly sets the listen.owner and listen.group to www-data:www-data in default php-fpm.conf. If you have more FPM instances or a webserver not running under www-data user you need to adjust the configuration of FPM pools in /etc/php5/fpm/pool.d/ so the accessing process has rights to access the socket.
メッセージはきちんと読まないといけないという教訓。