Apache httpdでHTTP/2を設定、サイトの表示速度と通信効率アップさせる。

imac-mac-1029757
パッケージを利用してApache httpdの最新バージョンを導入する手順を紹介した記事
>「CentOS 7 への Apacheインストール。最短でウェブサーバーを構築してテストページを表示する。」
でApache httpdの導入までが完了しました。折角のApache httpd最新バージョンになりますので、目玉機能の1つであるHTTP/2機能を有効にする手順を紹介したいと思います。HTTP/2についての詳細は説明は別の記事
>「centosのnginxでHTTP/2通信を設定する。HTTP通信の効率化でサイト表示速度を向上。」
で紹介していますので、本記事では細かく説明しませんが、ざっくりと説明する とHTTP/1.1を拡張したプロトコルで通信パフォーマンスが向上するという機能 になります。

スポンサーリンク

Apache httpdでHTTP/2通信を利用するためには、以下の2点が設定されている必要があります。

  • マルチスレッド機能であるeventMPMが有効になっていること
  • SSLが有効になっていること

まずはeventMPMを有効にするように設定変更を行い、SSLについては無償のSSLプロジェクトであるLet’s EncryptのSSL証明書を利用します。
両方の設定後にHTTP/2を有効にします。尚、eventMPMを有効にした場合、PHPはモジュール形式では動作せずphp-fpm(FastCGI)経由で動作させる必要があります。php-fpmを利用する方法は、別の記事
>「WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。」
で紹介しています。PHPを利用する環境の場合にはこちらも併せて参照して下さい。

目次

1.HTTP/2を有効にする環境

HTTP/2を有効にする環境は以前の記事
>「Apache httpd の最新バージョンをCentOSにyumでインストール、セキュリティと速度を向上する。」
で構築した環境を元にしています。基本的な環境は以下の通りです。
※Let’s Encryptでの証明書作成はドメインが正引きできる環境が必要になるためグローバルIPアドレスを利用しています。

  • OSのバージョンはCentOSで最新のバージョン7.6を利用しています。
  • ウェブサーバーとしてApache httpd2.4.39がインストールされています。
  • Apache httpdは基本的な設定が完了して、テストページが表示されています。
  • サーバーはインターネットへ接続されており、グローバルIPアドレス(111.8.21.167)が割り当てられています。
  • ドメインはrem-system.comを利用します。FQDNはweb01.rem-system.comとして、DNSに登録を行っています。
  • ファイアウォールとしてfirewalldを設定しています。

この環境を前提にHTTP/2通信を有効にする設定を進めていきます。

2.ホスト名の正引き確認

Let’s Encryptを利用するためにはホスト名(FQDN:ホスト名にドメイン名がついたもの、以下ホスト名と記載がある時はFQDN)が正引き(ホスト名からIPアドレスを参照)できる必要があります。本記事ではFQDNのホスト名として“web01.rem-system.com”を利用する前提としています。こちらはAレコードとしてDNSにIPを登録していますので、ホスト名の正引きができる状態になっています。(逆引きは不要です。)
本記事では参考としてAWSのRoute53で設定した場合の例を紹介します。
httpd-http2-1
上記のようにAレコードweb01.rem-system.comとIPアドレスである111.8.21.167を結びつける設定を行います。
設定の完了後にホスト名の正引きができることを確認します。Linux/Windowsの何れでも確認ができますので、ご自分の環境に合わせて行って下さい。
※ホスト名の正引き設定は、ご利用のDNSサーバーやドメイン事業者によって異なるため、本記事では割愛しています。

2-1.hostコマンドによる正引きの確認(Linux)

Linuxではhostコマンドによるホスト名の正引きが可能です。使い方はhostコマンドにホスト名を付けて実行します。以下が実行例になります。尚、hostコマンドはデフォルトでインストールされていないため、yumコマンドでbind-utilsをインストールします。

