remiリポジトリから入れたphp-fpmをnginxから使う
Nginx環境でremiレポジトリからPHPを入れたが、502 Bad Gatewayになるというお問い合わせを何度かいただいたので、よくあるケースをまとめておきます。
以下はphp 8.1 での例ですが、バージョンが変わってもパスが変わるだけです。
前提は以下のとおりです。remiからのphpインストール手順などは省略させていただきます。
- OSはRedhat系(CentOS,AlmaLinuxとか)
- remiからphpをインストール済み
- インストールした php-fpm の起動(systemctl start)も完了済み
- Nginxの設定(SetHandler等)も正しく行った(つもり)
- それでもブラウザからphpページにアクセスすると 502 Bad Gateway になる
502 Bad Gateway になっている場合は、まずNginxのエラーログを確認しましょう。以下のようにソケットファイルへのアクセスが Permission denied になっている場合は、今回説明するケースに該当します。
Nginxのエラーログ
connect() to unix:/var/opt/remi/php81/run/php-fpm/www.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: xxxxxx, request: "GET / HTTP/2.0", upstream: "fastcgi://unix:/var/opt/remi/php81/run/php-fpm/www.sock:", host: "xxxxxx"
Nginx ⇔ php-fpm 間はUnixソケット(ソケットファイル)かTCP接続でデータをやりとりします。Nginxとphp-fpmを同一サーバー内で動作させる場合は、性能的な面から通常ソケットファイルを使います。remiの設定もデフォルトではソケットファイル(/var/opt/remi/php81/run/php-fpm/www.sock)を使うようになっています(*1)。
ソケットファイルへの接続が Permission denied ということなので、ソケットファイルのパーミッションを確認してみます。
$ ls -l /var/opt/remi/php81/run/php-fpm/www.sock
srw-rw----+ 1 root root 0 3月 5 00:57 /var/opt/remi/php81/run/php-fpm/www.sock
一見、rootしかアクセスできないようにみえますが、よくみるとパーミッションリストの後にプラス(+)の文字が表示されています。これは、このファイルにACL(Access Control Lists)が設定されていることを意味しています。
ACLの詳細はここでは省きますが、Unixのファイルパーミッション設定(*2)に加えて、より細かい権限設定ができるようになります。
ACLの内容を確認してみます。ACLのエントリを確認するには getfacl コマンドを使います。
$ getfacl -p /var/opt/remi/php81/run/php-fpm/www.sock
# file: /var/opt/remi/php81/run/php-fpm/www.sock
# owner: root
# group: root
user::rw-
user:apache:rw-
group::rw-
mask::rw-
other::---
Unixパーミッションに加えて、ACLにより apacheユーザにread/write権限が設定されているのがわかります(青色箇所)。このため、Apacheからは問題なくソケットファイルにアクセスできます。一方、Nginx は デフォルト設定のままなら nginxユーザで動作しているはずですので、Nginxからはアクセスできないことになります。これが Permission denied になる原因です。
原因がわかったので対策もわかってきたと思います。ACLに nginxユーザ の read/write権限を追加すればいいのです。これは php-fpm のpool設定ファイル(/etc/opt/remi/php81/php-fpm.d/www.confとか)の listen.acl_users で設定できます。これに nginx を追加しましょう。
/etc/opt/remi/php81/php-fpm.d/www.conf の修正
; デフォルト ;listen.acl_users = apache ; 修正後 listen.acl_users = apache,nginx
設定ファイルを修正したらphp-fpmを再起動します。reloadではパーミッションが更新されないので注意してください。
$ systemctl restart php81-php-fpm.service
改めてパーミッションを確認してみると、nginxユーザがread/wite可なユーザとして追加されているのがわかります。
$ getfacl -p /var/opt/remi/php81/run/php-fpm/www.sock
# file: /var/opt/remi/php81/run/php-fpm/www.sock
# owner: root
# group: root
user::rw-
user:apache:rw-
user:nginx:rw-
group::rw-
mask::rw-
other::---
これでNginxからもアクセスできるようになっているはずです。
(*1) 設定ファイルのlisten項目で設定
(*2) User, Group, Otherに対し Read/Write/Execute を設定するあれ
投稿日:2022/03/05 12:23