クライアント(Webブラウザ)とWebサーバーとの間ではHTTPにより通信しますが、
プロトコルのバージョンとしてHTTP/1.1やHTTP/2などが存在します。
HTTP/2はHTTP/1.1よりも通信効率が良くなっており、今ではほとんどのWEBサイトがHTTP/2による通信を実装していると思います。
今回はAWSのALBを使用してWEBサーバ(apache)へHTTP/2を使用して通信してみようと思います。
HTTP/2とHTTP/1.1の違い
HTTP/1.1ではクライアントからWEBサーバに対して原則1つずつしかリクエストを送ることができず、前のリクエストが完了しなければ次のリクエストをこなすことができませんでした。仮にウェブページに表示する画像が複数ある場合、1つ目の画像の読み込みが完了してから、次の画像を読み込むという処理になります。

一方、HTTP/2ではクライアントからWEBサーバに対して複数のリクエストを同時に送信することができます。1つ目の画像と2つ目の画像を同時に処理することができるということです。
これにより通信の効率が改善し、ウェブページの読み込みが早くなります。

HTTP/2の実装
今回は下記構成でHTTP/2による通信を実装しようと思います。

事前準備
事前に以下のものを用意しておきます。
・EC2インスタンス(Linux)
- apache2.4が導入済であること
・独自ドメイン名
-「aws-testdomain.xyz」というドメインをお名前ドットコムで事前に作成しておきました。
手順の流れ
以下の流れで実装します。
1.ホストゾーン作成
2.ACMでSSL証明書作成
3.ALBのターゲットグループ作成
4.ALBの作成
5.apacheの設定
6.疎通テスト
1. ホストゾーン作成
事前に用意したドメイン名でインターネット上で名前解決させるためにRoute53でホストゾーンを作成します。
ドメイン名は「aws-testdomain.xyz」を入力。
タイプはインターネット経由なので「パブリックホストゾーン」を選択。

2.ACMでSSL証明書作成
クライアントからHTTPSによる通信を実装するためにSSL証明書を作成します。
AWSのAWS Certificate Manager(ACM)から証明書のリクエストを実行。

「パブリック証明書」をリクエストを選択。

完全修飾ドメイン名には「aws-testdomain.xyz」を入力。
検証方法:DNS認証
キーアルゴリズム:RSA2048
上記で証明書を作成。

作成後、「Route53でレコード作成」を実行する。

レコード作成を実行。

レコード作成後、ホストゾーンに登録されていることを確認。

3.ALBのターゲットグループ作成
ALBからEC2インスタンス(WEBサーバ)に接続するためのターゲットグループを作成。

———————————————————————————-
ターゲットタイプ:「インスタンス」
ターゲットグループ名:「target-http2-test」としておきます。
プロトコル:HTTP
ポート:80
プロトコルバージョン:HTTP/2
ヘルスチェック:HTTP
ヘルスチェクパス:/
———————————————————————————-
上記設定で次へ。


WEBサーバとなるEC2インスタンスをターゲット登録してグループを作成。

4.ALBの作成
クライアントとWEBサーバを中継するロードバランサーを作成します。
ALB(ELB)を作成する理由としては、ACMにより作成したパブリック証明書をEC2インスタンスでは使用できないからです。ただし、ELBには設定して使用することができます。
※ACMによるSSL証明書の作成自体は無料なんですが、使用するにはELB(有料)を作成して使用してねというAWSの思惑がそこに感じられます・・・

「Application Load Balancer」を作成。

ロートバランサー名は「alb-http2-test」としておきます。
スキームは「インタネット向け」と「IPv4」を選択します。

サブネットは最低2つ指定する必要があります。

セキュリティグループはクライアントからTCP/443を許可しているものを使用します。


リスナーは「HTTPS」プロトコル、「443」ポート、転送先には先ほど作成した
ターゲットグループ「target-https2-test」を指定。
セキュアリスナーには「TLS1-2-2017-01」を選択し、SSL/TLS証明書には先ほど「ACM」で
作成した、「aws-testdomain.xyz」ドメインに関連づけされているものを指定してロードバランサーを作成する。

5. apacheの設定
AWS側の設定は一通り完了したので、OS側(apache)の設定をします。
今回のWEBサーバは/etc/httpd/conf.d/vhosts.confに下記の様に設定します。
※「ProtocolsHonorOrder On」は使用するプロトコルの順序性を有効にする設定で、
「Protocols h2c http/1.1」で順序を決める設定です。
h2cは非暗号化によるHTTP/2による通信を意味します。
今回ALB⇒WEBサーバへHTTP(80)による通信を実施しているためです。
# vi /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> DocumentRoot /var/www/html ServerName accountA-server ProtocolsHonorOrder On Protocols h2c http/1.1 </VirtualHost>
/var/www/html配下にはテスト用のページを表示させるためのhtmlを作成します。
作成後、httpdを再起動します。
# vi /var/www/html/testpage.html <!DOCTYPE html> <html lang="ja"> <body> <h1>http2_test_page</h1> </body> </html> # systemctl restart httpd
6.疎通テスト
設定が完了したのでブラウザ(今回はchromeを使用)で下記URLに接続してみます。
「https://aws-testdomain.xyz」

アクセスできたのでWEBサーバ側で/var/log/httpd/access_logを確認してみます。
# tail /var/log/httpd/access_log
10.0.20.35 - - [23/Nov/2022:08:26:41 +0000] "GET / HTTP/2.0" 200 85 "-" "ELB-HealthChecker/2.0"
10.0.20.35 - - [23/Nov/2022:08:26:42 +0000] "GET / HTTP/2.0" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
10.0.2.153 - - [23/Nov/2022:08:26:47 +0000] "GET / HTTP/2.0" 200 85 "-" "ELB-HealthChecker/2.0"
10.0.20.35 - - [23/Nov/2022:08:26:53 +0000] "GET / HTTP/2.0" 200 85 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
HTTP/2でALBから通信されていることが確認できました。
また、chromeからもHTTP/2で接続していることがわかります。(画面を右クリ⇒「検証」で下記画面が開く)
※Protocolが「h2」になっていればHTTP/2、HTTP/1.1の場合は「http/1.1」と表示される。

以上で実装完了です。
コメント