Apache 2.4系でHTTP/2サーバを構築してみるテスト。
Apache HttpdのIPv6の設定と確認さて、仕上げに、IPv6対応のHTTPDを設定します。 とはいえ、コチラで、インストールした場合、FreeBSD, NetBSD, OpenBSD は除く、多くのOSでは、configureにおいて、 --enable-v4-mappedがデフォルトで含まれるため、80番も443番も、IPv4とIPv6の両方をバインドする状態になっています。 FreeBSD, NetBSD, OpenBSD の方はコチラの方法に、--enable-v4-mappedを追加して、./configureを行い、コンパイルし直してください。 あとは、注意事項的な部分と、確認方法がメインです。
httpd.confの設定まず、以下のファイルを確認します。 # vi /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf
(…省略…) Listen 80 (…省略…) このように、ポート番号だけならIPv6のアドレスもバインドされます。 ここに、Listen 192.168.1.1:80のように、IPv4アドレスとポート番号が並んだ記述になっていたら、これを上記のようにポート番号(80)だけにします。 それが難しい場合は、 以下のように、続けて、IPv4とIPv6のListenディレクティブを並べます。 # vi /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf
(…省略…) Listen 192.168.1.1:80 Listen [240d:XXXX:XXXX:XXXX::2]:80 (…省略…) IPv6のアドレスは、[]の括弧でくくります。 この表記は、ブラウザからIPv6アドレスで直接アクセスする場合に、アドレスバー入力する際にも使用します。 同じように、<VritualHost [IP ADDR]:[PORT]>の設定も確認します。 IPv4のアドレスが入っていると、IPv6では無視されて、デフォルト設定が利用されてしまいます。 手っ取り早くは、以下のように、アスタリスクをIPアドレスの部分に使用します。 # vi /usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf
/usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf
<VirtualHost *:443> <=IPv4とIPv6共通の設定にしたい場合 (…省略…) </VirtualHost> (…省略…) <VirtualHost [240d:XXXX:XXXX:XXXX::2]:443> <=IPv6だけの設定 (…省略…) </VirtualHost>
続いて、HTTPS側も、同様に確認します。 # vi /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf
(…省略…) Listen 443 (…省略…) ここもポート番号(443)だけになるようにしますが、IPv4が複数乗っているホストで、そのうち一つのIPv4アドレスだけをWebサーバに割り当てたい場合などは、Listenを並べて,IPv4の設定に加えて、IPv6の設定も記述します。 必要に応じて、apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように # /usr/local/apache2/bin/apachctl -t Syntax OK # /usr/local/apache2/bin/apachctl stop # /usr/local/apache2/bin/apachctl start として、再起動します。
IPv6で動作しているか確認OpenSSL1.0.2はOSによっては、優先的にIPv6で通信するようですが、IPv4でしか動作しない環境もあるようです。 たいていの環境で、試せる方法を探してみたのですが、nghtp2はAAAAレコードがあれば、そちらを優先するようなので、これで確認してみます。 まずは、いつも通りnghttpでアクセスしてみます。 コチラの方法でOSとは別にOpenSSLをソースからインストールした方は、LDライブラリパスの設定が必要ですので、コチラを参考にしてください。 $ nghttp -v -s https://example.com [ 0.001] Connected The negotiated protocol: h2 [ 0.013] recv SETTINGS frame <length=6, flags=0x00, stream_id=0> (niv=1) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [ 0.013] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0> (window_size_increment=2147418112) [ 0.013] send SETTINGS frame <length=12, flags=0x00, stream_id=0> (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.013] send SETTINGS frame <length=0, flags=0x01, stream_id=0> ; ACK (niv=0) (…省略…) これだけでは、IPv4なのか、IPv6なのかは判別できません。そこでログを見てみます。 当サイトで紹介したのログ取得設定をしている場合、以下のようなログになります。 # tail /var/log/https/example.com/access_log.20160520 2408:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX "2016-05-20 04:51:15 +0900" TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 20738 209-1 - GET "/index.html" "" HTTP/2 304 0 "https://example.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" "PUSHED" 1 このように、IPv6アドレスがログに残っていれば成功です。 IPアドレスが長くなったこと以外に違いはありません。TLSバージョンと、暗号スイートも確認できます。 なお、IPv6対応をチェックしてくれるサイトもあります。 ipv6 test - Website IPv6 accessibility validator - >> http://ipv6-test.com/validate.php
| ||||||||||||||||||||||