87
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Systemi(株式会社システムアイ)Advent Calendar 2024

Day 25

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

Last updated at Posted at 2024-12-24

概要

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:

87
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?