概要
2024年のアドベントカレンダー最終日の投稿になりますが、、、特に技術的に素晴らしい記事ではなく、ユルユルした記事を書きます。それで考えたのが、「私がよくやる設定ファイルの読み方」でPHP-FPMの設定を上から読んでいくという記事になります。
その読み方は大したことなく、日本語に訳して、キーや設定する値を確認することです。ミドルウェアとかの設定ファイルは読みにくかったりするので、機能の理解を深めるため、そういう読み方をしています。
読者層
- これから開発でPHPを使う方
- PHP-FPMの設定を改めて確認したい方
この記事の読者として上記の通りかなと思いますので、当てはまらなければ、ここら辺でそっとページを閉じてください。
設定ファイルを読む
前提
- PHP v8.4.2
- bitnami/php-fpm(コンテナイメージ)
- OrbStack
環境準備
docker container run -it --rm bitnami/php-fpm /bin/bash
cat /opt/bitnami/php/etc/php-fpm.d/www.conf
設定ファイルを読む
ここでは/opt/bitnami/php/etc/php-fpm.d/www.conf
に配置している「www.conf」設定ファイルを日本語に訳していきながら上から読んでいきます。
; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]
翻訳
'www'という名前の新しいプールを開始します。
変数 $pool は任意のディレクティブで使用でき、
プール名 (ここでは「www」)
プール名を[]に任意で指定できるようですね〜プロセスを確認できる「www」のことですね。
あまり気にしたことはないですが、下記のように複数のプールを設定できます。
[www1]
設定色々
[www2]
設定色々
上記のように別々に設定することで、アプリケーションやドメインの分離ができるそうですが、、、そのような設定はしたことないので、またどこかで試してみようかなと。
; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /opt/bitnami/php) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool
翻訳
; Per pool prefix
;次のディレクティブにのみ適用されます。:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; 設定されていない場合は、代わりにグローバル プレフィックス (または @php_fpm_prefix@) が適用されます。
; 注: このディレクティブは、グローバル プレフィックスを基準にすることもできます。
; Default Value: none
;prefix = /path/to/pools/$pool
こちらはログ種類と配置先になりますね〜
prefixのコメントアウトを外して、/etc/conf/$pool
と設定したら/etc/conf/www
にログが出力されます。
; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
; --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
; If the group is not set, the user's group is used.
user = daemon
group = daemon
翻訳
;子プロセスの Unix ユーザー/グループ。これはマスターの場合にのみ使用できます。
;プロセスを実行しているユーザーは root です。子プロセスの作成後に設定されます。
;ユーザーとグループは、名前または数値で指定できます。
; ID。
;注: ユーザーが root の場合、実行可能ファイルは次のコマンドで開始する必要があります。
; --allow-to-run-as-root オプションが機能するようになります。
;デフォルト値: ユーザーはデフォルトでマスタープロセス実行ユーザーに設定されます。
; グループが設定されていない場合は、ユーザーのグループが使用されます。
user = daemon
group = daemon
プロセスの実行ユーザー/グループを指定するところになります。
apacheの場合は、
user = apache
group = apache
nginxの場合は、
user = nginx
group = nginx
このような設定をします。
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 9000
翻訳
; FastCGI リクエストを受け入れるアドレス。
;有効な構文は次のとおりです。
; 'ip.add.re.ss:port' - TCP ソケットで特定の IPv4 アドレスをリッスンします。
; 特定のポート。
; '[ip:6:addr:ess]:port' - TCP ソケットで特定の IPv6 アドレスをリッスンします。
; 特定のポート。
; 'port' - TCP ソケットですべてのアドレスをリッスンします。
; (IPv6 および IPv4 マッピング) 特定のポート上。
; '/path/to/unix/socket' - UNIX ソケットでリッスンします。
;注: この値は必須です。
listen = 9000
リクエストを待ち受けるポート or UNIX ドメインソケットを指定します。
こちらの値は必須項目で、unixソケットの場合は、
listen = /run/php-fpm/www.sock
上記のように設定します。
; Set listen(2) backlog.
; Default Value: 511 (-1 on Linux, FreeBSD and OpenBSD)
;listen.backlog = 511
翻訳するまでもなく、未処理のソケットキューのバックログサイズを設定するところですが、高トラフィックのシステムに関われば気にするところかなと。
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. The owner
; and group can be specified either by name or by their numeric IDs.
; Default Values: Owner is set to the master process running user. If the group
; is not set, the owner's group is used. Mode is set to 0660.
;listen.owner = daemon
;listen.group = daemon
;listen.mode = 0660
翻訳
; UNIX ソケットが使用されている場合は、そのソケットのアクセス許可を設定します。 Linux では、読み取り/書き込み
; Web サーバーからの接続を許可するには、権限を設定する必要があります。多くの
; BSD 派生システムでは、権限に関係なく接続が許可されます。オーナー
; およびグループは、名前または数値 ID で指定できます。
; デフォルト値: 所有者は、マスター プロセスを実行しているユーザーに設定されます。グループの場合
; が設定されていない場合は、所有者のグループが使用されます。モードは0660に設定されています。
;listen.owner = daemon
;listen.group = daemon
;listen.mode = 0660
Unixのソケット接続する場合に設定する箇所ですね。
NginxとUnixソケット接続する場合、
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
というように設定します。
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users =
;listen.acl_groups =
翻訳
; POSIX アクセス制御リストがサポートされている場合は、次を使用して設定できます
; これらのオプションの値は、ユーザー/グループ名のカンマ区切りのリストです。
; 設定すると、listen.owner と listen.group は無視されます
;listen.acl_users =
;listen.acl_groups =
ソケットファイルのパーミッションをより詳細に設定できるところ、、、らしいです。
ちょっと難しいですが、一旦はコメントアウトしておき、nginxのみアクセスできるようにするなら、
listen.acl_users = nginx
listen.acl_groups = nginx
という設定になると思います。
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
;listen.allowed_clients = 127.0.0.1
翻訳
;接続が許可されている FastCGI クライアントのアドレス (IPv4/IPv6) のリスト。
;オリジナルの FCGI_WEB_SERVER_ADDRS 環境変数と同等
; PHP FCGI (5.2.2+)。 tcp リッスン ソケットでのみ意味があります。各アドレス
;コンマで区切る必要があります。この値を空白のままにすると、接続は
;どのIPアドレスからでも受け付けます。
;デフォルト値: 任意
;listen.allowed_clients = 127.0.0.1
こちらは、どのクライアント(IPアドレス)からの接続を許可するかを制御するものです。TCPソケットを介して接続する場合、セキュリティを高めるために使うかなと。
値が空の場合は、どこからでも接続できるんですよね〜
; Set the associated the route table (FIB). FreeBSD only
; Default Value: -1
;listen.setfib = 1
FreeBSDの場合だけ使うことができる設定ですが、PHP-FPMが使用するルーティングテーブルを指定するそうです、、、よく分からないので、調べます。
; Specify the nice(2) priority to apply to the pool processes (only if set)
; The value can vary from -19 (highest priority) to 20 (lower priority)
; Note: - It will only work if the FPM master process is launched as root
; - The pool processes will inherit the master process priority
; unless it specified otherwise
; Default Value: no set
; process.priority = -19
翻訳
;プール プロセスに適用する nice(2) 優先度を指定します (設定されている場合のみ)。
;値は -19 (最高の優先度) から 20 (低優先度) まで変化します。
;注: - FPM マスター プロセスがルートとして起動されている場合にのみ機能します。
; - プール プロセスはマスター プロセスの優先度を継承します。
;特に明記しない限り
;デフォルト値: 設定なし
; process.priority = -19
これは、、、どういう意味だ!?「プールプロセスの優先度を設定する」とは?
-19が最高の優先度で、CPUリソースを優先的に割り当ててくれて、20だと割り当ての優先度が低くなるとのこと。
優先度が高いとプロセスが優先的に実行され、高負荷なリクエスト処理で有利だが、他のプロセスのパフォーマンスが落ちるデメリットがあるらしいです。大規模システム等で考慮するところかな。
まだまだ設定ファイルは続いていきますので、今回の記事では、ここで一旦終わります、、、すみませんが、終わらせてください
最後に
ユルくPHP-FPMの設定ファイルを翻訳しながら読んでいきましたが、概ね必要な設定は記載できたかなと思っています。ファイルの下の方は、より詳細な設定で使いそうな項目ですので、気になる方は読んでみてください。
ミドルウェアなどは設定ファイルで挙動を制御できるので、理解して使えた方がトラブルシューティングなどの際に原因特定しやすくなると思います。
こんな感じですが、もしご指摘等ありましたら、コメント等でお知らせいただけますようお願いいたします