from https://gist.github.com/GAS85/990b46a3a9c2a16c0ece4e48ebce7300 from https://techwombat.com/enable-http2-apache-ubuntu-16-04/
- A self-managed VPS or dedicated server with Ubuntu 16.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.
Let’s assume you installed Apache from the standard stable Ubuntu repository using apt. When you check your version of apache2 by typing:
apache2 -v
… You’ll notice that Apache 2.4.18 is the current default version for Ubuntu 16.04. However, you need Apache 2.4.24 or later for compatibility with HTTP/2.
To get a newer version of Apache, you can use the PPA from Ondřej Surý which includes the latest stable release (Apache 2.4.33 at time of writing). Ondřej is a prominent PHP developer in the Debian community, so this PPA is considered safe.
To add the PPA, type:
sudo add-apt-repository ppa:ondrej/apache2
Or, you can add the PPA manually by inserting these lines into /etc/apt/sources.list:
deb http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial main
deb-src http://ppa.launchpad.net/ondrej/apache2/ubuntu xenial main
Once the PPA is added, update and upgrade Apache:
sudo apt update
sudo apt upgrade
This will update and upgrade apache2 to Apache 2.4.33+.
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.
sudo apt install php7.0-fpm
Enable required modules, proxy_fcgi and setenvif:
sudo a2enmod proxy_fcgi setenvif
Enable php7.0-fpm:
sudo a2enconf php7.0-fpm
Disable the mod_php module:
sudo a2dismod php7.0
Restart Apache:
sudo service apache2 restart
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 Apache and PHP 7.0:
sudo service apache2 restart
sudo service php7.0-fpm restart
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
Restart Apache:
sudo service apache2 restart
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
Restart your Apache2
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
...