How to enable HTTP/2 support in Apache
Last updated: 15 Feb 2018
2.4.17 introduced HTTP/2 support. If your server is running Apache version below this version, you need to upgrade Apache to the latest version first.
mod_http2 module is rather new, but is finally marked stable. There have been multiple reported
security vulnerabilities in 2016 and 2017. 1.
mod_http2 module that comes with Apache versions prior to 2.4.26 are insecure. Please make sure to use Apache version 2.4.26 or later.
Depending on the server operating system, you may be able to download the compiled latest version.
Ubuntu / Debain
Apache web server distributed in default software repositories of Ubuntu and Debian do not include
mod_http2 needed to enable HTTP/2 functionality. You will need to add a third-party package source with latest Apache version that also inludes
apt-get install software-properties-common python-software-properties add-apt-repository ppa:ondrej/apache2 apt-get updateThis will install some utilities (if not installed already) that help us add external PPAs. Secondly, we add the ondrej/apache2 PPA which contains the latest Apache2 builds. Third, we update your systems package information.
apt-get install apache2 apachectl -vThis is to upgrade your existing Apache2 version to the latest version. After upgrading, the
command will reveal your upgraded Apache version. This will be
2.4.29 or later.
CentOS / RHELBoth CentOS and RHEL default repositories come with Apache versions around
2.4.6. Apache official web site
has information about building the latest Apache server.
Enable HTTP/2 moduleApache's HTTP/2 support comes from the
mod_http2 module. Enable it from:
a2enmod http2 apachectl restartIf above commands do not work in your system (which is likely the case in CentOS/RHEL), use
httpd configuration directory to enable
Add HTTP/2 SupportWe highly recommend you enable HTTPS support for your web site first. Most web browser simply do not support HTTP/2 over plain text. Besides, there are no excuses to not use HTTPS anymore. HTTP/2 can be enabled site-by-site basis. Locate your web site's Apache virtual host configuration file, and add the following right after the opening
Protocols h2 http/1.1Overall, your configuration file should look something like this:
<VirtualHost *:443> Protocols h2 http/1.1 ServerAdmin email@example.com ServerName your-awesome-site.com ... </VirtualHost>After the changes, don't forget to reload/restart Apache.
Push resourcesApache supports HTTP/2 Push feature as well. After enabling Apache HTTP/2, you can add push support simply by setting HTTP
Link headers. You can emit them from either/both the Apache configuration file, or from your application.
Link: </assets/styles.css>;rel=preload, </assets/scripts.css>; rel=preloadAbove is an example header that would trigger Apache to push the
/assets/scripts.scc files. Refer to your application code on how to emit HTTP headers.
If you would like to make Apache add these headers, you can do so like this, using the
<Location /index.htmll> Header add Link "</assets/styles.css>;rel=preload, </assets/scripts.css>; rel=preload" Header add Link "</assets/image.jpg>;rel=preload" </Location>Above example demonstrates Apache configuration that sets 2
Link headers (you can have as many as you need).
Supported browsers will decide to preload these resources if necessary.
Apache 2.4.27, HTTP/2 not supported in preforkStarting from Apache 2.4.27, the Apache MPM (Multi-Processing Module)
prefork no longer supports HTTP/2. This will be indicated in your Apache error log as follows:
To fix this, select a different MPM:
worker. We highly recommend you to use the
event Multi-Processing Module (MPM) which is the default in newer releases of Apache.
If you are using PHP, it is likely that PHP is integrated to Apache via the
mod_php module, which requires the
prefork MPM. If you switch out from
preform MPM, you will need to use PHP as
FastCGI. To switch to
php-fpm, you can do as folllwing. Please note that this assumes you have PHP installed from ondrej/php repository on Ubuntu. The PHP package names could be different in other repositories. Change package name and
apt-get commands to match your PHP vendor and package manager.
apachectl stop apt-get install php7.1-fpm # Install the php-fpm from your PHP repository. This package name depends on the vendor. a2enmod proxy_fcgi setenvif a2enconf php7.1-fpm # Again, this depends on your PHP vendor. a2dismod php7.1 # This disables mod_php. a2dismod mpm_prefork # This disables the prefork MPM. Only one MPM can run at a time. a2enmod mpm_event # Enable event MPM. You could also enable mpm_worker. apachectl start
HTTP/2 not enabled on older TLS versionsMozilla Firefox (among other browsers) does not enable HTTP/2 protocol unless the connection is made over TLS 1.2 and using modern cipher suits. This is not a technical limitation, but rather a safety precaution. Make sure your that your site supports TLS 1.2, and modern cipher suits with AES/CHACHA20 with forward-secrecy key exchanges. In turn, Apache does not try to establish an HTTP/2 connection with connections over older cipher configurations either. you can force Apache attempt HTTP/2 upgrade with the following directive, but it will not be as effective because browsers do not support HTTP/2 from their end anyway.
HTTP 421: Misdirected Request errorsHTTP/2 is designed to make parralel requests to the server over the same session. If two connections use same TLS certificate and remote IP address, browsers will attempt to reuse an existing connection. Apache can correctly serve such requests even if those requests belong to different Virtual Hosts. However, if you have different TLS configuration (protocol, client verification, or cipher suits), Apache will reject such requests with an HTTP 421: Misdirected Request error. To prevent this, make sure you keep same TLS settings for all Virtual Hosts that you serve a particular site in.
mod_http2-related security vulnerabilities are as follows.