PHP-FPM 8.1 on OpenBSD 7.3

nabbisen - May 7 '23 - - Dev Community

Summary

To my belief, OpenBSD 🐡 and their community support PHP Web services well thankfully.

The core package is offered as pre-compiled binary through Ports packages system. In addition, important softwares such as extensions, Composer and PECL libraries are available. So are frameworks such as NextCloud and Zabbix.

Moreover, when it is integrated with OpenBSD httpd, its chroot helps to keep servers secure. Of course, it is also able to additionally integrate them with relayd.

Well, PHP-FPM, PHP FastCGI Process Manager, is a part of PHP package in OpenBSD packages.
Installing PHP (php-?.? due to the version), therefore, comes with php??_fpm automatically 🙌

This post shows how to install it and configure as a server.

Environment

✿ ✿ ✿

Tutorial

Install PHP

First, install the main package:

$ doas pkg_add php
Enter fullscreen mode Exit fullscreen mode

You will be asked:

quirks-6.121 signed on 2023-04-26T08:37:06Z
Ambiguous: choose package for php
a   0: <None>
    1: php-8.0.28p1
    2: php-8.1.18
    3: php-8.2.5
Your choice: 2
Enter fullscreen mode Exit fullscreen mode

I chose PHP 8.1 this moment.
Besides, you can check the lifetime of each version here.

The result was:

php-8.1.18:argon2-20190702: ok
php-8.1.18:libsodium-1.0.18p1: ok
php-8.1.18:oniguruma-6.9.8: ok
php-8.1.18:femail-1.0p1: ok
php-8.1.18:femail-chroot-1.0p3: ok
php-8.1.18:capstone-4.0.2: ok
php-8.1.18: ok
The following new rcscripts were installed: /etc/rc.d/php81_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.1
Enter fullscreen mode Exit fullscreen mode

You should see php81_fpm come along with php-8.1 !!

Configure PHP

These directories/files are generated:

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

/etc/php-8.1:

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

/etc/php-fpm.d:
Enter fullscreen mode Exit fullscreen mode

Edit .ini or .conf file(s) as needed.

For examples, edit:

$ doas nvim /etc/php-8.1.ini
Enter fullscreen mode Exit fullscreen mode

like:

- 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
Enter fullscreen mode Exit fullscreen mode

Also, edit:

$ doas nvim /etc/php-fpm.conf
Enter fullscreen mode Exit fullscreen mode

to append to the bottom:

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

Activate extensions (Optional)

The file(s) in php-8.1.sample are PHP extensions.
According to your necessity, create symbolic link to each of them in /etc/php-8.1/, which will activate the extensions:

$ doas ln -sf /etc/php-8.1.sample/${ini} /etc/php-8.1/
Enter fullscreen mode Exit fullscreen mode

For small reference, with more files which have to be dealt with, you can use loop-processing with your shell 😉 For examples:

$ # case ksh:
$ for x in $(ls /etc/php-8.1.sample/*); do doas ln -sf $x /etc/php-8.1/; done
$ # case fish:
$ for x in /etc/php-8.1.sample/*; doas ln -sf $x /etc/php-8.1/; end
Enter fullscreen mode Exit fullscreen mode

Configure PHP-FPM

OK. We're ready.

The pkg-readme of PHP 8.1 was obtanined in installation of PHP as /usr/local/share/doc/pkg-readmes/php-8.1, which says:

The main OpenBSD php packages include php-fpm, FastCGI Process Manager.
This manages pools of FastCGI processes: starts/restarts them and
maintains a minimum and maximum number of spare processes as
configured. You can use rcctl(8) to enable php-fpm at boot,
and start it at runtime:

rcctl enable php81_fpm
rcctl start php81_fpm

Let's activate the daemon:

$ doas rcctl enable php81_fpm
Enter fullscreen mode Exit fullscreen mode

For another small reference, it appends or modifies the line in /etc/rc.conf.local:

+ pkg_scripts=php81_fpm
Enter fullscreen mode Exit fullscreen mode

Now it's time to start the daemon:

$ doas rcctl start php81_fpm
Enter fullscreen mode Exit fullscreen mode
php81_fpm(ok)
Enter fullscreen mode Exit fullscreen mode

OK 😄

Usage

Next, we have to set up a web server for them.

Only if you haven't configured httpd, copy the .conf file from the examples OpenBSD offers as below:

$ doas cp -p /etc/examples/httpd.conf /etc/
Enter fullscreen mode Exit fullscreen mode

Well, edit /etc/httpd.conf to add fastcgi socket definitions in some SERVERS section like this:

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"
    } 
}
Enter fullscreen mode Exit fullscreen mode

Note that chroot works in this context 💡

Therefore, fastcgi socket "/run/php-fpm.sock" in /etc/httpd.conf actually means fastcgi socket "/var/www/run/php-fpm.sock".
This is the same to that root "/htdocs" means "/var/www/htdocs".

Concolusion

Let's make /var/www/htdocs/index.php for testing:

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

Connecting to your host with browser will show the general information !!

php-fpm-works

PHP 8.1 on OpenBSD 7.3 🌻

✿ ✿ ✿

Happy serving ✨☕✨

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .