そういうのがいいブログ

SIerで働く30代サラリーマンSEがインフラエンジニアに憧れてLinux・クラウド・AWSの勉強をするブログ

CentOS8+Apache2.4の環境で「HTTP/2」通信を有効にする手順

※[PR]当ブログの記事の中にはプロモーションが含まれています。

・CentOS8+Apacheの環境で「HTTP/2」を有効にするとパフォーマンスが向上すると聞きました。
・「HTTP/2」を設定する手順を具体的に教えてほしい。

こういった疑問に答えます。

本記事の内容

  1. CentOS8+Apacheの環境で「HTTP/2」通信を有効にする手順

この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。

こういった私が、解説していきます。

私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。

CentOS8+Apacheの環境で「HTTP/2」通信を有効にする手順

「HTTP/2」の前提知識

「HTTP/2」は、従来の通信プロトコル「HTTP/1.1」をバージョンアップした新しい通信プロトコルです。

以下の記事に、詳しい説明が書かれています。

developers.google.com

ほとんどの HTTP 転送は短時間で突発的に起こりますが、TCP は長時間接続と一括データ転送に最適化されています。
同じ接続を再利用することで、HTTP/2 は各 TCP 接続の使用効率を高め、プロトコルの全体的なオーバーヘッドも大幅に削減します。
さらに、使用する接続数が減ることで、接続パス全体(つまり、クライアント、中間、オリジン サーバー)にわたって、メモリと処理のフットプリントも削減されます。
これにより運用コスト全体が削減され、ネットワークの使用率と容量が改善されます。
その結果、HTTP/2 への移行はネットワーク レイテンシを短縮するだけでなく、スループットの向上と運用コストの削減にもなります。
(中略)
HTTP/2 のもう 1 つの強力な新機能は、1 つのクライアント リクエストに対して複数のレスポンスを送信できるサーバーの機能です。
つまり、元のリクエストに対するレスポンスに加えて、サーバーは追加のリソースをクライアントにプッシュできます
HTTP/2 の概要|Web Fundamentals|Google Developers)

要するに、「HTTP/2」では、表示速度や処理速度が向上します。
ということなので、SEO対策のためにも、最近のWEBサイトでは「HTTP/2」の有効化が必須になってきています。

今回の環境

  • WEBサーバー:Apache2.4.37
  • Apacheバーチャルホスト:sv-neptune.net
  • SSL (HTTPS) が有効化済み

WEBサーバのSSL(HTTPS)有効化の手順は、下記の記事で詳しく書いています。

souiunogaii.hatenablog.com

手順①:MPMモジュールの確認

Apache2.4でHTTP/2を有効化するためには、「MPM(マルチプロセッシングモジュール)」が必要です。

CentOS8でdnf installApacheをインストールした場合は、標準で「eventMPM」というモジュールが読み込まれるようになっているはずです。

MPMモジュールの確認コマンド

httpd -M | grep mpm
[root@sv-neptune conf.d]# httpd -M | grep mpm
 mpm_event_module (shared)

手順②:HTTP2モジュールの確認

CentOS8でdnf installApacheをインストールした場合は、標準で「HTTP/2」のモジュールが読み込まれるようになっているはずです。

HTTP2モジュールの確認コマンド

httpd -M | grep http2
[root@sv-neptune conf.d]# httpd -M | grep http2
 http2_module (shared)
 proxy_http2_module (shared)

手順③:バーチャルホスト用のconfファイルの編集

バーチャルホスト用のconfファイルを編集します。

/etc/httpd/conf.d/sv-neptune.net.conf

編集前のconfファイル

## VirtualHost02 sv-neptune.net
<VirtualHost *:80>
ServerName sv-neptune.net
ServerAlias www.sv-neptune.net
ServerAdmin webmaster@sv-neptune.net
DocumentRoot "/home/www/html/green"

<Directory "/home/www/html/green">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>

ErrorLog logs/sv-neptune.net-error_log
CustomLog logs/sv-neptune.net-access_log combined
</VirtualHost>

<VirtualHost *:443>

SSLEngine on
DocumentRoot "/home/www/html/green"
ServerName www.sv-neptune.net:443

SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

SSLCertificateFile /etc/pki/tls/certs/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/certs/newkey.pem

<Directory "/home/www/html/green">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>

ErrorLog logs/ssl_sv-neptune.net-error_log
TransferLog logs/ssl_sv-neptune.net-access_log
LogLevel warn

</VirtualHost>

編集後のconfファイル

<VirtualHost *:443>の下に、
Protocols h2 http/1.1 の1行を追記しました。

「HTTP/2」が使えるブラウザでは、HTTP/2を使用。そうでないブラウザでは従来の「HTTP/1.1」を使う、という意味の設定です。

## VirtualHost02 sv-neptune.net
<VirtualHost *:80>
ServerName sv-neptune.net
ServerAlias www.sv-neptune.net
ServerAdmin webmaster@sv-neptune.net
DocumentRoot "/home/www/html/green"

<Directory "/home/www/html/green">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>

ErrorLog logs/sv-neptune.net-error_log
CustomLog logs/sv-neptune.net-access_log combined
</VirtualHost>

<VirtualHost *:443>

Protocols h2 http/1.1
SSLEngine on
DocumentRoot "/home/www/html/green"
ServerName www.sv-neptune.net:443

SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

SSLCertificateFile /etc/pki/tls/certs/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/certs/newkey.pem

<Directory "/home/www/html/green">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>

ErrorLog logs/ssl_sv-neptune.net-error_log
TransferLog logs/ssl_sv-neptune.net-access_log
LogLevel warn

</VirtualHost>

手順④:設定変更後の確認テスト

httpd -t
[root@sv-neptune conf.d]# httpd -t
Syntax OK

手順⑤:Apacheの再起動

systemctl restart httpd
systemctl status httpd
[root@sv-neptune conf.d]# systemctl restart httpd
[root@sv-neptune conf.d]# 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 Sun 2020-11-22 12:46:48 JST; 5s ago
     Docs: man:httpd.service(8)
  Process: 301282 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 306911 (httpd)
   Status: "Started, listening on: port 443, port 80"
    Tasks: 213 (limit: 11032)
   Memory: 25.6M
   CGroup: /system.slice/httpd.service
           tq306911 /usr/sbin/httpd -DFOREGROUND
           tq306913 /usr/sbin/httpd -DFOREGROUND
           tq306914 /usr/sbin/httpd -DFOREGROUND
           tq306915 /usr/sbin/httpd -DFOREGROUND
           mq306916 /usr/sbin/httpd -DFOREGROUND

1122 12:46:48 sv-neptune systemd[1]: Starting The Apache HTTP Server...
1122 12:46:48 sv-neptune systemd[1]: Started The Apache HTTP Server.
1122 12:46:48 sv-neptune httpd[306911]: Server configured, listening on: port 443, port 80

手順⑤:ブラウザでの表示確認

Chromeデベロッパーツール

デベロッパーツールの「Network」タブの「Protocol」のところで確認ができます。

変更前

「Protocol」が「http/1.1」になっていました。

変更後

「Protocol」が「h2」に変わりました。

※「Protocol」の項目が無い場合は、「Name」列で右クリックすると表示する項目にチェックが追加できます。

IE11のF12開発ツール

IE11のF12開発ツールでも、同じように「ネットワーク」タブの「プロトコル」で「HTTP/2」に変わっていました。

まとめ

今回は、CentOS8+Apache2.4の環境で「HTTP/2」通信を有効化する手順を紹介しました。

最近のWEBサイトでは、SEO対策の観点からも、「SSL」「HTTP/2」対応が必須になってきています。