皆さんこんにちは。構築担当の川合です。
前回PHP8.0の記事を書きましたが、記事を書く内容を検証していた時にこちらの内容も気になったので同様に記事にしてみます。
mod_http2 つまりHTTP/2の通信を有効化出来るというモジュールですが、CentOS7系だと動作要件を満たしておらずCentOS8系からようやく利用出来るようになったと認識しています。
目次
そもそも
mod_http2 は、Apache 2.4.17 から利用出来るモジュールになります。
https://httpd.apache.org/docs/2.4/mod/mod_http2.html
現時点で以下のバージョンが下記OSだとインストール出来ます。
※CentOS7でインストール出来るバージョンは、httpd-2.4.6-97.el7.centos.x86_64
※CentOS8でインストール出来るバージョンは、httpd-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64
実際にAmazon Linux 2 にはどのバージョンが入るのか確認してみます
rpm -q httpd
httpd-2.4.46-1.amzn2.x86_64
動作要件を満たすバージョンがインストールされます。
むしろ2.4系の最新版をインストール出来ているようです。
デフォルトのMPMがpreforkに設定されているので、HTTP/2にするにはeventなどHTTP/2が利用出来るMPMに変更する作業が必要となります。
httpd -V
一部抜粋
Server version: Apache/2.4.46 ()
Server MPM: prefork
Apacheのerror_logより抜粋
[http2:warn] [pid 2266] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.
環境用意
では、実際にHTTP/2を利用出来ているか確認するために環境を用意してみます。
MPMをeventに設定する場合は、PHPをモジュール版のmod_phpではなくFastCGIのphp-fpmで稼動させる必要があります。
その為、php-fpmのインストールとphp-fpmのサービスを起動させておきます。
MPMの設定については、以下のファイルに記載されているのでpreforkの部分を無効化してeventの部分を有効化します。
cat /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines. See the httpd.service(8) man
# page for more information on changing the MPM.
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
HTTP/2 の利用が出来るようにバーチャルドメインに対する設定部分に以下の内容も追記しておきます。
Protocols h2 http/1.1
Apacheを再起動して、MPMがeventに変わったことを確認します。
httpd -V
一部抜粋
Server version: Apache/2.4.46 ()
Server MPM: event
Server MPMがeventに変わった事が確認出来ます。
動作確認
Google chrome を利用して該当サーバのサンプルページを表示してみます。
HTTP/2 でサイトが閲覧出来ているのか確認するには、https でページを表示する必要があります。
https://サーバのIPアドレス でブラウザからアクセスします。
プロトコルの確認には、ページを表示してからF12キーを押して開発モードに入ります。
Network というタブを開いてみると、以下のような画面が表示されます。
この画面のままでF5キーを押してページを再読み込みすることで、Webページの内容が読み込まれます。
今回は、テスト用にindex.html というファイルを用意したので画面左側にindex.html という名前が付いている箇所にカーソルを合わせると詳細を表示することが出来ます。
HTTP/2 でサイトを表示出来ていれば、Protocol の部分にh2 という記載が確認できます。
httpやHTTP/2 が有効化出来ていなければ、以下のように http/1.1 となっているはずです。
まとめ
Amazon Linux2 だと標準で利用出来るバージョンが現時点でApache2.4系の最新バージョンを利用する事が出来てmod_http2の動作要件を満たしています。
何も設定せずにそのまま利用出来る訳ではありませんが、少し設定をすることでHTTP/2を利用出来る環境を用意することは可能です。
では、無条件にHTTP/2 を有効にしておいていいのかというとそうでもなさそうです。
※HTTP/2 の通信がELB でHTTP1.1 に変更されてEC2に流れていくようなので一部ブラウザで不具合が発生する?といった記事をみかけました。
EC2単体ではなく、ELBなどと組み合わせて使うことが多くなるのでそこは注意が必要かもしれません。この内容もまた今後検証してみたいと思います。
プロフィール
サーバ構築周り全般を対応しております。
LINK
クラウドベリージャム:プロフィールページ