はじめに
OpenBSD 🐡 プロジェクトとコミュニティは PHP を含めて Web サービス向けパッケージを、ありがたいことに、とても良くサポートしています。
PHP 主要パッケージは Ports パッケージ・システムによってプリコンパイルされたバイナリとして提供されています。それだけで無く、エクステンション (拡張モジュール) や Composer、それから PECL ライブラリなどの、重要なソフトウェアも入手できます。NextCloud や Zabbix のようなフレームワークも同様です。
さらに、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
を設定します。ここでの etc
は chroot
が働いた後のものです。一例ですが、以下のようにして、名前解決や 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.conf
の fastcgi 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 8.2 on OpenBSD 7.3 です 🌻
Happy serving 🕊🕊