Dockerのapache環境でHTTP2の設定

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

コメント

タイトルとURLをコピーしました