Summary
In OpenBSD, installing PHP by pkg_add
(of ports
) is followed by installing php-fpm automatically. (It’s nice 😃)
However, it doesn’t work as daemon out of the box now in case of PHP 7.2 (and 7.1). The problem can be fixed by adding its pool definition manually. This post will show how to do it.
Besides, it is fixed in the -current
version.
* Note: The above links are to GitHub commits, but The version control system OpenBSD actually uses is CVS.
Environment
- OS: OpenBSD 6.4 amd64
- PHP version: 7.2
Tutorial
A Problem
OpenBSD 6.4 has 4 versions of PHP:
# pkg_add php
quirks-3.16 signed on 2018-10-12T15:26:25Z
Ambiguous: choose package for php
a 0: <None>
1: php-5.6.38p0
2: php-7.0.32p1
3: php-7.1.22
4: php-7.2.10
Your choice:
According to their support terms, PHP 5.6 is almost no longer safe. So I choose PHP 7.*, especially 7.2:
Your choice: 4
php-7.2.10: ok
As a result, these files are created in /etc
:
$ ls /etc/php*
/etc/php-7.2.ini /etc/php-fpm.conf
/etc/php-7.2:
/etc/php-7.2.sample:
opcache.ini
Sadly, php72_fpm
in php-7.2.10
doesn’t work by default:
# rcctl -d start php72_fpm
doing _rc_parse_conf
...
php72_fpm_flags empty, using default ><
doing _rc_parse_conf /var/run/rc.d/php72_fpm
doing _rc_quirks
doing rc_check
php72_fpm
doing rc_start
doing _rc_wait start
doing rc_check
[10-Nov-2018 23:32:18] WARNING: Nothing matches the include pattern '/etc/php-fpm.d/*.conf' from /etc/php-fpm.conf at line 125.
[10-Nov-2018 23:32:18] ERROR: No pool defined. at least one pool section must be specified in config file
[10-Nov-2018 23:32:18] ERROR: failed to post process the configuration
[10-Nov-2018 23:32:18] ERROR: FPM initialization failed
doing _rc_rm_runfile
(failed)
The Reason
It is because of the lack of “Pool Definintions”.
The description is at the bottom of /etc/php-fpm.ini
:
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
; Multiple pools of child processes may be started with different listening
; ports and different management options. The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)
; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
; - the global prefix if it's been set (-p argument)
; - /usr/local otherwise
include=/etc/php-fpm.d/*.conf
But there is no /etc/php-fpm.d/*.conf
.
The Solution
Make the directory and the file manually:
# mkdir /etc/php-fpm.d
# touch /etc/php-fpm.d/default.conf
What should be written in /etc/php-fpm.d/default.conf
?
We can get it by installing (and uninstalling 😜) PHP 7.0 (php-7.0.32p1
) package.
Its /etc/php-fpm.conf
includes the desired pool definition.
The essence of the definition is like this:
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
[www]
user = www
group = www
listen = /var/www/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = /var/www
Also here is the full version as Gist (423 lines with comments).
Writing in /etc/php-fpm.d/default.conf
, the preparation is finished.
The result is:
# rcctl start php72_fpm
(ok)
OK 😆
Happy serving 🕊