bind-utilsがインストールされると、hostコマンドが利用できるようになります。以下のように実行します。

指定したホスト名に対して、IPアドレスが表示されれば正引きの確認は完了です。ホスト名が見つからないという警告が表示された場合には、ご利用のDNS設定を見直して下さい。ここでは正常に確認ができたという前提で先へ進めていきます。

2-2.nslookupコマンドによる正引きの確認(Windows)

ホスト名の正引きはWindowsのコマンドプロンプトでも確認が出来ます。ウェブサーバーへbind-utilsをインストールしたくない場合などは、ご利用のWindowsから確認してください。Windowsの場合は、コマンドプロンプトを開いて、以下のように実行します。

上記のようにIPアドレスの回答があれば、正引きの確認は完了です。

3.ファイアウォールへの接続許可設定

HTTPS通信ではHTTPで利用している接続ポート80番とは異なる接続ポートである443番を利用します。以前の記事でFirewallのHTTPについてはオープンしていますが、HTTPS用の接続ポートはオープンしていないため、事前に接続ポートをオープンする設定を行います。
尚、ファイアウォールはCentOSのデフォルトであるfirewalldを利用している前提となります。

3-1.現状のファイアウォール設定を確認

設定を行う前に、現状のファイアウォール設定を確認していきます。HTTPS接続は、全てのユーザーに開放するため、インターフェイスに適用されているゾーンである”public”ゾーンの設定を確認します。

上記のようにHTTPは許可されていますが、HTTPSは許可されていません。

3-2.HTTPSサービスの接続許可を追加

項目3-1.で確認した”public”ゾーンの接続許可サービスにHTTPSを追加します。追加は以下のように行います。

“success”と表示されれば設定は完了です。設定を反映するためにファイアウォールの設定を読み込みます。

“success”と表示されれば設定の読み込みは完了です。

3-3.HTTPSサービスの追加確認

設定した内容が正常に反映されているかを確認します。確認は以下のように行います。

“services”の項目にhttpsが追加されていることが確認できれば、確認は完了です。
ここまででファイアウォールの接続許可は完了しました。

4.Apache httpdのMPM設定

本章ではApache httpdのMPMをデフォルトのpreforkMPMからeventMPMへ変更する設定を説明します。 HTTP/2を有効にするためApache httpdではeventMPMで動作する必要があります。  MPMはマルチプロセッシングモジュールの略で、簡単に言うとApacheの並列処理に関する挙動の方式になります。MPMはその名の通り、Apacheのモジュールとして提供されており、設定ファイルを変更することで、MPMの変更が可能です。
MPMは主に以下の三つのモジュールがあります。

  • preforkMPM …安定した通信が可能だが、アクセスが多い場合CPUとメモリを多く使う
  • workerMPM … マルチスレッドとマルチプロセスのハイブリッド型。preforkに比べてメモリとCPU使用量が少ない
  • eventMPM … Apache2.4系から導入されたマルチスレッドとマルチプロセスのモジュール。CPUとメモリの使用量が少ない

Apache httpdをyumでインストールした場合、デフォルトではpreforkMPMモジュールが読み込まれるように設定されています。preforkMPMではHTTP/2は動作しないためeventMPMモジュールを読み込むように設定します。

4-1.デフォルトのApacheに設定されているMPMの確認

MPMは動的モジュール(DSO)として読み込まれています。先ずはモジュールとして読み込まれているMPMを確認します。現在、読み込まれているモジュールの確認はhttpdコマンドに-Mオプションを付けて実行します。

上記の結果からpreforkMPMが読み込まれていることが確認できます。これをeventMPMへ変更します。
※パッケージで導入したApacheはデフォルトでpreforkMPMが読み込まれていますが、ソースコードからインストールしたApacheの場合はデフォルトがeventMPMになっているようです。

4-2.ディレクトリの移動とMPM設定ファイルのバックアップ

