Edited at

WildFly9でHTTP2を試してみる

More than 3 years have passed since last update.


はじめに

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


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


HTTP/2

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


参考サイト






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