ウェブ系エンジニアには必須!CentOS 8のApache httpdにHTTP/2を設定

centos8-apache-http2-top

こんにちは、 ITインフラエンジニアのKomura(@system_kom)です。

CentOS Linux 8.0 サポート終了のお知らせ

CentOS 8にウェブサーバー「Apache httpd」「PHP」をインストールした環境でSSLを有効化する手順を以下の記事で紹介しました。CentOS 8のApache httpdでは「HTTP/1.1」を拡張したプロトコルで通信パフォーマンスを向上させる「HTTP/2」を利用することができます。

参考 CentOS 8のApache httpdでSSLを有効にする手順を紹介した記事

Open Source
centos8-certbot-ssl
CentOS 8 のApache HTTP Server環境にcertbotでLet's Encrypt SSLを利用する方法

CentOS 8にウェブサーバー用ソフトウェア「Apache httpd」と「PHP」をインストールする手順を以下の記事で紹介しました。このままでも運用はできますが、最近ではHTTPを暗号化するHTTPSが一般的になっています。 サーバーが ...

今回はCentOS 8にインストールしたApache httpdで「HTTP/2」を有効にする設定方法を説明していきます。

ウェブサイトの処理速度や表示速度のアップはSEOにも関係するため「HTTP/2」はウェブ系エンジニアには必須の知識です。ぜひ、実際に設定してウェブサイトのパフォーマンスをアップして下さい。

1. HTTP/2通信規格について

「HTTP/2」はHTTPの通信を効率よく行うことができるように、従来の「HTTP/1.1」をバージョンアップしたHTTPの通信規格です。

HTTP/1.1の場合1つのリクエストが終了するまで、次のリクエストを送ることができません。これが大きな通信速度遅延の要因のひとつでした。「HTTP/2」通信規格では、複数の要求を1つの接続で行うことができるため、サイトの速度向上に期待が出来ます。

多少、分かり難い説明だと思います。実際の動きについては、以下のサイトで視覚的に確認が出来ます。

nginx-http2-1

またHTTP/2プロトコルについて、更に詳しく知りたい方には以下のサイトがオススメです。

本記事と合わせて参考にしてみて下さい。

なお、HTTP/2については現在「HTTPS」プロトコルでしか利用することができません。その為、本記事の設定を行う場合には、事前にサイトのSSL化が必要となる点にご注意下さい。CentOS 8でサイトをSSL化するための手順は、以下の記事で詳しく紹介しています。

Open Source
centos8-certbot-ssl
CentOS 8 のApache HTTP Server環境にcertbotでLet's Encrypt SSLを利用する方法

CentOS 8にウェブサーバー用ソフトウェア「Apache httpd」と「PHP」をインストールする手順を以下の記事で紹介しました。このままでも運用はできますが、最近ではHTTPを暗号化するHTTPSが一般的になっています。 サーバーが ...

SSL化を行っていない場合は参考にして下さい。それではHTTP/2を利用するための具体的な手順を紹介していきます。

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

HTTP/2を有効にする環境は、1章の中で紹介した記事を元に構築した「Apache httpd」ウェブサーバーを利用します。

Open Source
centos8-certbot-ssl
CentOS 8 のApache HTTP Server環境にcertbotでLet's Encrypt SSLを利用する方法

CentOS 8にウェブサーバー用ソフトウェア「Apache httpd」と「PHP」をインストールする手順を以下の記事で紹介しました。このままでも運用はできますが、最近ではHTTPを暗号化するHTTPSが一般的になっています。 サーバーが ...

設定を行うウェブサーバーの基本的な環境は以下の通りです。

CentOS 8にセットアップしたApache httpdの環境

  • ウェブサーバーとしてApache httpd 2.4.37がインストール済み
  • アプリケーションサーバーとしてPHP 7.2.11がインストール済み
  • Apache httpdはバーチャルホストの設定が完了して、テストページが表示されている
  • Apache httpdはcertbotによるSSL設定が完了している
  • サーバーにはグローバルIPアドレス(111.8.21.167)が割り当て済み
  • ドメインはrem-system.comを利用
  • ファイアウォールとしてfirewalldを設定済み

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

