Something I’ve wanting to do a long time but never got around to: enabling HTTP/2 on my Apache webserver. HTTP/2 has been around for over 8 years now. It is supposed to be faster and cooler, and by now almost every browser out there supports it.
In my case it also meant switching setups for Apache and PHP. Apache’s http2-module doesn’t run on mpm_prefork; but mpm_prefork is required by Apache’s PHP module. (MPM: multiprocessing module, the way Apache receives and processes requests. Prefork is one MPM type, event and worker are others.) So I needed to switch from mpm_prefork to mpm_event and from mod_php to PHP-FPM.
Thanks to the handy commands a2enmod
and a2dismod
commands changing the setup is quite easy.
First install PHP-FPM:
sudo apt install php7.4-fpm
(yes I know that is a very old PHP version …)
Then disable and enable modules:
sudo a2dismod php7.4 mpm_prefork sudo a2enmod mpm_event proxy_fcgi http2
Make sure to also enable the setenvif
module if you hadn’t already done that. I ran sudo a2enconf php7.4-fpm
as well, not sure whether that is required though.
Finally, restart Apache:
sudo service apache2 restart
I tried this first on a Debian server running on Windows WSL, and it worked perfectly well. I was slightly worried that “the new Apache” might run as a different user, but that turned out not be the case (saving me from chown-ing many, many files). Then, on the server you’re looking at I backed-up the /etc/apache2 folder and ran the same commands. This time restarting Apache threw an error:
Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.
None of the suggestions provided anything useful, so I had to quickly roll back the changes.
sudo a2dismod mpm_event proxy_fcgi http2 sudo a2enmod php7.4 mpm_prefork sudo service apache2 restart
Time to scan the logs. There was nothing in Apache’s own error.log, but fortunately syslog came to the rescue:
Syntax error on line 8 of /etc/apache2/sites-enabled/some-site.conf: Invalid command 'php_admin_value', perhaps misspelled or defined by a module not included in the server configuration.
Turns out that php_admin_value
, php_value
and php_flag
are only recognized by mod_php, not by PHP-FPM. I was using some of them for setting things like upload_max_filesize
and post_max_size
, in vhosts and in .htaccess. But PHP-FPM does support .user.ini-files. So I created a bunch of such files and put them in the web roots of the affected sites. For a smooth transition I put the old vhost/htaccess commands in conditional blocks, like this:
<IfModule mod_php7.c> php_value post_max_size 9M php_value upload_max_filesize 8M </IfModule>
Disable and enable the modules again:
sudo a2dismod php7.4 mpm_prefork sudo a2enmod mpm_event proxy_fcgi http2
This time I tested the new config with sudo apachectl -t
. “Syntax OK”! So, fingers crossed:
sudo service apache2 restart
VoilĂ .