MPMの設定は”/etc/httpd/conf.modules.d/”以下にある00-mpm.confファイルで行います。00-mpm.confの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

4-3.MPM設定ファイルの編集

00-mpm.confはMPMとして用意されている3つのモジュールの何れかを読み込むように記載がされています。(2つはコメントアウトされている)デフォルトの設定は以下のように”LoadModule mpm_prefork_module modules/mod_mpm_prefork.so”が有効になっています。

これを以下のように”LoadModule mpm_event_module modules/mod_mpm_event.so”を有効にするように変更します。
現在、有効になっている”LoadModule mpm_prefork_module modules/mod_mpm_prefork.so”をコメントアウト(#を行頭に付ける)して、”LoadModule mpm_event_module modules/mod_mpm_event.so”からコメントを外します(#を行頭から外す)。以下のように変更します。

設定ファイルの変更後に、ファイルを保存します。これで設定ファイルの変更は完了です。

4-4.00-mpm.conf設定ファイルの反映とhttpdの確認

ここまででeventMPMでApache httpdを動作させるための設定は完了しました。変更した設定を反映するためにApache httpdを再起動します。systemctlを以下のように実行します。

エラーが出力されなければ、httpdは正常に再起動しています。
再起動後にhttpdのstatusを確認します。

上記のようにActive項目に”active (running)”に出力されていれば、httpdは正常に再起動していることが確認できます。

4-5.変更後のMPMの確認

Apache httpd設定ファイル変更及び再起動後のモジュールとしてeventMPMが読み込まれていることを確認します。現在、読み込まれているモジュールの確認はhttpdコマンドに-Mオプションを付けて実行します。

結果として”mpm_event_module (shared)”が表示されれば、確認は完了です。ここまでの作業でApacheのMPMをpreforkMPMからeventMPMに変更することができました。

5.SSL通信用モジュールのインストール

HTTP/2を利用するためにはHTTPSを有効にする必要があります。SSLを有効にするためにはApache httpd向けに用意されたSSLモジュールである”mod_ssl”のインストールが必要になります。”mod_ssl”のインストールについては別の記事で導入が完了していますので、ここでは確認方法だけ紹介します。

5-1.mod_sslパッケージの確認

mod_sslパッケージががインストールされていることを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、mod_sslパッケージがインストールされていることを確認します。

出力結果として、mod_sslパッケージが表示されることを確認します。

続いてmod_sslがApache httpdのモジュールとして登録されていることを確認します。登録を確認するためにはhttpdコマンドを利用します。以下のように実行することでインストールパスを確認できます。

表示された結果に”ssl_module”が含まれれば、mod_sslはApache httpdへモジュールとして登録されています。
これでmod_sslパッケージの確認は完了です。

6.Let’s Encrypt を利用したSSL証明書の取得

SSL証明書は今まで、有償のものを利用することが一般的でしたが、最近ではSSL通信の普及を行うLet’s Encryptというプロジェクト(2016年4月スタート)で無料で発行しているものを利用することもできます。
因みにLet’s Encryptはシスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体がスポンサーとして支援していますので、信頼できるものです。
本記事では無償でも信頼性が高いLet’s Encryptを利用してのHTTPS設定を行っていきます。

6-1.certbotパッケージ導入前の設定

Let’s Encryptを利用するためのアプリケーションは”certbot”という名前でパッケージ化されています。certbotパッケージはデフォルトで利用できるbaseレポジトリには含まれておらず、拡張レポジトリであるepelレポジトリに含まれています。epelレポジトリはApache httpdをインストールする際にインストール済みになっていますので、ここでのインストールは不要です。本章ではepelレポジトリの確認方法についてのみ紹介します。

6-1-1.epelレポジトリの確認

epelレポジトリがインストールされていることを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、epelレポジトリがインストールされていることを確認します。

出力結果として、epelレポジトリパッケージが表示されることを確認します。

上記の応答結果から、epelレポジトリパッケージがインストールされていることが確認できました。
epelがレポジトリリストに追加されていることを確認します。以下のように実行することで、現在、利用が可能なレポジトリリストを確認できます。

応答結果にepelが表示されればepelレポジトリを利用する準備は完了しています。

これでepelレポジトリの確認は完了です。

6-2.certbotパッケージのインストール

項目6-1-1.でepelレポジトリが有効になっていることが確認できましたので、certbotパッケージを確認します。

今度は上記のようにcertbotに関するパッケージが表示されました。この中でHTTPS通信に必要なパッケージは

  • python2-certbot-apache.noarch : The apache plugin for certbot
  • certbot.noarch : A free, automated certificate authority client

の二つになります。この二つのパッケージをインストールします。先ずはcertbotからインストールを行います。
以下のコマンドでcertbotパッケージをインストールします。

実行結果は以下のようになります。

エラーの出力がなく”完了しました!”と表示されればcertbotパッケージは正常にインストールされています。

スポンサーリンク

6-3.python2-certbot-apacheパッケージのインストール

続いてcertbotのapache用プラグインである”python2-certbot-apache”をインストールします。以下のコマンドでパッケージをインストールします。

以下が実行結果になります。

エラーの出力がなく”完了しました!”と表示されれば、python2-certbot-apacheパッケージは正常にインストールされています。

6-4.certbotインストール後の確認

certbotがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、certbotパッケージがインストールされていることを確認します。

結果として上記のように”certbot”と”python2-certbot-apache”が表示されればパッケージはインストールされています。
続いてcertbotがインストールされた場所を確認します。インストールされた場所(パス)を確認するためにはwhichコマンドを利用します。以下のように実行することでインストールパスを確認できます。

この結果から、certbotが/bin以下にインストールされたことが確認できます。これでcertbotのインストールが正常に終了したことが確認できました。

7.SSL証明書の作成

本章ではcertbotパッケージを利用してSSL証明書を作成する手順を紹介していきます。

7-1.certbotコマンドの実行

Let’s EncryptによるSSL証明書はcertbotコマンドで作成します。httpdに設定したドキュメントルートが”/home/www/html/”でFQDNのホスト名が”web01.rem-system.com”の場合、以下のようにcertbotコマンドを実行します。

もし”rem-system.com”でもアクセスを行う(wwwのホスト部分が無いドメイン名でのアクセス、ZONE APEXと呼ばれます)場合は、以下のように”rem-system.com”も追加します。本記事ではZONE APEXは設定しないものとします。

実行すると、以下のように対話型のウィザードが起動します。
幾つかの質問がありますので、回答します。

回答が終わると、証明書の作成が始まります。

上記のように”Congratulations!”と表示されればSSL証明書の作成は完了です。SSL証明書の保存場所は上記にも記載されているように/etc/letsencrypt/live/web01.rem-system.com/ディレクトリになります。(FQDN名のディレクトリは自動的に作成されます。)

7-2.作成されたSSL証明書ファイルの確認

実際に作成されたSSL証明書ファイルを確認してみます。作成ディレクトリへ移動します。

ファイルを確認します。

ファイルが作成されていることが確認できました。各ファイルの役割は以下の通りです。

  • cert.pem …. SSL証明書本体
  • chain.pem …. 中間証明書
  • privkey.pem …. 秘密鍵ファイル
  • fullchain.pem …. SSL証明書と中間証明書のセット

このファイルのうち、利用するものは”fullchain.pem” “privkey.pem”の2ファイルになります。fullchain.pemはウェブサーバーとしてnginx、若しくはApache httpdのバージョンが2.4.8以降でないと利用できません。今回はApache httpdのバージョンが2.4.39になりますので、fullchain.pemを利用します。

8.Apache httpd HTTPSとHTTP/2通信用の設定

本章ではApache httpdをSSL(HTTPS)とHTTP/2通信に対応させるための設定手順について紹介します。項目7.でSSL証明書ファイルの作成まで完了しましたので、ウェブサーバー(Apache httpd)側へSSLとHTTP/2の設定を行います。

8-1.ssl.conf設定ファイルのバックアップ

HTTPS通信に関する設定は”/etc/httpd/conf.d”ディレクトリに含まれる ssl.confに行います。設定変更を行う前にssl.confをバックアップします。
“/etc/httpd/conf.d”ディレクトリに移動して、ファイルを確認します。

cpコマンドでファイルのコピーを行います。

コピーされたファイルが存在することを確認します。

コピーしたファイルssl.conf.orgがあることが確認できました。

8-2.ssl.conf設定ファイルの編集

設定ファイルのバックアップが完了しましたのでssl.confを編集していきます。セキュリティなどを考えると本記事で紹介している項目以外にも幾つかの設定変更が必要になりますが、その辺りは別の記事に纏めてありますので、必要に応じて別記事を参照の上、設定変更を行って下さい。

8-2-1.SSL証明書に関する設定変更

本章ではHTTPS通信を行うために必要なSSL証明書の指定を行います。変更点は3点で、それぞれSSL証明書ファイル、秘密鍵ファイル、中間証明書のパスを変更します。
テキストエディタで、ssl.confを開きます。

先ずはSSL証明書ファイルを示す、以下の点を変更します。Apache httpdの2.4.8以降ではfullchain.pemという中間証明書とSSL証明書が1つになったファイルがSSLCertificateFileに利用できますので、これを指定します。

を、certbotで作成したファイルのパス

に変更します。

次に秘密鍵ファイルを示す、以下の点を変更します。

を、certbotで作成したファイルのパス

に変更します。

8-2-2.HTTP/2通信に関する設定変更

HTTP/2通信を行うように設定を変更します。HTTP/2通信機能はApache httpdのモジュールとして用意されていますが、パッケージからApache httpdをインストールした環境ではモジュールは有効になっていますので、設定ファイルへ機能を有効にする記載のみで利用できます。

ssl.confの中からバーチャルホストを設定するディレクティブである上記の部分を探します。
上記ディレクティブの下の行にHTTP/2通信を有効にするための設定である”Protocols”項目を追加します。

上記では HTTP/2通信を優先的に利用し、対応していないブラウザでは従来通りにHTTP/1.1を利用するという設定になります。
上記3点の変更後にssl.confファイルを保存します。変更したファイルに誤りが無いかをhttpdコマンドで確認します。確認は以下のように実行します。

上記のように”Syntax OK”と表示されれば、設定ファイルには問題ありません。
これでssl.confファイルの編集は完了です。

8-3.httpdの再起動

変更した設定を反映するためにhttpdを再起動します。

エラーが出力されなければ、httpdは正常に再起動しています。
再起動後にstatusを確認します。

上記の出力結果から、Apache httpdは正常に起動していることが確認できます。
これで設定は完了です。引き続きHTTPSとHTTP/2通信の動作確認を行います。

9.HTTPSの動作確認

項目8.の内容でHTTPSとHTTP/2通信の設定が完了しましたので、ここからは実際にブラウザでサイトへ接続して、正常にHTTPSが動作していることを確認していきます。利用しているブラウザはGoogle Chromeになります。

9-1.ブラウザでの接続確認

“https://”にホストのFQDNに付けてを入力します。本記事での環境はFQDNがweb01.rem-system.comになりますので

https://web01.rem-system.com

と入力します。
ブラウザのURL欄に「保護された通信」と表示されていることが確認できます。これは正常にHTTPS通信が出来ている場合に表示されます。
cent-httpd-ssl-7-1

9-2.SSL証明書の確認

Google Chromeのデベロッパーツール(その他のツール=>デベロッパーツール)を起動して通信に問題がないことを確認します。以下のように表示されていれば、通信はセキュアに行われています。
cent-httpd-ssl-7-2
また[View certificate]をクリックすると、SSL証明書が確認できます。
[全般]タブから、以下のように発行先と、発行者、有効期間が確認できます。
cent-httpd-ssl-7-2-2-02
[証明のパス]タブから証明書に問題がないことが確認できます。
cent-httpd-ssl-7-2-3-03
これでHTTPS通信が正常に行われていることが確認できました。

10.HTTP/2プロトコルの動作確認

HTTPS通信までが確認できましたので、続いてHTTP/2通信が動作していることを確認していきます。利用しているブラウザは同じくGoogle Chromeになります。

10-1.HTTP/2通信の確認

Google Chromeのデベロッパーツール(その他のツール=>デベロッパーツール)を起動します。[Network]を選択して、ページをリロードします。
nginx-http2-4-1-1
表示される[Name]などのカラムを右クリックすると、表示項目の追加メニューが表示されます。
[Protocol]にチェックを入れます。
nginx-http2-4-1-2
再度ページをリロードすると、接続プロトコルが表示されます。本環境では以下のように”h2″と表示されることから、HTTP/2通信が行われていることが確認できました。
nginx-http2-4-1-3
※HTTP/1.1で通信している場合にはブラウザのキャッシュを削除してみて下さい。

11.SSL証明書の更新

動作確認までが完了しました。このままの状態で基本的な設定は完了していますが、SSL証明書は有効期間があります。
通常、SSL証明書は1~3年間ぐらいの有効期限で取得しますが、Let’s Encryptの場合、これが90日間と決まっています。90日が経過すると、有効期限が切れてしまい、SSL証明書が無効である警告がブラウザに表示されてしまいます。
これではHTTPSを設定した意味がなくなるため、有効期限を定期的に更新する設定を本章では紹介していきます。

11-1.証明書の更新確認

Let’s Encryptでは証明書の更新手順は用意されています。具体的にはcertbotコマンドに”renew”オプションを付けて実行します。更新設定を行う前に更新が実行できるかをテストします。
テストは”–dry-run”オプションを付けることで行うことができます。
具体的には以下のように実行します。

以下が実行結果になります。

実行結果にふくまれる”Congratulations, all renewals succeeded.”から正常に更新ができることを確認できました。これで確認は完了です。

11-2.更新コマンドの定期実行設定

更新コマンドの実行が確認できましたので、定期的に実行するようにcrontabにコマンドを追記します。
crontabはrootユーザーで実行します。変更はcrontabコマンドを以下のように実行します。

実行するとエディタが起動します。以下を追記します。–deploy-hookオプションは、SSL証明書の更新が行われた場合のみ実行するコマンドを指定できます。更新時にはhttpdを再起動して、更新された証明書を読み込む必要があるため、httpd再起動用のコマンドを指定します。

上記は毎日3:00と5:00に更新コマンドを実行する場合の記載です。(2回実行するように記載しているのは、1回目が失敗した場合のため)もし他の時刻にしたい場合には、3と5を適宜変更します。変更後にはファイルを保存します。証明書が更新された場合は設定後に、内容を確認します。crontabの確認は

と実行します。先ほど追加した設定が表示されれば、SSL証明書の自動更新設定は完了です。

12.まとめ

HTTP/2通信は最近では利用されているのをよく見かけるようになりました。
今後はHTTPS通信とHTTP/2通信はセットで運用することが一般的になっていくと思います。これを機会にHTTPS通信とHTTP/2通信を導入してみてはどうでしょうか。
それ程、難しい手順ではありませんので是非、設定してウェブサイトのパフォーマンス向上を行って下さい。
この記事の環境をベースに php-fpmやデータベースであるmariaDBを導入することでセキュアなLAMP環境を作成できます。 php-fpmやmariaDBの導入方法についても別の記事で紹介していますので、是非、参考にして下さい。

関連する記事


Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク