Dockerのapache環境でhttp2の設定をしてアクセスできるようにしてみます。
SSL証明書(オレオレ証明書)の作成
HTTP2のアクセスにはHTTPSでアクセスが必要になります。まずはSSL証明書を作成しておきます。これは前回(以下)のページと同じ内容になります。
Docker関連作業
apacheの設定ファイル
apacheの設定ファイル(httpd.conf)で、以下の設定が入るように設定を入れておきます。
Protocols h2 http/1.1
h2がhttp2の設定になります。
Dockerfile作成
Dockerfileを作成します。記載した内容は以下です。
FROM httpd:2.4
RUN sed -i \
-e 's/^#\(Include .*httpd-ssl.conf\)/\1/' \
-e 's/^#\(LoadModule .*mod_ssl.so\)/\1/' \
-e 's/^#\(LoadModule .*mod_socache_shmcb.so\)/\1/' \
-e 's/^#\(LoadModule .*mod_http2.so\)/\1/' \
conf/httpd.conf
RUN mkdir /usr/local/apache2/conf/include/ && \
echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf
COPY ./confssl/* /usr/local/apache2/conf/
COPY ./conf/*.conf /usr/local/apache2/conf/include/
今回のポイントは
-e 's/^#(LoadModule .*mod_http2.so)/\1/' \
の部分になります。デフォルトのhttpd.confでは
httpd.conf:#LoadModule http2_module modules/mod_http2.so
のようにhttp2のモジュール読み込みがコメントアウトされているので、コメントアウトを外して、モジュールが読み込まれるようにしています。
その他の細かいところの説明は省きます。SSLの部分などは前回と同じなので、そちらを見てもらえればと思います。
Dockerイメージ作成(ビルド)
作成したDockerfileを元にDockerイメージを作成します。
$ docker build -t my-apache2-http2 .
Sending build context to Docker daemon 13.31kB
Step 1/5 : FROM httpd:2.4
---> c562eeace183
Step 2/5 : RUN sed -i -e 's/^#\(Include .*httpd-ssl.conf\)/\1/' -e 's/^#\(LoadModule .*mod_ssl.so\)/\1/' -e 's/^#\(LoadModule .*mod_socache_shmcb.so\)/\1/' -e 's/^#\(LoadModule .*mod_http2.so\)/\1/' conf/httpd.conf
---> Running in feb458a91849
Removing intermediate container feb458a91849
---> 69b4d3cb6003
Step 3/5 : RUN mkdir /usr/local/apache2/conf/include/ && echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf
---> Running in 587691ed37da
Removing intermediate container 587691ed37da
---> 5f3e523f426b
Step 4/5 : COPY ./confssl/* /usr/local/apache2/conf/
---> 68f1fe6783eb
Step 5/5 : COPY ./conf/*.conf /usr/local/apache2/conf/include/
---> 53ed039453ba
Successfully built 53ed039453ba
Successfully tagged my-apache2-http2:latest
$
無事にビルドできました。
コンテナ起動
作成したDockerイメージを起動します。
$ docker run -dit --name my-running-http2 -p 80:80 -p 443:443 my-apache2-http2
1cbe02ba31195b9fa3f8199877b13c9bfa87ca6d8b237d8079d3c485b40b910f
$
httpsでアクセスできるように443ポートを割り当てしています。
動作確認
curlでアクセス
コマンド
以下のコマンドでアクセスしてみます。
curl https://localhost:443/ -kv
kはSSL証明書のチェックを無視するオプション、vはヘッダ情報などの詳細も出力するオプションです。
実行
実際に実行すると以下のようになりました。
$ curl https://localhost:443/ -kv
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=localhost
* start date: Mar 15 12:44:42 2020 GMT
* expire date: Apr 14 12:44:42 2020 GMT
* issuer: CN=localhost
* SSL certificate verify result: self signed certificate (18), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7f9fba000400)
> GET / HTTP/2
> Host: localhost
> User-Agent: curl/7.54.0
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< date: Mon, 16 Mar 2020 14:34:56 GMT
< server: Apache/2.4.41 (Unix) OpenSSL/1.1.1d
< last-modified: Mon, 11 Jun 2007 18:53:14 GMT
< etag: "2d-432a5e4a73a80"
< accept-ranges: bytes
< content-length: 45
< content-type: text/html
<
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host localhost left intact
$
http2でのアクセスが確認できました。例えば「HTTP/2 200」などの表示で分かります。
ブラウザ表示
ブラウザでも確認してみます。以下はGoogle Chromeのディベロッパーツールの表示になります。
プロトコルが「h2」(http2)になっていることが分かります。
ログ
アクセス時のログを確認してみます。
コマンド
以下のコマンドでDockerのログを確認します。-fのオプションで更新を自動で読み込むようにしています。
docker logs -f my-running-http2
結果
結果は以下のようになりました。
172.17.0.1 - - [16/Mar/2020:14:41:18 +0000] "GET / HTTP/2.0" 200 45
[16/Mar/2020:14:41:18 +0000] 172.17.0.1 TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 "GET / HTTP/2.0" 45
サーバ(apache)側のログでも「”GET / HTTP/2.0″」のようにhttp2になっていることが確認できました。
作成物
今回作成したものは以下に置いています。
https://github.com/masaki-code/docker/tree/master/apache/http2
コメント