PHP-FPM 8.2 on OpenBSD 7.3

@nabbisen

Series


はじめに

OpenBSD 🐡 プロジェクトとコミュニティは PHP を含めて Web サービス向けパッケージを、ありがたいことに、とても良くサポートしています。

PHP 主要パッケージは Ports パッケージ・システムによってプリコンパイルされたバイナリとして提供されています。それだけで無く、エクステンション (拡張モジュール)Composer、それから PECL ライブラリなどの、重要なソフトウェアも入手できます。NextCloudZabbix のようなフレームワークも同様です。

さらに、OpenBSD httpd と統合すると、その chroot 機構によってサーバーをセキュアな状態で維持するのに役立ちます。もちろん追加で relayd と統合することも可能です。

ところで、PHP-FPM という PHP の FastCGI プロセス・マネージャーがありますが、こちらは OpenBSD パッケージ管理上は PHP の一部として提供されています。 そのため PHP (php-?.? パッケージ名はインストールするバージョンによります) をインストールするだけで、php??_fpm も自動的にインストールされます 🙌

本記事でパッケージをインストールしてサーバーとして設定する流れをご紹介します。

環境

✿ ✿ ✿

チュートリアル

PHP のインストール

ます主要パッケージをインストールします:

$ doas pkg_add php

以下のようにたずねられるでしょう:

quirks-6.121 signed on 2023-08-02T17:33:30Z
Ambiguous: choose package for php
a	0: <None>
	1: php-7.4.33p0
	2: php-8.0.29
	3: php-8.1.22
	4: php-8.2.9
Your choice:

“4” すなわち 8.2 を選びます。 余談ですが、各バージョンのライフタイムは こちら で確認できます。

結果は以下の通りでした:

php-8.2.9:capstone-4.0.2: ok
php-8.2.9:femail-1.0p1: ok
php-8.2.9:femail-chroot-1.0p3: ok
php-8.2.9:libsodium-1.0.18p1: ok
php-8.2.9:argon2-20190702: ok
php-8.2.9:oniguruma-6.9.8: ok
php-8.2.9: ok
The following new rcscripts were installed: /etc/rc.d/php82_fpm
See rcctl(8) for details.
New and changed readme(s):
	/usr/local/share/doc/pkg-readmes/femail-chroot
	/usr/local/share/doc/pkg-readmes/php-8.2

php-8.2 とともに php82_fpm がインストールされていますね !!

PHP の設定

以下のディレクトリとファイルが生成されています:

$ ls /etc/php*
/etc/php-8.2.ini    /etc/php-fpm.conf

/etc/php-8.2:

/etc/php-8.2.sample:
opcache.ini

/etc/php-fpm.d:

.ini / .conf ファイル群は必要に応じて編集します。

カスタマイズ例 (オプション)

設定ファイルの編集:

$ doas nvim /etc/php-8.2.ini

編集例:

- post_max_size = 8M
+ post_max_size = 30M
  (...)
- upload_max_filesize = 2M
+ upload_max_filesize = 24M
  (...)
- allow_url_fopen = Off
+ ; for composer; disabled in php-fpm
+ allow_url_fopen = On

さらに、こちらのファイルを編集することもあるかもしれません:

$ doas nvim /etc/php-fpm.conf

例えば末尾に以下を追加する等です:

+ ; set On in php.ini for composer, therefore:
+ php_admin_value[allow_url_fopen] = Off

エクステンションの有効化 (オプション)

/etc/php-8.2.sample の中のファイル群は、PHP のエクステンションです。opcache.ini 等があります。 ニーズに応じて、その中から対象を選んでシンボリック・リンクを /etc/php-8.2/ に作成します。そうすることでエクステンション群が有効化されます:

$ doas ln -sf /etc/php-8.2.sample/${ini} /etc/php-8.2/

ちょっとした参考情報ですが、操作対象が多い場合、シェルでループ処理にまかせることもできます 😉 こんな感じです:

$ # ksh の場合:
$ for x in $(ls /etc/php-8.2.sample/*); do doas ln -sf $x /etc/php-8.2/; done
$ # fish の場合:
$ for x in /etc/php-8.2.sample/*; doas ln -sf $x /etc/php-8.2/; end

PHP-FPM の設定

順調ですね。PHP サービスをローンチするための準備がほぼ完了しました。

PHP の pkg-readme がインストール時に /usr/local/share/doc/pkg-readmes/php-8.2 としてつくられています。そこに以下のように書かれています:

OpenBSD php 主要パッケージに php-fpm すなわち FastCGI プロセス・マネージャーが含まれています。 これを使うことで FastCGI プロセスのプール管理を行えます: プロセスの起動 / 再起動を行ったり、 予備プロセスの最小数や最大数を設定された内容で調整したりできます。 rcctl(8) を使用して、ブート時に php-fpm を有効にしたり、 実行によって php-fpm を起動させたりできます:

rcctl enable php82_fpm
rcctl start php82_fpm

デーモンを有効化しましょう:

$ doas rcctl enable php82_fpm

もう一つちょっとした参考情報です。上記によって /etc/rc.conf.local が更新されて、以下の行が追加あるいは変更されます:

+ pkg_scripts=(...) php82_fpm (...)

さあ、デーモンを起動しましょう:

$ doas rcctl start php82_fpm

結果は以下の通りでした:

php82_fpm(ok)

成功です 😄

/var/www/etc の設定 (オプション)

これは PHP だけで無く他の Web アプリでも必要になることがあります。

/var/www/etc を設定します。ここでの etcchroot が働いた後のものです。一例ですが、以下のようにして、名前解決や TLS 接続を有効化します:

$ ls -lR /var/www/etc
/var/www/etc:
total 16
-rw-r--r--  1 root  daemon   35 Aug 03 00:00 hosts
-r--r--r--  1 root  daemon  292 Aug 03 00:00 localtime
-rw-r--r--  1 root  daemon   99 Aug 03 00:00 resolv.conf
drwxr-xr-x  2 root  daemon  512 Aug 03 00:00 ssl/

/var/www/etc/ssl:
total 708
-r--r--r--  1 root  daemon  341121 Aug 03 00:00 cert.pem
-r--r--r--  1 root  daemon     745 Aug 03 00:00 openssl.cnf

Web サーバーとの統合

次は、PHP 向け Web サーバーの設定です。

もしもまだ httpd 設定が無い場合のみ、OpenBSD が提供してくれている examples ディレクトリから、.conf ファイルをコピーします。以下のように行います:

$ doas cp -p /etc/examples/httpd.conf /etc/

さて /etc/httpd.conf を更新して、fastcgi socket 定義を追加しましょう。SERVERS セクションに対して行います。以下のような感じです:

server "default" {
    listen on * port 80
    #listen on * port 443

    root "/htdocs"
    directory index index.php

    location "/*.php" {
        fastcgi socket "/run/php-fpm.sock"
    }
    location "/*.php[/?]*" {
        fastcgi socket "/run/php-fpm.sock"
    }
}

このコンテキストで chroot が働いていることに気を付けましょう 💡 このため /etc/httpd.conffastcgi socket "/run/php-fpm.sock" は、実際には fastcgi socket "/var/www/run/php-fpm.sock" のことです。 これは root "/htdocs" が実際には "/var/www/htdocs" であることと同様です。

実際に見てみましょう。以下のようになっています:

$ ls -l /var/www/run
total 0
srw-rw----  1 www  www  0 Aug 03 00:01 php-fpm.sock=

おわりに

サーバーのテストをしてみましょう。/var/www/htdocs/index.php を作成します:

$ echo "<?php phpinfo(1); ?>" | \
      doas tee "/var/www/htdocs/index.php" >> /dev/null
$ # delete it afterwards:
$ #doas rm /var/www/htdocs/index.php

ブラウザでホストに接続します。PHP 設定情報が出力されるでしょう !!

php-82-on-openbsd-73

こんにちは PHP 8.2 on OpenBSD 7.3 です 🌻

✿ ✿ ✿

Happy serving 🕊🕊

Series

PHP-FPM
  1. PHP-FPM 8.2 on OpenBSD 7.3

Comments or feedbacks are welcomed and appreciated.