How to enable HTTP/2 support in Apache
Ubuntu / Debain
Apache web server distributed in default software repositories of Ubuntu and Debian do not include
mod_http2needed to enable HTTP/2 functionality. You will need to add a third-party package source with latest Apache version that also inludesmod_http2.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
apachectl -vcommand will reveal your upgraded Apache version. This will be2.4.29or later.Enable HTTP/2 module
Apache’s HTTP/2 support comes from the
mod_http2module. Enable it from:a2enmod http2 apachectl restartAdd HTTP/2 Support
We 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<VirtualHost>tag:Protocols h2 http/1.1Overall, your configuration file should look something like this:<VirtualHost *:443> Protocols h2 http/1.1 ServerAdmin you@your-awesome-site.com ServerName your-awesome-site.com ... </VirtualHost>After the changes, don't forget to reload/restart Apache.apachectl restartPush resources
Apache supports HTTP/2 Push feature as well. After enabling Apache HTTP/2, you can add push support simply by setting HTTPLinkheaders. 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/styles.cssand/assets/scripts.sccfiles. 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 themod_headersmodule.<Location /index.htmll> Header add Link "</assets/styles.css>;rel=preload, </assets/scripts.css>; rel=preload" Header add Link "</assets/image.jpg>;rel=preload"Apache 2.4.27, HTTP/2 not supported in prefork
Starting from Apache 2.4.27, the Apache MPM (Multi-Processing Module)preforkno longer supports HTTP/2. This will be indicated in your Apache error log as follows:AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.To fix this, select a different MPM:eventorworker. We highly recommend you to use theeventprefork. If you are using PHP, it is likely that PHP is integrated to Apache via themod_phpmodule, which requires thepreforkMPM. If you switch out frompreformMPM, you will need to use PHP asFastCGI. To switch tophp-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 andapt-getcommands 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 startHTTP/2 not enabled on older TLS versions
Mozilla 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.H2ModernTLSOnly off
source:
$link[host]
Read Original Source