LoginSignup
9
11

More than 5 years have passed since last update.

WildFly9でHTTP2を試してみる

Last updated at Posted at 2015-08-16

はじめに

WildFly9がリリースされてからすでに2ヶ月経ちました。WildFly9の目玉機能の1つとしては、HTTP/2のサポートが挙げられると思います(リリースノート)。HTTP/2では、1コネクション内で複数のリクエスト/レスポンスを同時に処理できるようなりました(HTTP/1.1では基本的に1コネクション=1リクエスト/レスポンス)。これにより、多くのリソースを必要とするWebページのロード時間を短縮することができます。

本記事では、WildFly9でのHTTP/2の設定方法を解説したのち、実際にHTTP/2とHTTP/1.1のパフォーマンスを検証してみます。

検証環境

  • OS : OS X Yosemite 10.10.5
  • JDK : 8u45
  • ブラウザ : Chrome 44

この後でも説明しますが、JDK8以上が必須です。

WildFlyのセットアップ

ダウンロード

公式サイトからzipファイルをダウンロードして適当な場所(以下の例では/opt)に解凍します。解凍後のディレクトリ配下をjbossユーザに変更します。

$ cd /opt
$ sudo curl -O http://download.jboss.org/wildfly/9.0.1.Final/wildfly-9.0.1.Final.zip
$ sudo unzip wildfly-9.0.1.Final.zip
$ chown -R jboss wildfly-9.0.1.Final

以降、$JBOSS_HOMEは、/opt/wildfly-9.0.1.Final を指すものとします。また、jbossユーザで作業しているものとします。

ブートクラスパスにALPNを追加

現在、主要なブラウザはTLS(SSL)上でのHTTP/2のみをサポートしています(HTTP/2の仕様上は通常のHTTPも対象)。そのため、HTTP/2を利用するにはサーバ側もTLSに対応する必要があります。ただし、HTTP/2を利用するには、通常のTLSではなく、ALPNと呼ばれるTLS拡張を利用する必要があります。現状、JDK8はネイティブでALPNをサポートしていないため、拡張ライブラリ(jar)をブートクラスパスに追加する必要があります。また、JDK7より強い暗号方式を持つJDK8が必須です

ALPNのダウンロード

公式サイトよりALPNをダウンロードします。取得するバージョンは実行環境となるJVMのバージョンに依存します。バージョンの対応表は公式サイトにあります。 ダウンロード先は、$JBOSS_HOME/bin とします。

$ cd /opt/wildfly-9.0.1.Final/bin
$ curl -O http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar

standalone.confの設定

$JBOSS_HOME/bin/standalone.conf に以下の行を追加します。これにより、WildFlyの起動時に上記で取得したALPNがブートクラスパスに追加されます。

JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:alpn-boot-8.1.3.v20150130.jar"

SSL証明書の作成

JSSEツールのkeytoolコマンドを利用してSSLの証明書を作成します 1 。ここではテスト目的なので自己証明書(オレオレ証明書)です。

自己証明書の作成

下のコマンドにより、証明書を格納したキーストア $JBOSS_HOME/standalone/configuration/http2test.keystore ファイルが作成されます。

$ keytool -genkeypair -alias http2test -keyalg RSA -keystore /opt/wildfly-9.0.1.Final/standalone/configuration/http2test.keystore -storepass storepass -keypass keypass -dname "cn=localhost, c=JP"

HTTPSコネクタの設定

ダウンロードして解凍したままのWildFlyでは、SSL(HTTPS)を利用することができません。standalone.xmlを編集して、HTTPSコネクタを設定する必要があります。

standalone.xml の設定

$JBOSS_HOME/standalone/configuration/standalone.xml を編集します。

  • <security-realms>セクションに、作成した自己証明書を利用するセキュリティレルムを追加します。
            <security-realm name="https">
                <server-identities>
                  <ssl> 
                        <!-- この例ではhttp2test.keystore は同一ディレクトリにある -->     
                        <keystore path="http2test.keystore" relative-to="jboss.server.config.dir" keystore-password="storepass" alias="http2test" key-password="keypass"/>
                    </ssl>
                </server-identities>
            </security-realm>
  • Web サブシステム(<subsystem xmlns="urn:jboss:domain:undertow:2.0"> セクション)に、HTTPSコネクタを追加します。
                <!-- security-realm属性には、上のsecurity-realmで設定したname属性の値(この例ではhttps)を設定します。-->
                <https-listener name="https" socket-binding="https" security-realm="https" enable-http2="true"/>

ちなみに、WildFlyからWebサブシステムがUndertowと呼ばれる実装に変わったようです。

確認

WildFlyを起動します。

$ /opt/wildfly-9.0.1.Final/bin/standalone.sh

ブラウザを立ち上げ、以下のURLを入力します。

https://localhost:8443/

自己証明書なので警告が出ますが、トンボみたいなロゴとともに、Welcome to WildFly 9 と表示されればOKです。

計測アプリ

計測用のアプリを作成します。計測アプリといっても、WildFlyのロゴを500個表示させるだけの1つのJSPだけです。

ロゴ

WildFlyのロゴです。トンボに似ている何かです。
ここから頂きました。。。m(__)m

wildfly_logomark_64px.png

JSP

sample.jsp
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<head>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<title>http2のテストページ</title>
<meta charset="utf-8">
</head> 
<body>
<%
  long current = System.nanoTime();
  for (int i = 0; i < 500; i++) {
%>
    <!-- キャッシュさせないために、パラメータをつけておく -->
    <img src="wildfly_logomark_64px.png?<%=current  + i%>" />
<%
  }
%>
</body>
</html>

計測結果

HTTP/1.1とHTTP/2のそれぞれで計測用のページを表示した結果は以下の通りになりました。ブラウザはChromeです。

上でも説明していますが、現在の主要ブラウザはSSL(HTTPS)上でのみHTTP/2をサポートしています。そのため、通常のHTTPプロトコルで接続した場合はHTTP/1.1となり、HTTPSで接続した場合はHTTP/2となります。

HTTP/1.1

スクリーンショット 2015-08-16 19.14.36.png

HTTP/2

スクリーンショット 2015-08-16 19.14.31.png

ページのロード時間は、HTTP/1.1では、約2.9秒。HTTP/2では、約1.3秒となり、HTTP/2の方が2倍以上速度向上していることが分かります。また、Chromeのデベロッパーツールが示すように、HTTP/2では同時に大量の画像をロードしているようです。

参考サイト



  1. OpenSSLを利用する方法もドキュメントに記載されていますが、内容がUndertowの前身のWebサブスシテムのようです。Undertowでの設定方法をご存知の方あれば教えてください。。 

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11