http/2を設定するバーチャルホストはSSLを有効にしたサイト「srv01.rem-system.com」になります。

3. ApacheでHTTP/2を利用するための前提

Apache httpdで「HTTP/2」を有効にするためには、以下の2点が設定されている必要があります。

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

MPMについては4章で詳しく説明しますが、CentOS 8に採用されているApache httpdのバージョン2.4.37はeventMPMがデフォルトで有効になっているため設定変更は不要です。

もう一つの条件である「SSL」については無償のSSLプロジェクトであるLet's EncryptのSSL証明書がサーバーに導入済みです。従ってHTTP/2有効化に必要な2点の設定はクリアしています。

4. Apache httpdのMPMについて

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

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

CentOS 8ではApache httpdを"dnf"でパッケージからインストールした場合、デフォルトではeventMPMモジュールが読み込まれるように設定されています。「HTTP/2」はeventMPMで動作するためMPMの変更は不要です。本章では有効化されているMPMモジュールの確認方法について紹介します。

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

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

 command
# httpd -M | grep mpm
mpm_event_module (shared)

結果として「mpm_event_module (shared)」が表示されれば、確認は完了です。上記の結果からMPMとして「eventMPM」が有効になっていることが確認できます。

5. Apache httpd へのHTTP/2の設定

本章ではApache httpdをHTTP/2通信に対応させるための設定手順について紹介します。ウェブサーバーではeventMPMとSSLの両方が設定済みになっていますので、設定を追加するだけでHTTP/2を利用できます。

5-1. http2モジュールの確認

HTTP/2通信機能はApache httpdのモジュールとして用意されています。CentOS 8でパッケージからApache httpdをインストールした場合にはhttp/2モジュールはデフォルトで有効になっています。

念のためにモジュールが有効になっていることを確認します。読み込まれているモジュールの確認は"httpd"コマンドに"-M"オプションを付けて実行します。

 command
# httpd -M | grep http2
http2_module (shared)
proxy_http2_module (shared)

結果として「http2_module (shared)」が表示されれば、確認は完了です。上記の結果から「http2_module」が有効になっていることが確認できます。

5-2. バーチャルホスト用設定ファイルの変更

つぎに「HTTP/2通信」を行うように設定パラメータを変更します。変更するファイルはhttp/2を有効にするバーチャルホスト「srv01.rem-system.com」用の設定ファイルになります。

バーチャルホスト「srv01.rem-system.com」の設定は「/etc/httpd/conf.d」以下に作成した「srv01.rem-system.com.conf」で行います。srv01.rem-system.com.confの編集前に、既存のファイルを別名でバックアップしておきます。以下の手順で元ファイルのコピーを行います

 command
# cp -p /etc/httpd/conf.d/srv01.rem-system.com.conf /etc/httpd/conf.d/srv01.rem-system.com.conf.org

バックアップの完了後、viエディタで設定ファイルを開いてhttp/2を有効にするためのパラメータ追記を行います。

 command
# vi /etc/httpd/conf.d/srv01.rem-system.com.conf

追記する前の設定ファイルは以下の内容になります。

 code
## VirtualHost03 srv01.rem-system.com
<VirtualHost *:80>
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com.jp-error_log
CustomLog logs/srv01.rem-system.com-access_log combined
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
SSLCertificateFile /etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/srv01.rem-system.com/privkey.pem
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com-ssl-error_log
CustomLog logs/srv01.rem-system.com-ssl-access_log combined
</VirtualHost>

上記設定の<VirtualHost *:443>ディレクティブの下の行にHTTP/2通信を有効にするための設定であるパラメータ"Protocols"を追加します。

 code
<VirtualHost *:443>
Protocols h2 http/1.1 この行を追加
SSLEngine on
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
SSLCertificateFile /etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/srv01.rem-system.com/privkey.pem
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com-ssl-error_log
CustomLog logs/srv01.rem-system.com-ssl-access_log combined
</VirtualHost>

上記ではHTTP/2通信を優先的に利用し、対応していないブラウザでは従来通りにHTTP/1.1を利用するという設定になります。追記が終わったら、ファイルを保存します。これでバーチャルホスト用設定ファイルの修正は完了です。

5-3. 変更した設定ファイルの確認

バーチャルホスト用の設定ファイルについて修正が完了したら、ファイルに間違いや問題がないかを確認します。"httpd"コマンドに"-t"オプションを付けて実行することで設定ファイルの間違いをチェックできます。以下のように実行します。

Apache httpdの設定変更後には都度、実行することをお勧めします。

 command
# httpd -t
Syntax OK

「Syntax OK」と表示されれば修正したファイルには問題ありません。
設定ファイルの確認が完了しましたので、変更した設定を反映するためにhttpdを再起動します。"systemctl restart"コマンドを以下のように実行します。

 command
# systemctl restart httpd

エラーが無ければ、再起動は完了しています。再起動後にhttpdのステータスを"systemctl status"コマンドで確認します。

 command
$ systemctl status httpd
 httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/httpd.service.d
mqphp-fpm.conf
Active: active (running) since Fri 2019-11-22 17:04:35 JST; 6s ago
Docs: man:httpd.service(8)
Main PID: 2254 (httpd)
Status: "Started, listening on: port 443, port 80"
Tasks: 213 (limit: 11374)
Memory: 26.2M
CGroup: /system.slice/httpd.service
tq2254 /usr/sbin/httpd -DFOREGROUND
tq2256 /usr/sbin/httpd -DFOREGROUND
tq2257 /usr/sbin/httpd -DFOREGROUND
tq2258 /usr/sbin/httpd -DFOREGROUND
mq2259 /usr/sbin/httpd -DFOREGROUND
11月 22 17:04:35 www systemd[1]: Stopped The Apache HTTP Server.
11月 22 17:04:35 www systemd[1]: Starting The Apache HTTP Server...
11月 22 17:04:35 www httpd[2254]: Server configured, listening on: port 443, port 80
11月 22 17:04:35 www systemd[1]: Started The Apache HTTP Server.

正常に起動していることが、コマンドの結果に含まれる「Active: active (running) 」から確認できました。ここまでの手順でApache httpdのhttp/2設定と反映が完了しました。

6. HTTP/2の動作確認

HTTP/2通信が動作していることをブラウザに実装されている開発ツールを利用して確認していきます。利用しているブラウザはGoogle Chromeになります。

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

HTTP/2を有効にしたバーチャルホストのウェブページを開きます。
Google Chromeのデベロッパーツール(その他のツール>デベロッパーツール)を起動します。「Network」を選択して、ページをリロードします。

centos8-apache-http2-01

表示される「Name」などのカラムを右クリックすると、表示項目の追加メニューが表示されます。「Protocol」にチェックを入れます。

centos8-apache-http2-02

再度ページをリロードすると、接続プロトコルが表示されます。本環境では以下のように「h2」と表示されることから、HTTP/2通信が行われていることが確認できました。

centos8-apache-http2-03

HTTP/1.1で通信している場合には一旦、ブラウザのキャッシュを削除してみて再度、ページを表示させて下さい。

7. まとめ

HTTP/2は最近では利用されている環境をよく見かけるようになりました。今後はHTTPS通信とHTTP/2通信はセットで運用することが一般的になっていくと思います。この機会にHTTPS通信とHTTP/2通信を導入してみてはどうでしょうか。

HTTP/2を有効にするためのSSL設定にやや手間が掛かりますが、そこさえクリアしてしまえば難しい手順はありません。是非、SSLとHTTP/2を有効にしてサイトの安全性とパフォーマンス向上を行ってみて下さい。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-Apache, CentOS
-