Home > ブログ > remiリポジトリから入れたphp-fpmをnginxから使う

ブログ

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

タグ: Server PHP 作業実績 Nginx

Top

アーカイブ

タグ

Server (17) 作業実績 (15) プログラミング (13) ネットワーク (9) PHP (8) C (7) C++ (7) OpenSSL (5) Webアプリ (5) Nginx (5) laravel (4) Linux (4) 書籍 (3) AWS (3) JavaScript (3) Rust (2) Vue.js (2) Golang (2) EC-CUBE (2) OSS (1) MySQL (1) お知らせ (1) デモ (1) CreateJS (1) Apache (1)