・CentOS8+Apacheの環境で「HTTP/2」を有効にするとパフォーマンスが向上すると聞きました。
・「HTTP/2」を設定する手順を具体的に教えてほしい。
こういった疑問に答えます。
本記事の内容
- CentOS8+Apacheの環境で「HTTP/2」通信を有効にする手順
この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。
こういった私が、解説していきます。
私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。
CentOS8+Apacheの環境で「HTTP/2」通信を有効にする手順
「HTTP/2」の前提知識
「HTTP/2」は、従来の通信プロトコル「HTTP/1.1」をバージョンアップした新しい通信プロトコルです。
以下の記事に、詳しい説明が書かれています。
ほとんどの HTTP 転送は短時間で突発的に起こりますが、TCP は長時間接続と一括データ転送に最適化されています。
同じ接続を再利用することで、HTTP/2 は各 TCP 接続の使用効率を高め、プロトコルの全体的なオーバーヘッドも大幅に削減します。
さらに、使用する接続数が減ることで、接続パス全体(つまり、クライアント、中間、オリジン サーバー)にわたって、メモリと処理のフットプリントも削減されます。
これにより運用コスト全体が削減され、ネットワークの使用率と容量が改善されます。
その結果、HTTP/2 への移行はネットワーク レイテンシを短縮するだけでなく、スループットの向上と運用コストの削減にもなります。
(中略)
HTTP/2 のもう 1 つの強力な新機能は、1 つのクライアント リクエストに対して複数のレスポンスを送信できるサーバーの機能です。
つまり、元のリクエストに対するレスポンスに加えて、サーバーは追加のリソースをクライアントにプッシュできます
HTTP/2 の概要|Web Fundamentals|Google Developers)
要するに、「HTTP/2」では、表示速度や処理速度が向上します。
ということなので、SEO対策のためにも、最近のWEBサイトでは「HTTP/2」の有効化が必須になってきています。
今回の環境
WEBサーバのSSL(HTTPS)有効化の手順は、下記の記事で詳しく書いています。
手順①:MPMモジュールの確認
Apache2.4でHTTP/2を有効化するためには、「MPM(マルチプロセッシングモジュール)」が必要です。
CentOS8でdnf install
でApacheをインストールした場合は、標準で「eventMPM」というモジュールが読み込まれるようになっているはずです。
MPMモジュールの確認コマンド
httpd -M | grep mpm
[root@sv-neptune conf.d]# httpd -M | grep mpm mpm_event_module (shared)
手順②:HTTP2モジュールの確認
CentOS8でdnf install
でApacheをインストールした場合は、標準で「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 11月 22 12:46:48 sv-neptune systemd[1]: Starting The Apache HTTP Server... 11月 22 12:46:48 sv-neptune systemd[1]: Started The Apache HTTP Server. 11月 22 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」通信を有効化する手順を紹介しました。