Drupal 10.1 On OpenBSD 7.3: Install with Composer




Drupal is one of the content management systems aka CMS. It has long history and good stability, based on PHP and Symfony.

Symfony is one of the PHP web frameworks. It is clearly classified, functional and robust.

They are often good options to build web services.

  • Symfony offers primitive possibility of creating flexible data structure and user interface.
  • Drupal offers robust components to build service containing authentication, user roles and functional fields.

Besides, Drupal Association wrote about “Why We Use Symfony”.

This post shows how to install Drupal with PHP on OpenBSD, the solid OS. Here, Composer, the PHP package manager, is used, which possibly makes later update easier.


Yes, Drupal 10 supports PHP 8 (as well as Drupal 9). Actually it does PHP 8.1 and later. (See: “PHP versions supported” in the official docs)

In addition, it’s worthy of mention that Composer is given as bound to PHP 8.1 instead of 8.2. The detail will be written later.


πŸͺ„ Overview πŸ’«

  1. Create MariaDB database for Drupal.
  2. Install PHP, its extensions and Composer. Other packages are optional.
  3. Create a Drupal project with Composer.
  4. Configure servers: PHP-FPM for app and OpenBSD httpd for web.
  5. Install Drupal via the web installer.

The description is below.

Create MariaDB database for Drupal

If you haven’t installed MariaDB yet, this post will help.

Connect to your database server.

$ mysql -u root -p

Create a database and the user for it.

CREATE DATABASE <database> \
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    ON <database>.* TO <dbuser> \
    IDENTIFIED BY '<dbpassword>';


Install PHP, its extensions and Composer


We can get both PHP and PHP-FPM with the one-liner below thanks to the great Ports package system.

$ doas pkg_add php
$ # choose php-8.2

PHP extensions

Get them via Ports, too:

$ doas pkg_add php-curl php-gd php-intl php-zip php-mysqli php-pdo_mysql # + php-[...] if necessary
$ # choose those of php-8.2

Be sure to activate them:

$ doas ln -s /etc/php-8.2.sample/* /etc/php-8.2/

Creating the symbolic links as above means the extensions are activated. You can confirm them:

$ ls -l /etc/php-8.2
total 0
lrwxr-xr-x  1 root  wheel  26 Sep 24 11:36 curl.ini@ -> ../php-8.2.sample/curl.ini
lrwxr-xr-x  1 root  wheel  24 Sep 24 11:36 gd.ini@ -> ../php-8.2.sample/gd.ini
lrwxr-xr-x  1 root  wheel  26 Sep 24 11:36 intl.ini@ -> ../php-8.2.sample/intl.ini
lrwxr-xr-x  1 root  wheel  28 Sep 24 11:36 mysqli.ini@ -> ../php-8.2.sample/mysqli.ini
lrwxr-xr-x  1 root  wheel  29 Sep 24 11:36 opcache.ini@ -> ../php-8.2.sample/opcache.ini
lrwxr-xr-x  1 root  wheel  31 Sep 24 11:36 pdo_mysql.ini@ -> ../php-8.2.sample/pdo_mysql.ini
lrwxr-xr-x  1 root  wheel  25 Sep 24 11:36 zip.ini@ -> ../php-8.2.sample/zip.ini


You can get Composer with one-liner, too. Be careful, however, that it’s bound to PHP 8.1 (and therefore PHP 8.1 will be installed together here).

$ doas pkg_add composer

Other packages if necessary (Optional)

$ #doas pkg_add unzip git

Create a Drupal project with Composer

Create a project

Let’s see which PHP version Composer is behind:

$ composer -vvv about

In my case, the result was:

Running 2.5.4 (2023-02-15 13:10:06) with PHP 8.1.23 on OpenBSD / 7.3
Failed to initialize global composer: Composer could not find the config file: /home/(...)/.composer/composer.json
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
Composer - Dependency Manager for PHP - version 2.5.4
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.

It showed “Running 2.5.4 (2023-02-15 13:10:06) with PHP 8.1.23 on OpenBSD / 7.3”. When going to build Drupal site with PHP 8.1, there wasn’t any problem. However, it was not the case.

Therefore I used a little trick to run composer to create a Drupal project.

$ php-8.2 /usr/local/libexec/composer.phar \
      create-project drupal/recommended-project <drupal-dir>

Besides, in case that php 8.1 is used, the command lines are simpler:

$ #composer \
      create-project drupal/recommended-project <drupal-dir>

Well, the output around PHP 8.2 was:

Creating a "drupal/recommended-project" project at "./drupal_on_openbsd"
Installing drupal/recommended-project (10.1.4)
  - Installing drupal/recommended-project (10.1.4): Extracting archive
Created project in /var/www/sites/drupal_on_openbsd
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 59 installs, 0 updates, 0 removals
  - Downloading composer/installers (v2.2.0)
  - Downloading drupal/core (10.1.4)
  - Installing composer/installers (v2.2.0): Extracting archive
  - Installing drupal/core (10.1.4): Extracting archive
  - Installing drupal/core-recommended (10.1.4)
Generating autoload files
39 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Scaffolding files for drupal/core:
  - Copy [project-root]/.editorconfig from assets/scaffold/files/editorconfig
  - Copy [web-root]/sites/default/default.services.yml from assets/scaffold/files/default.services.yml
  - Copy [web-root]/sites/default/default.settings.php from assets/scaffold/files/default.settings.php
  - Copy [web-root]/modules/README.txt from assets/scaffold/files/modules.README.txt
  - Copy [web-root]/profiles/README.txt from assets/scaffold/files/profiles.README.txt
  - Copy [web-root]/themes/README.txt from assets/scaffold/files/themes.README.txt
  * Homepage: https://www.drupal.org/project/drupal
  * Support:
    * docs: https://www.drupal.org/docs/user_guide/en/index.html
    * chat: https://www.drupal.org/node/314178
No security vulnerability advisories found
  Congratulations, you’ve installed the Drupal codebase  
  from the drupal/recommended-project template!          

Next steps:
  * Install the site: https://www.drupal.org/docs/installing-drupal
  * Read the user guide: https://www.drupal.org/docs/user_guide/en/index.html
  * Get support: https://www.drupal.org/support
  * Get involved with the Drupal community:
  * Remove the plugin that prints this message:
      composer remove drupal/core-project-message
  * Homepage: https://www.drupal.org/project/drupal
  * Support:
    * docs: https://www.drupal.org/docs/user_guide/en/index.html
    * chat: https://www.drupal.org/node/314178

Configure directory and permissions

A bit more work is required.

$ cd <drupal-dir>

$ mkdir ./config

$ doas chown -R www: ./config
$ doas chown -R www: ./web/sites/default

Done !! Now your project is waiting to be initialized and installed.

Configure servers

PHP-FPM for app

Activate php82_fpm daemon and then run it:

$ doas rcctl enable php82_fpm
$ doas rcctl start php82_fpm

Besides, the more detail about PHP-FPM 8.2 server is written in my past post.

OpenBSD httpd for web

Configure web server(s) to enable the flow below:

Client --(request)--> Web: httpd --> Gateway: PHP-FPM --> App: Drupal

Edit the configuration file of OpenBSD httpd:

$ doas nvim /etc/httpd.conf

to add definitions like below:

server "<fqdn>" {
        listen on egress tls port https
        tls {
                certificate     "/etc/ssl/<fqdn>.pem"
                key             "/etc/ssl/private/<fqdn>.key"
        # alternative to the above:
        #listen on egress port http

        log {
                access  "<fqdn>-access.log"
                error   "<fqdn>-error.log"

        root "/<drupal-dir>/web" # (with chroot)
        directory index index.php

        location "/*.php" { 
                fastcgi socket "/run/php-fpm.sock"
        location "/*.php[/?]*" { 
                fastcgi socket "/run/php-fpm.sock"
        location "*" {
                fastcgi socket "/run/php-fpm.sock"
                request rewrite "/index.php$REQUEST_URI"

Both <fqdn> (your domain etc.) and <drupal-dir> are, of course, up to your environment.

The root of the server above must point to:

  • not: the Drupal project root (aka /var/www/<drupal-dir>)
  • but: /web in it (aka /var/www/<drupal-dir>/web).

Besides, they are affected by chroot.

You don’t have TLS certificates ? The notes below could help.

Well, when all are done, reload the daemon:

$ doas rcctl restart httpd

TLS configuration files

It is able to get them via requests to Let’s Encrypt with acme-client. (See: How to configure OpenBSD acme-client).

Alternatively, you can get them as self-signed certificates with command lines such as:

$ cd /etc/ssl

$ # [ consts ]
$ # case ksh:
$ export MY_DOMAIN="..."
$ export MY_STATE="..."
$ export MY_ORGANIZATION="..."
$ # case fish:
$ # set -x MY_DOMAIN "..."; (...)

$ # [ generate ]
$ doas openssl req -newkey rsa:2048 -new -nodes -x509 -days 36500 -keyout private/$MY_DOMAIN.key -out $MY_DOMAIN.crt \
$ doas chmod 400 private/$MY_DOMAIN.key

$ # return to your working directory

Servers with and without TLS connection (Optional)

In addition, you can also redirect all http requests to https as needed:

# httpd.conf
server "<fqdn>" {
        listen on egress http
        # (...)
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
server "<fqdn>" {
        listen on egress tls port https
        # (...)

Install Drupal via the web installer

Connect to https://\<fqdn\> with your web browser. You will be redirected to https://\<fqdn\>/core/install.php.

When the web install is shown, follow their messages. The screenshots are below.



Installation profile


Database configuration

drupal-101-on-openbsd-install-03 drupal-101-on-openbsd-install-04



Site configuration





Yay 😁 Here comes Drupal with OpenBSD πŸ™Œ


Symfony is one of my favorite frameworks for web development. It’s because:

  1. It has clean classes and powerful functionality.
  2. It is designed with security in mind. (It’s also true on Drupal.)
  3. It becomes more powerful with useful helpers such as MakeBundle.
  4. It also provides great official documentation.
  5. The cache system helps performance and also development.

And, again, Drupal is based on it.

Besides, they may have steeper learning curve for beginners than WordPress and perhaps Laravel.


As above, Drupal is running on PHP working with OpenBSD httpd. All of them are hosted on OpenBSD 🐑

🌟 Happy serving 🌟


  1. Drupal 10.1 On OpenBSD 7.3: Install with Composer

Comments or feedbacks are welcomed and appreciated.