PHP-FPM 8.2 on OpenBSD 7.3
Tags: php, phpfpm, httpd, openbsd
Published: 2023-08-06 06:13:40

## はじめに

[OpenBSD](https://www.openbsd.org/) 🐡 プロジェクトとコミュニティは [PHP](https://www.php.net/) を含めて Web サービス向けパッケージを、ありがたいことに、とても良くサポートしています。

PHP 主要パッケージは [Ports](https://www.openbsd.org/faq/ports/ports.html) パッケージ・システムによってプリコンパイルされたバイナリとして提供されています。それだけで無く、[エクステンション (拡張モジュール)](https://www.php.net/manual/ja/extensions.php) や [Composer](https://getcomposer.org/)、それから [PECL](https://pecl.php.net/) ライブラリなどの、重要なソフトウェアも入手できます。[NextCloud](https://nextcloud.com/) や [Zabbix](https://www.zabbix.com/) のようなフレームワークも同様です。

さらに、OpenBSD [httpd](https://man.openbsd.org/httpd.8) と統合すると、その [`chroot`](https://man.openbsd.org/httpd.conf.5#chroot) 機構によってサーバーをセキュアな状態で維持するのに役立ちます。もちろん追加で [relayd](https://man.openbsd.org/relayd.8) と統合することも可能です。

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

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

### 環境

- OS: OpenBSD [7.3](https://www.openbsd.org/73.html)
- Web: OpenBSD httpd
  - 参考: [設定方法](https://obsd.solutions/ja/blog/2023/08/06/openbsd-httpd-73-web-server/index.html)
- PHP: [8.2](https://www.php.net/releases/8.2/) with PHP-FPM

<center>✿ ✿ ✿</center>

## チュートリアル

### PHP のインストール

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

```console
$ 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 を選びます。
余談ですが、各バージョンのライフタイムは [こちら](https://www.php.net/supported-versions.php) で確認できます。

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

```console
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 の設定

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

```console
$ 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` ファイル群は必要に応じて編集します。

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

設定ファイルの編集:

```console
$ doas nvim /etc/php-8.2.ini
```

編集例:

```diff
- 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
```

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

```console
$ doas nvim /etc/php-fpm.conf
```

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

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

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

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

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

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

```console
$ # 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`

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

```console
$ doas rcctl enable php82_fpm
```

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

```diff
+ pkg_scripts=(...) php82_fpm (...)
```

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

```console
$ doas rcctl start php82_fpm
```

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

```console
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` ファイルをコピーします。以下のように行います:

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

さて [`/etc/httpd.conf`](https://man.openbsd.org/httpd.conf.5) を更新して、**`fastcgi socket`** 定義を追加しましょう。[SERVERS](https://man.openbsd.org/httpd.conf.5#SERVERS) セクションに対して行います。以下のような感じです:

```apache
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"` であることと同様です。

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

```console
$ 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` を作成します:

```console
$ 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxcr15b2gxxgoc0eclt7.png)

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

<center>✿ ✿ ✿</center>

Happy serving 🕊🕊