設定ファイルを上からユルユルと読んでいく（PHP-FPM編）

## 概要
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だと割り当ての優先度が低くなるとのこと。
優先度が高いとプロセスが優先的に実行され、高負荷なリクエスト処理で有利だが、他のプロセスのパフォーマンスが落ちるデメリットがあるらしいです。大規模システム等で考慮するところかな。

---

まだまだ設定ファイルは続いていきますので、今回の記事では、ここで一旦終わります、、、すみませんが、終わらせてください:bow_tone1:

## 最後に
ユルくPHP-FPMの設定ファイルを翻訳しながら読んでいきましたが、概ね必要な設定は記載できたかなと思っています。ファイルの下の方は、より詳細な設定で使いそうな項目ですので、気になる方は読んでみてください。
ミドルウェアなどは設定ファイルで挙動を制御できるので、理解して使えた方がトラブルシューティングなどの際に原因特定しやすくなると思います。
こんな感じですが、もしご指摘等ありましたら、コメント等でお知らせいただけますようお願いいたします:bow_tone1: