HTTP2 allows web servers to serve multiple content streams on the same connection. This can reduce server and network load. I have updated my Ubuntu Apache servers to enable HTTP2.
After installing the latest Ubuntu release, I needed to redo the switch to the event Multi-Processing Module (MPM) and switch PHP content delivery back to the
php-fpm daemon. I had to repeat the process I originally used as documented here.
I serve PHP content so need an appropriate handler. The Apache2 PHP module does not work with the Event MPM. I believe the installation reactivated the PHP module causing Apache to switch MPM modules. I have purged the
libapache2-mod-php8.1 modules to prevent this from reoccurring.
These instructions are for Ubuntu/Debian-based servers, but should work for other systems that use configuration trees, and have the apache configuration tools like a2enmod and a2dismod tools.
The event MPM conflicts with the Apache PHP module, so an alternate PHP handler is required. The php-fpm daemon provides a performant service. For content development servers consider the php-cgi interpreter to get immediate visibility of PHP code changes.
Switching PHP to PHP-FPM
php-fpm daemon spawns processes to handle PHP requests. This separates the PHP overhead from the web-server threads. Usually, the
php-fpm daemon requires fewer resources to handle PHP requests than the alternate mechanisms.
Installing and Configuring
On Ubuntu/Debian the php-fpm module is installed by the php-fpm package. It will be dependent on the appropriate package appropriate for the current release. The PHP version may change when a new release is installed.
The php-fpm daemon has its own configuration tree within the
/etc/php directory, for example
/etc/php/8.1/fpm. There is a separate PHP configuration tree for PHP configuration. The daemon is configured using the
pool.d/php-www.conf file in this directory tree. This allows you to tune the server pool. This is done with the
pm parameters. The default configuration is for a fairly large dynamic pool with servers always running. For a small test server, I use these on-demand parameters.
pm = ondemand pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
Once you have the configuration done, restart the php-fpm service. If you don’t the service will continue running with the default settings.
php-fpm in Apache2
php-fpm daemon is installed, configured, and running, Apache can be configured to use
php-fpm instead of the default
php module. This is simply done by disabling one module and enabling the other within the configuration.
sudo a2dismod php8.1 sudo a2enconf php-fpm8.1 sudo apache2ctl configtest sudo systemctl restart apache2.service sudo systemctl status apache2.service
To switch to the Event MPM, the Worker (or Prefork) MPM needs to disabled first. Then the event MPM can be enabled. I use an
mpm-overrides.conf file in the
/etc/apache2/conf-available directory once this is used the
a2enconf command can be used to enable it. This file can contain configuration for multiple MPMs and will survive release upgrades. On one server the MPM overides configuration contains the following settings:
<IfModule mpm_event_module> StartServers 1 ServerLimit 8 MinSpareThreads 2 MaxSpareThreads 16 ThreadLimit 50 ThreadsPerChild 8 MaxRequestWorkers 64 MaxConnectionsPerChild 1000 </IfModule>
Once this file is ready I am ready to finish the configuration. These are the commands I use.
sudo a2dismod mpm-worker sudo a2enmod mpm-event sudo a2enmod http2 sudo a2enconf mpm-overrides sudo apache2ctl configtest sudo systemctl restart apache2.service sudo systemctl status apache2.service
Once this is completed apache2 should be converted to the Event MPM and be able to fully process http/2 requests.