How to Enable HTTP/2 in Apache2 on Google Cloud Server

Requirements

  • A self-managed VPS or dedicated server with Ubuntu 18.04 running Apache 2.4.xx.
  • A registered domain name with working HTTPS (TLS/SSL). HTTP/2 only works alongside HTTPS because most browsers, including Firefox and Chrome, don’t support HTTP/2 in cleartext (non-TLS) mode.

Step 1: Install Apache2

Per default it will be apache2 version 2.4.29 what is enought for http2 support.

  sudo apt install apache2

Step 2: Tell Apache to use PHP FastCGI

You want to make Apache use a compatible PHP implementation by changing mod_php to php-fpm (PHP FastCGI). If your website or app breaks on FastCGI, you can always revert back to mod_php until further troubleshooting.

Install PHP FastCGI module for PHP 7.2, it is default version for Ubuntu 18.04

sudo apt install php7.2-fpm 

Enable required modules, proxy_fcgi and setenvif:

sudo a2enmod proxy_fcgi setenvif

Enable php7.2-fpm:

sudo a2enconf php7.2-fpm 

Disable the mod_php module:

sudo a2dismod php7.2

Restart Apache:

sudo service apache2 restart

Step 3: Change MPM from “prefork” to “event”

Since the default “prefork” MPM (Multi-Processing Module) is not fully compatible with HTTP/2, you’ll need to change Apache’s current MPM to “event” (or “worker”). This is shown by the error message in Apache versions greater than 2.4.27 as – AH10034: The mpm module (prefork.c) is not supported by mod_http2.

Keep in mind that your server requires more horsepower for HTTP/2 than for HTTP/1.1, due to the multiplexing feature and other factors. That said, smaller servers with low traffic may not see much difference in performance.

First, disable the “prefork” MPM:

sudo a2dismod mpm_prefork 

Enable the “event” MPM:

sudo a2enmod mpm_event 

Restart Apache2 and PHP 7.2:

sudo service apache2 restart && sudo service php7.2-fpm restart

Step 4: Add a line to your Virtual Host file

Add the following line to your site’s current Virtual Host config file. This can go anywhere between the … tags. If you want to serve HTTP/2 for all your sites, add this to your global /etc/apache2/apache2.conf file instead of per each individual site’s Virtual Host file.

Protocols h2 h2c http/1.1

Explanation: h2 is TLS-encrypted HTTP/2, h2c is cleartext HTTP/2, and http/1.1 is ordinary HTTP/1.1.

Having http/1.1 at the end of the line provides a fallback to HTTP/1.1, while h2c is not strictly necessary.

Step 5: Enable the mod_http2 Apache module

Now you can enable the http2 module in Apache:

sudo a2enmod http2

Check Apache2 config and if no errors, restart Apache:

sudo apachectl configtest && sudo service apache2 restart

Step 6 create http2.conf for entire Server HTTP2

Create a new http2.conf

sudo nano /etc/apache2/conf-available/http2.conf

and add all the following rows:

<IfModule http2_module>
    Protocols h2 h2c http/1.1
    H2Direct on
</IfModule>

Enable the http2.conf by running

sudo a2enconf http2

Check Apache2 config and if no errors, restart your Apache2

sudo apachectl configtest && sudo service apache2 restart

and enhance your ssl-vhost file (default-ssl.conf):

sudo nano /etc/apache2/sites-available/default-ssl.conf

Amend in your configuration file:

...
Protocols h2 h2c http/1.1
H2Push on
H2PushPriority * after
H2PushPriority text/css before
H2PushPriority image/jpg after 32
H2PushPriority image/jpeg after 32
H2PushPriority image/png after 32
H2PushPriority application/javascript interleaved
...

Leave a comment

Your email address will not be published. Required fields are marked *