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

Webサーバーのことで何かお困りですか?
ちょっとしたことから対応できます。
お困りのことがございましたらお気軽にお問いあわせください。
詳細はこちら

PHP8対応作業はこちら

Top

アーカイブ

タグ

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