ApacheをHTTP/2に対応させる

WordpressLinux, Wordpress, Ubuntu, Apache, HTTP/2

近年、HTTP/2を導入しているサイトが増えている。なにせ市中に出回っているほとんどのクライアントソフトウェア(ブラウザなど)は、既にHTTP/2に対応をしている。
そのような中、複数のリクエストやレスポンスを同時に処理することによる高速化など、HTTP/2が持つメリットを享受したいと思うのは当然であろう。

今回は、Ubuntu 16.04、Apache 2.4.18な環境で構築をしていく。

mod_http2が有効なApacheをインストールする

Apache 2.4.18はmod_http2というモジュールをインストールすることによりHTTP2へ対応させることが出来るのだが、ビルドをする際にHTTP2オプションを有効にする必要がある。ところが、デフォルトでUbuntuに採用されているApacheではこれが無効となっているため、HTTP2が有効なApacheをインストールする必要がある。

対応したApacheのリポジトリが存在しているので、これを使ってインストールをしていこう。

まずはリポジトリを追加して、アップデート。

sudo add-apt-repository ppa:ondrej/apache2
apt-get update

その後、Apache2をアップグレードする。

apt-get install apache2

なお、Apacheのバージョンは2.4.33まで上がっていた。

ちなみに、この際次のようなエラーが出てApacheが起動しなくなってしまった。

[Tue Jun 05 16:56:25.184122 2018] [ssl:emerg] [pid 2017] AH02572: Failed to configure at least one certificate and key for example.com:80
[Tue Jun 05 16:56:25.184141 2018] [ssl:emerg] [pid 2017] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Tue Jun 05 16:56:25.184143 2018] [ssl:emerg] [pid 2017] AH02312: Fatal error initialising mod_ssl, exiting.
AH00016: Configuration Failed

結論、SSLに関する記述(SSLEngine on、SSLCertificateFile、SSLCertificateKeyFile、SSLCertificateChainFile)を全てのVirtualhostに記載することで解消した。

mod_phpの代わりにPHP FastCGIをインストールする

ApacheでHTTP2を用いる場合、Apacheがデフォルトで採用しているprefork MPMを使うことが出来ず、prefork MPMに依存しているモジュールを使用することが出来ない。その代表格がmod_phpである。

従って、mod_phpの代わりにFastCGIを採用する必要がある。この設定は以下の記事を参考にして頂きたい。

Ubuntu 16.04でApache + FastCGI(PHP-FPM)を導入してみる - WordPress高速化実験
ApacheではPHPを通常モジュールとして動作させるが、FastCGI実装といって実行ファイル形式で動作させることが出来る。PHP-FPMはこのFastCGI実装のうちの一つであ

また、今回は上記でインストールしたphp7.0-fpmをモジュールとして利用する。

a2dismod php7.0
a2enmod proxy_fcgi setenvif
a2enconf php7.0-fpm

これでApacheをrestartすると、PHPがFastCGIで起動する。

MPMをpreforkからeventに変更する

MPMとは、Apacheの並行処理手法をモジュール化したもの(Multi Processing Module)。preforkやeventは、この並行処理手法で、デフォルトではpreforkが採用されている。

しかしながら、preforkはHTTP/2をサポートしていないため、これをeventに変更する。

a2dismod mpm_prefork 
a2enmod mpm_event 

HTTP/2を有効化する

ApacheのVirtualhost毎に設定を行なう。

HTTP/2を有効とするバーチャルホストに、以下の一文を追記する。

Protocols h2 h2c http/1.1

プロトコルとして、HTTP/2(TLS)、HTTP/2(平文)、HTTP/1.1の3つをサポートしていることを宣言している。なお、h2cはなくとも構わない。

そして、HTTP2モジュールを有効化。

sudo a2enmod http2

これで、ApacheがHTTP/2に対応をした。

HTTP/2に対応していることを確認

Chromeを使って実際に使用されているプロトコルを確認することが出来る。右クリックから「検証」を選び、メニューから「Network」をひらく。一覧表が表示される部分でさらに右クリックをすると、「Protocol」と書かれた欄があり、ここを選択すると当該の通信に使用しているプロトコルを確認することができる。

HTTP/2に対応させたあとは、下記の通りh2=HTTP/2を使用する形に変更されていた。

HTTP/2を使うことにより、サイト自体の高速化も見込むことが出来る。実際、GTMetrixで確認すると、HTTP/2で通信をしたほうが数値が改善される。また、体感上も、なんとなく早くなったような気がする。
今後、HTTP/2がメインになっていくことを考えれば、今から対応をしておいて損はないだろう。