SlideShare a Scribd company logo
Copyright(c)2014 NTT Corp. All Rights Reserved. 1
次世代 Web コンテナ
Undertow について
田邊 義真(NTT OSSセンタ )
2014-06-25
JJUG ナイトセミナー「 WildFly 8ローンチ記念」
Copyright(c)2014 NTT Corp. All Rights Reserved. 2
前提
●
動作確認環境
– WildFly 8.1.0.Final
●
Undertow 1.0.15.Final
●
standalone モード
– Fedora 20
– OpenJDK 8
●
記述方法
– CLI 利用箇所は [CLI] と記述します
– ターミナルは [Terminal] と記述します
●
検証内容
– 手元環境での簡易な負荷試験を実施
Copyright(c)2014 NTT Corp. All Rights Reserved. 3
アジェンダ
Undertowとは
アーキテクチャ概要
設定ポイント
Undertowいろいろ
Copyright(c)2014 NTT Corp. All Rights Reserved. 4
Undertow とは
Copyright(c)2014 NTT Corp. All Rights Reserved. 5
WildFly の Web/Servlet コンテナ
Undertow は
WildFly から導入された
Web/Servlet コンテナです
Copyright(c)2014 NTT Corp. All Rights Reserved. 6
Web/Servlet コンテナの歩み
●
JBoss Web(AS7以前 )
– http://jbossweb.jboss.org
– Tomcat ベース
●
パフォーマンス強化
●
クラスタリングは別実装
●
その他いろいろとカスタマイズされている
●
Undertow(WildFly から )
– http://undertow.io
– スクラッチ
●
初コミットは 2012/07 。当初は Texugo という名称
●
基盤は XNIO(NIO ラッパフレームワーク )
– http://xnio.jboss.org/
Copyright(c)2014 NTT Corp. All Rights Reserved. 7
Undertow が生まれた背景
●
なぜ新しい Web サーバが必要なのか
– Web の発展と共に Web サーバへ求められる機能が増加している
( これからも増え続ける ) 。
– 様々なユースケースに対応できる、柔軟性の高いサーバが欲しい
●
抽象化、使いやすさとカスタマイズ性を両立するために、 XNIO を採用
した。 XNIO は NIO のラッパーで、冗長さの排除とダイレクト I/O と
OS とを統合する API といった低レイヤ I/O 層を提供するが、それ以上
は踏み込まない。また、後方互換性にも優れている。
– Undertow FAQ より
●
http://undertow.io/documentation/faq.html
– また、全体的にクラウド上での利用を強く意識しているように感
じます
Copyright(c)2014 NTT Corp. All Rights Reserved. 8
特徴 1. 軽量
●
コア jar のサイズは 1.3MB 程度
●
ヒープサイズ 10MB 以下で起動
– ※ ごくごくシンプルな設定の場合で試行
Copyright(c)2014 NTT Corp. All Rights Reserved. 9
特徴 2. 組込み可能
●
従来の Web/Servlet コンテナとは違い、必要
なものを組み合わせて使うというアーキテクチ
ャ ( 後述 ) により、アプリケーションに容易に
組み込み可能
– ※ 本資料の主な内容は、 WildFly の 1 サブシステ
ムとしての利用を想定しています
Copyright(c)2014 NTT Corp. All Rights Reserved. 10
特徴 3. Blocking/Non-blocking API
●
Undertow はブロッキング / ノンブロッキング
API 両方を提供する
●
Servlet や WebSocket など、使う API によっ
てブロッキングとノンブロッキングのどちらで
処理するか自動的に使い分けられる
Copyright(c)2014 NTT Corp. All Rights Reserved. 11
特徴 4. HTTP Upgrade Support
●
WebSocket 対応とリスンポート削減
– WebSocket(JSR356) 対応に HTTP Upgradeが必要
– EJB や JMS 等、独自プロトコルを利用するものを HTTP
Upgrade 経由で接続することで、リスンポートが削減された。
– 1 筐体 /VM インスタンスに複数サーバが実行される PaaS 環境に
有効
$ ss ­anp | grep <as7­pid>
tcp LISTEN 127.0.0.1:8080 <­ http
tcp LISTEN 127.0.0.1:4447 <­ remoting
tcp LISTEN 127.0.0.1:5445 <­ messaging
tcp LISTEN 127.0.0.1:9990 <­ management­http
tcp LISTEN 127.0.0.1:9999 <­ management­native
$ ss ­anp | grep <wildfly­pid>
tcp LISTEN 127.0.0.1:8080
tcp LISTEN 127.0.0.1:9990
※ 出力内容は抜粋しています
Copyright(c)2014 NTT Corp. All Rights Reserved. 12
アーキテクチャ概要
Copyright(c)2014 NTT Corp. All Rights Reserved. 13
Undertow の構成要素
●
XNIO Worker
●
リスナ
●
ハンドラ
Copyright(c)2014 NTT Corp. All Rights Reserved. 14
XNIO Worker
●
IO スレッド ( リスナ ) とタスク ( 処理 ) のスレ
ッドプールを管理
Copyright(c)2014 NTT Corp. All Rights Reserved. 15
リスナ
●
リクエストの受け付け、 HttpServerExchange という
リクエスト / レスポンス情報を持つインスタンスへの変
換、クライアントへのレスポンスを担う
●
HTTP, HTTPS, AJPが組込まれている
– 今後 SPDY もサポートされる予定
●
IO スレッドと紐付いている
●
処理はタスクのスレッドにディスパッチする
●
利用 API によってタスク中の I/O 処理が切り替わる
– Servlet: ブロッキング
– WebSocket, Async Servlet:ノンブロッキング
Copyright(c)2014 NTT Corp. All Rights Reserved. 16
ハンドラ
●
処理を行う単位
●
複数のハンドラを登録し、チェーンさせること
で全体としての処理を形成する
Copyright(c)2014 NTT Corp. All Rights Reserved. 17
ハンドラチェーン
出典 : Entering Undertow Web server
http://www.javacodegeeks.com/2014/01/entering-undertow-web-server.html
Copyright(c)2014 NTT Corp. All Rights Reserved. 18
コード片からイメージをつかむ
●
組込み Undertow のコード例 ( ビルダ API)
– “Hello World” を返すだけの http サーバ
Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost")
  .setHandler(new HttpHandler() {
    @Override
    public void handleRequest(HttpServerExchange ex) throws Exception {
      ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");
      ex.getResponseSender().send("Hello World");
    }
  }).build();
server.start();
Copyright(c)2014 NTT Corp. All Rights Reserved. 19
コード片からイメージをつかむ
●
組込み Undertow のコード例 ( ビルダ API)
– “Hello World” を返すだけの http サーバ
Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost") <­ HTTP リスナのバインディング
  .setHandler(new HttpHandler() {
    @Override
    public void handleRequest(HttpServerExchange ex) throws Exception {
      ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");
      ex.getResponseSender().send("Hello World");
    }
  }).build();
server.start();
Copyright(c)2014 NTT Corp. All Rights Reserved. 20
コード片からイメージをつかむ
●
組込み Undertow のコード例 ( ビルダ API)
– “Hello World” を返すだけの http サーバ
Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost")
  .setHandler(new HttpHandler() { <­  ハンドラ ( 処理内容 )
    @Override
    public void handleRequest(HttpServerExchange ex) throws Exception {
      ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");
      ex.getResponseSender().send("Hello World");
    }
  }).build();
server.start();
Copyright(c)2014 NTT Corp. All Rights Reserved. 21
コード片からイメージをつかむ
●
組込み Undertow のコード例 ( ビルダ API)
– “Hello World” を返すだけの http サーバ
Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost") <­ HTTP リスナ
  .setHandler(new HttpHandler() {
    @Override
    public void handleRequest(HttpServerExchange ex) throws Exception {
      ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");
      ex.getResponseSender().send("Hello World");
    }
  }).build();
server.start();
リクエスト / レスポンス情報
Copyright(c)2014 NTT Corp. All Rights Reserved. 22
コード片からイメージをつかむ
●
組込み Undertow のコード例 ( ビルダ API)
– “Hello World” を返すだけの http サーバ
Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost")
  .setHandler(new HttpHandler() {
    @Override
    public void handleRequest(HttpServerExchange ex) throws Exception {
      ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");
      ex.getResponseSender().send("Hello World");
    }
  }).build();
server.start(); <­  ビルド情報をもとにサーバ起動
Copyright(c)2014 NTT Corp. All Rights Reserved. 23
コード片からイメージをつかむ
●
ハンドラチェーンの例
public interface HttpHandler {
  void handleRequest(HttpServerExchange exchange) throws Exception;
}
public clss MyHandler implements HttpHandler {
  private final HttpHandler next; <­  次のハンドラ。コンストラクタで設定
  @Override
  public void handleRequest(HttpServerExchange ex) throws Exception {
    //  何らかの処理
    next.handleRequest(ex); <­  次のハンドラの処理を実行
  }
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 24
ハンドラの集合
●
Undertow はハンドラの集合であり、一般的な
コンテナのイメージとは違います
●
WildFly の中で Undertow を使う場
合、 Web/Servlet コンテナとして動作するの
に必要なハンドラが適切に設定されて起動され
るため、普段は意識する必要はありません
Copyright(c)2014 NTT Corp. All Rights Reserved. 25
設定ポイント
Copyright(c)2014 NTT Corp. All Rights Reserved. 26
設定ポイント ... の前に
Copyright(c)2014 NTT Corp. All Rights Reserved. 27
その前に ... 設定方法
●
AS7 からシンプルに
– AS6 以前
●
設定ファイル : 各所に分散
●
設定方法 : 基本的に xml 直接編集
– AS7 から
●
設定ファイル : 一箇所 (standalone*.xml) に集約
●
設定方法 : インターフェースが強化されました
●
設定方法あれこれ
– CLI
– Web コンソール
– 設定ファイル (standalone*.xml) 直接編集
Copyright(c)2014 NTT Corp. All Rights Reserved. 28
設定方法 1. CLI
●
慣れてきたら CLI がおすすめ
– 慣れるまで少々練習を要するかも ( 個人の感想 )
●
タブ補完が利く
●
スクリプト化して再利用がしやすい
[Terminal]
$ cd <WILDFLY_HOME>/bin
$ ./standalone.sh   <­ WildFly の起動
$ ./jboss­cli.sh ­c <­ CLI の起動
[CLI]
[standalone@localhost:9990 /] <­  プロンプトが変わる
※ 以降ではプロンプトは省略いたします
Copyright(c)2014 NTT Corp. All Rights Reserved. 29
設定方法 1. CLI
[CLI]
ls ­l / <­  管理リソース一覧をルート※から表示
ATTRIBUTE                VALUE       TYPE   
[...]
release­version          8.1.0.Final STRING 
[...]
CHILD                MIN­OCCURS MAX­OCCURS 
core­service         n/a        n/a        
deployment           n/a        n/a        
deployment­overlay   n/a        n/a        
extension            n/a        n/a        
interface            n/a        n/a        
path                 n/a        n/a        
socket­binding­group n/a        n/a        
subsystem            n/a        n/a        
system­property      n/a        n/a 
※ 管理リソースはツリー構造になっています
Copyright(c)2014 NTT Corp. All Rights Reserved. 30
設定方法 2. Webコンソール
●
GUI(Web ブラウザ ) 上の操作のため直感的
– おおまかに何が設定できるのかを確認するときにも
おすすめ
●
ただし、設定できない項目もある
– CLI は全ての項目が設定可能
[Terminal]
$ cd <WILDFLY_HOME>/bin
$ ./add­user.sh     <­  管理ユーザ (Management User)を作成しておく
$ ./standalone.sh   <­ WildFly の起動
ブラウザで以下 URI にアクセス
http://localhost:9990
Copyright(c)2014 NTT Corp. All Rights Reserved. 31
設定方法 2. Webコンソール
Copyright(c)2014 NTT Corp. All Rights Reserved. 32
設定方法 3. standalone*.xml 直接編集
●
非推奨
●
タイポやコピペミスによる設定不備が起きがち
●
何をしたか記録に残らない
– CLI, Webコンソールで行った設定は以下に記録
●
<WILDFLY_HOME>/standalone/configuration/standalone_xml_history
●
デフォルト値で設定されている項目はほとんど
表示されない
●
CLI での管理リソースのデータ構造と xml スキ
ーマは完全一致していない
Copyright(c)2014 NTT Corp. All Rights Reserved. 33
設定方法 3. standalone*.xml 直接編集
●
とはいうものの、全体の構成をつかむために眺
めておくのも有用です
server
   ├ extensions
   ├ management
   ├ profile
   ├ interfaces
   └ socket­binding­group
※ その他、必要に応じて path や deployments 属性が追加される
Copyright(c)2014 NTT Corp. All Rights Reserved. 34
気を取り直して設定ポイント
Copyright(c)2014 NTT Corp. All Rights Reserved. 35
io サブシステム
Copyright(c)2014 NTT Corp. All Rights Reserved. 36
io サブシステム
●
Undertow は /subsystem=io に依存
– リスナ ( 後述 ) が下記 2 項目を参照しており、性能
面での実質的なチューニングポイントになる可能性
が高い
●
Workers
●
Buffer Pool
Copyright(c)2014 NTT Corp. All Rights Reserved. 37
io サブシステム
●
Workers( 緑字はチューニング検討項目 )
– Stack size: スレッドのスタックサイズ。デフォルト 0(= 指
定しない )
– Task keepalive: 同一クライアントからのリクエストに対す
るコネクションを何秒維持するか。デフォルト 60 秒
– IO threads: リクエストを受け付けるスレッドの数
– Task max threads: IOスレッドからディスパッチされるタ
スクスレッドの最大数
– Task core threads: タスクスレッドの最小数 ( デフォルト
2)
●
無効なパラメータの可能性あり。 xml スキーマ中に存在しない = 永
続化されない , XNIO中で無視されている ?
Copyright(c)2014 NTT Corp. All Rights Reserved. 38
io サブシステム
●
IO threads
– リクエストを受け付けるスレッドの数。ノンブロッ
キングな処理を行う
– デフォルト : 利用可能 CPU 数 *2
Copyright(c)2014 NTT Corp. All Rights Reserved. 39
io サブシステム
●
Task max threads
– IO スレッドからディスパッチされるタスクスレッ
ドの最大数。 Servlet などはブロッキングされる
– デフォルト : 利用可能 CPU 数 *16
Copyright(c)2014 NTT Corp. All Rights Reserved. 40
io サブシステム
●
IO threadsと Task max threads
– チューニングではこの 2 オプションがキー
– サーブレットを使った簡易な検証では、 Task max
threads の変更に効果がみられました
●
実際にタスク ( ブロッキング処理含む ) を実行するスレッ
ドなので、 CPU リソースに見合った数を用意するべきと
考えます
– IO threadsで実行する処理はノンブロッキングで
あることも考えると、 IO threadsは相当な高負荷
である場合チューニングを検討するといったパラメ
ータかもしれません
Copyright(c)2014 NTT Corp. All Rights Reserved. 41
io サブシステム
●
Buffer Pool(以下デフォルト値 )
– Buffer Size: 16KB
●
バッファサイズ。一般的に 1 回の write() 呼び出しで送
られるサイズが 16KB なのでこの値は最適
– Buffer Per Slice: 20
●
バッファの分割数。大きなバッファを分割して操作し、
バッファ全体を処理する際のオーバヘッドを回避しま
す。
– Direct Buffers: true
●
バッファをダイレクトバッファとして利用するか
※ 上記デフォルト値は利用可能なヒープサイズが 128MB 以上の時の値です。
Copyright(c)2014 NTT Corp. All Rights Reserved. 42
undertow サブシステム
●
/subsystem=undertow
– buffer-cache
– server
– servlet-container
– configuration
– error-page
Copyright(c)2014 NTT Corp. All Rights Reserved. 43
undertow サブシステム
●
Buffer Cache
– 静的ファイルなどのキャッシュに利用
– 全体の容量は以下
●
buffer-size * buffers-per-region * max-regions
– 以下、デフォルト値
●
buffer-size: 1024
●
buffers-per-region: 1024
●
max-regions: 10
Copyright(c)2014 NTT Corp. All Rights Reserved. 44
undertow サブシステム
●
Server
– Undertow 全体の設定
●
リスナ
●
ホスト
– 設定したハンドラやフィルタをひもづける ( 後述 )
Copyright(c)2014 NTT Corp. All Rights Reserved. 45
undertow サブシステム
●
Server -> Listener
– リクエストの受け付け、レスポンス処理
CLI でリスナの設定を確認する
---------------------------------------------
[CLI]
cd /subsystem=undertow/server=default­server/http­listener=default
:read­resource
{
    "outcome" => "success",
    "result" => {
        [...]
        "buffer­pool" => "default", (1)
        [...]
        "record­request­start­time" => true,
        [...]
        "worker" => "default" (2)
    }
}
(1)(2) ioサブシステムで定義したものを参照
Copyright(c)2014 NTT Corp. All Rights Reserved. 46
undertow サブシステム
●
Server -> Listener
– リクエストの受け付け、レスポンス処理
[Tips]CLI でリスナの設定を変更する
-----------------------------------------------------
[CLI]
cd /subsystem=undertow/server=default­server/http­listener=default
:write­attribute(name=record­request­start­time,value=true)
{
    "outcome" => "success",
    "response­headers" => {
        "operation­requires­reload" => true,
        "process­state" => "reload­required"
    }
}
/:reload
リロードが必要なものの場合表示される
Copyright(c)2014 NTT Corp. All Rights Reserved. 47
undertow サブシステム
●
Server -> Listener
– リクエストの受け付け、レスポンス処理
[Tips] 設定項目の内容 ( 型、説明、デフォルト値など ) を確認する
-----------------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/server=default­server/http­listener=default
:read­resource­description
{
    "outcome" => "success",
    "result" => {
        "description" => "http listener",
        "access­constraints" => [...]
        "attributes" => {
            "record­request­start­time" => {
                "type" => BOOLEAN,
                "description" => “If this is true then ...”
            }
        }
    }
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 48
undertow サブシステム
●
Server -> Listener
– リクエストの受け付け、レスポンス処理
[Tips]CLI の出力をリダイレクトする ( 内容が多く標準出力では見えづらい場合など )
-----------------------------------------------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/server=default­server/http­listener=default
:read­resource­description > /tmp/http­listener­description
[Terminal]
$ cat /tmp/http­listener­description
{
    "outcome" => "success",
    "result" => {
        "description" => "http listener",
        [...]
Copyright(c)2014 NTT Corp. All Rights Reserved. 49
undertow サブシステム
●
Servlet Container
– Servlet コンテナ設定
CLI で Servlet コンテナの設定を確認する
----------------------------------------------------------
[CLI]
cd /subsystem=undertow/servlet­container=default
:read­resource
{
    "outcome" => "success",
    "result" => {
        "allow­non­standard­wrappers" => false,
        "default­buffer­cache" => "default",
        [...]
        "use­listener­encoding" => false,
        "setting" => {"jsp" => undefined}
    }
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 50
undertow サブシステム
●
Servlet Container
– Servlet コンテナ設定
[Tips] 子要素 (setting -> jsp の設定も見たい場合
------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/servlet­container=default
:read­resource(recursive=true)
{
    "outcome" => "success",
    "result" => {
        [...]
        "setting" => {"jsp" => {
            "check­interval" => 0,
            [...]
        }}
    }
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 51
undertow サブシステム
●
Servlet Container
– Servlet コンテナ設定
[Tips] :read-resource-descriptionも再帰的に確認できる
----------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/servlet­container=default
:read­resource­description(recursive=true)
{
    "outcome" => "success",
        [...]
        "children" => {"setting" => {
            "description" => "The servlet container settings",
            "model­description" => {
                "jsp" => {       
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 52
アクセスログ
●
デフォルトでは出力されない
[CLI]
cd /subsystem=undertow/server=default­server/http­listener=default
:write­attribute(name=record­request­start­time,value=true)
cd /subsystem=undertow/server=default­server/host=default­host/setting
./access­log:add(prefix=access,pattern="%t,%a,%m,%U,%s,%D")
/:reload
レスポンスタイムを出すのに必要 ( デフォルト false)
[Console]
$ cat <WILDFLY_HOME>/standalone/log/access.log
25/Jun/2014:20:00:00 +0900,127.0.0.1,GET,/,200,12
pettern に設定できる値は以下クラスの javadoc から確認できます。
io.undertow.server.handlers.accesslog.AccessLogHanlder
[Github]http://bit.ly/1jHlGs3
Copyright(c)2014 NTT Corp. All Rights Reserved. 53
ルートコンテキストの変更
●
任意のアプリケーションを http://<yourdomain>/ でアクセ
スさせるためには以下の 2 ステップが必要
– welcome-content への参照 (File ハンドラ ) を削除
– アプリケーション中に WEB-INF/jboss-web.xml を作成する
[CLI]
cd /subsystem=undertow/server=default­server/host=default­host
./location="/":remove
[ 以下内容の WEB­INF/jboss­web.xml を作成 ]
<?xml version="1.0" encoding="UTF­8"?>
<jboss­web>
  <context­root>/</context­root>
</jboss­web>
Copyright(c)2014 NTT Corp. All Rights Reserved. 54
Session Cookie
●
WildFlyではグローバルなクッキー設定が可能
– comment
– domain
– http-only
– max-age
– name
– secure
例 : クッキー設定を有効化し、クッキー名の変更と http-only 属性を設定する
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
[CLI]
cd /subsystem=undertow/servlet­container=default/setting
./session­cookie:add(name=MYCOOKIE,http­only=true)
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 55
Single Sign On
●
1 度の認証処理で複数の Web アプリケーショ
ンの認証を行う
ルート (/) を指定することで、全てのアプリケーションを SSO 対象にする。
“JSESSIONIDSSO” というクッキーを共有することで実現している
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
[CLI]
cd /subsystem=undertow/server=default­server/host=default­host/setting
./single­sign­on:add(path="/")
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 56
Persistent Sessions
●
セッションをファイルに永続化
<WILDFLY_HOME>/standalone/data/persistent-web-session に格納する場合
※path を指定しない場合、セッションはメモリに格納される
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
[CLI]
cd /subsystem=undertow/servlet­container=default/setting
./persistent­sessions:add(path=persistent­web­sessions,
                          relative­to=jboss.server.data.dir)
/:reload
relative-to に組込システムプロパティを指定し、
<WILDFLY_HOME>/standalone/data を起点にしている
Copyright(c)2014 NTT Corp. All Rights Reserved. 57
組込 Handler と Filter
●
ポータビリティとの兼ね合いを判断して利用
●
Handler: 特定のリクエストパスに対して適用
– file
– reverse-proxy
●
Filter: リクエスト全体に対して適用※
– basic-auth
– connection-limit
– gzip
– response-header
※Handler と組み合わせれば特定パスに適用可 ( 後述 )
Copyright(c)2014 NTT Corp. All Rights Reserved. 58
File ハンドラ
●
httpd でのエイリアス相当
http://localhost:8080/img/<file-path> で /var/images/<file-path> にアクセス
---------------------------------------------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/configuration=handler/file
./images:add(path=/var/images)
cd /subsystem=undertow/server=default­server/host=default­host/location
./"/img":add(handler=images)
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 59
Reverse Proxyハンドラ
●
WildFly をリバースプロキシとして利用可能
host に設定した (1)(2) にラウンドロビンで振り分けられる
-----------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/configuration=handler/reverse­proxy
./my­reverse­proxy:add
cd ./my­reverse­proxy
./host=”http://192.168.0.20:8080/my­app”:add <­ (1)
./host=”ajp://192.168.0.30:8009/my­app”:add  <­ (2)ajp も可
cd /subsystem=undertow/server=default­server/host=default­host/location
./"/my­app":add(handler=my­reverse­proxy)
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 60
Basic Authフィルタ
●
ベーシック認証フィルタ
– 2014-06-25 現在、適切に動作しません
●
https://issues.jboss.org/browse/WFLY-3342
指定した security domainによるベーシック認証フィルタ
-----------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/configuration=filter/connection­limit
./my­auth:add(security­domain=other) <­ ※other は最初から用意されている
cd /subsystem=undertow/server=default­server/host=default­host/filter­ref
./my­auth:add
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 61
Connection Limitフィルタ
●
同時接続数を制限
同時接続数と待ちキュー ( バックログ ) を設定できる
-------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/configuration=filter/connection­limit
./my­connection­limit:add(max­concurrent­requests=100,queue­size=5)
cd /subsystem=undertow/server=default­server/host=default­host/filter­ref
./my­connection­limit:add
/:reload
HTTP リクエスト単位で制御したい場合やポータビリティが気になる場合は、
Servlet フィルタや JAX-RS フィルタを作成しましょう
[ 参考 ]
Tomcat や JBoss で HTTP リクエスト単位で並行実行数を制限するサーブレットフィルタ
http://nekop.hatenablog.com/entry/20120424/1335254637
Copyright(c)2014 NTT Corp. All Rights Reserved. 62
gzip フィルタ
●
リソース gzip 圧縮
predicate で対象を指定する (gzip に限らず、フィルタは全てこの属性を持つ )
-------------------------------------------------------------------------------------------------------------
[CLI]
cd /subsystem=undertow/configuration=filter/gzip
./my­gzip:add
cd /subsystem=undertow/server=default­server/host=default­host/filter­ref
./my­gzip:add(predicate="path­suffix['.css'] or path­suffix['.js']")
/:reload
●
通常 WildFly の前段に設置したリバースプロキシで設定すると思われるので、あまり利
用することはないかも ... 考えられるとしたら以下のようなパターン ?
●
リバースプロキシ -WildFly 間の N/W 帯域を節約したい場合
●
リバースプロキシに CPU をあまり使わせたくない場合
●
WildFly がクライアントから直接リクエストを受ける場合
Copyright(c)2014 NTT Corp. All Rights Reserved. 63
Response Header フィルタ
●
任意のレスポンスヘッダを追加
[CLI]
cd /subsystem=undertow/configuration=filter/response­header
./my­header:add(header­name=My­Header,header­value=My­Header­Value)
cd /subsystem=undertow/server=default­server/host=default­host/filter­ref
./my­header:add
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 64
Response Header フィルタ
●
デフォルトで設定されているヘッダを削除
[CLI]
cd /subsystem=undertow/server=default­server/host=default­host/filter­ref
./server­header:remove
./x­powered­by­header:remove
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 65
ハンドラとフィルタの組み合わせ
●
特定のパスにのみ有効なフィルタ
特定パスのみヘッダを設定する例 ( 前述の /img と my-header を利用 )
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
[CLI]
cd /subsystem=undertow/server=default­server/host=default­host/location
./"/img"/filter­ref=my­header:add
Copyright(c)2014 NTT Corp. All Rights Reserved. 66
その他機能
●
error-page
– 未実装 ? 調査中 ...
Copyright(c)2014 NTT Corp. All Rights Reserved. 67
Undertow いろいろ
Copyright(c)2014 NTT Corp. All Rights Reserved. 68
Undertow いろいろ
●
Spring Boot Starter Undertow
– https://github.com/isopov/spring-boot-starter-undertow
– 組込み Web サーバは ...Jetty? Tomcat? Undertow!
●
Hammock
– https://github.com/johnament/hammock
– RESTEasy + Weld + Undertow!
●
undertow-dev メーリングリストにて
– Undertow をリバースプロキシとして使いたい
– などなど
単体でも注目度が高くなってきている
Copyright(c)2014 NTT Corp. All Rights Reserved. 69
最後に
●
Web はこれからも進化し、企業にとってもます
ます重要なものとなります
●
Undertow はモダン Web に追従するべく作られ
ました。また、従来のアプリケーションに対して
も申し分のないパフォーマンスを発揮するポテン
シャルを持っています。
●
とはいえ開発からまだ 2 年。ぜひ応援を !
– 機能不足やバグ報告があれば要望、さらには PR!
●
微力ながら私もアクセスログにおける機能追加案を投稿し
ました
Copyright(c)2014 NTT Corp. All Rights Reserved. 70
参考
●
公式サイト
– http://undertow.io/
●
WildFly ドキュメント
– https://docs.jboss.org/author/display/WFLY8/Unde
rtow+(web)+subsystem+configuration
●
WildFly 8 Administration Guide
– http://www.itbuzzpress.com/ebooks/wildfly-8-book.h
tml
●
Dive Into WildFly 8
– 30:15~ からスペックリードによる Undertow の説明
– http://vimeo.com/79890483
Copyright(c)2014 NTT Corp. All Rights Reserved. 71
参考
●
メーリングリスト
– https://lists.jboss.org/mailman/listinfo/underto
w-dev
●
JIRA
– https://issues.jboss.org/browse/UNDERTOW/
Copyright(c)2014 NTT Corp. All Rights Reserved. 72
参考
●
Undertow のソースツリーを眺める - nekop の日記
– http://d.hatena.ne.jp/nekop/20131224/1387938098
●
Experiences with migrating from JBoss AS 7 to
WildFly 8.1
– JBoss Web -> Undertowの Tips も載っています
– http://jdevelopment.nl/experiences-migrating-jboss-7-wildfly-
81/
●
JBoss Enterprise Application Platform 6 構築・運用パーフ
ェクトガイド
– JBoss EAP 6 向けですが、 WildFly 利用時でもほとんどの内容
を踏襲できるので、初めて触る方にもおすすめです
– http://gihyo.jp/book/2013/978-4-7741-5794-8

More Related Content

What's hot

コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
Kohei Tokunaga
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
Masahito Zembutsu
 
実践イカパケット解析
実践イカパケット解析実践イカパケット解析
実践イカパケット解析
Yuki Mizuno
 
GitLab CI/CD パイプライン
GitLab CI/CD パイプラインGitLab CI/CD パイプライン
GitLab CI/CD パイプライン
Tetsurou Yano
 
BGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみたBGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみた
akira6592
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰する
Kohei Tokunaga
 
ファイルシステム比較
ファイルシステム比較ファイルシステム比較
ファイルシステム比較
NaoyaFukuda
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
Takaaki Hoyo
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
Metaspace
MetaspaceMetaspace
Metaspace
Yasumasa Suenaga
 
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudyネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
Yahoo!デベロッパーネットワーク
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
Yoshiyasu SAEKI
 

What's hot (20)

コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
実践イカパケット解析
実践イカパケット解析実践イカパケット解析
実践イカパケット解析
 
GitLab CI/CD パイプライン
GitLab CI/CD パイプラインGitLab CI/CD パイプライン
GitLab CI/CD パイプライン
 
BGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみたBGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみた
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰する
 
ファイルシステム比較
ファイルシステム比較ファイルシステム比較
ファイルシステム比較
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
Metaspace
MetaspaceMetaspace
Metaspace
 
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudyネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
 

Similar to 次世代Webコンテナ Undertowについて

Lagopus Switch Usecases
Lagopus Switch UsecasesLagopus Switch Usecases
Lagopus Switch Usecases
Sakiko Kawai
 
Lagopus Router v19.07.1
Lagopus Router v19.07.1Lagopus Router v19.07.1
Lagopus Router v19.07.1
Tomoya Hibi
 
loggregator update
loggregator updateloggregator update
loggregator update
Ken Ojiri
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例fumoto kazuhiro
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
Tomoya Hibi
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
Ransui Iso
 
CloudStack概要と最新動向_JulyTechFesta
CloudStack概要と最新動向_JulyTechFestaCloudStack概要と最新動向_JulyTechFesta
CloudStack概要と最新動向_JulyTechFestasamemoon
 
Cloud stack徹底入門7章 20130514
Cloud stack徹底入門7章 20130514Cloud stack徹底入門7章 20130514
Cloud stack徹底入門7章 20130514samemoon
 
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
Hinemos
 
ニフティクラウドアップデート in クラウドごった煮@青森
ニフティクラウドアップデート in クラウドごった煮@青森ニフティクラウドアップデート in クラウドごった煮@青森
ニフティクラウドアップデート in クラウドごった煮@青森
亮介 山口
 
openQRM V5.1 Update
openQRM V5.1 UpdateopenQRM V5.1 Update
openQRM V5.1 Update
OSSラボ株式会社
 
Lagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそばLagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそば
Yoshihiro Nakajima
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3openrtm
 
20150715 xflow kikuta_final
20150715 xflow kikuta_final20150715 xflow kikuta_final
20150715 xflow kikuta_final
Kazumasa Ikuta
 
DPDKを拡張してみた話し
DPDKを拡張してみた話しDPDKを拡張してみた話し
DPDKを拡張してみた話し
Lagopus SDN/OpenFlow switch
 
第20回 OpenStack勉強会 Neutron Deep Dive - DVR
第20回 OpenStack勉強会 Neutron Deep Dive - DVR第20回 OpenStack勉強会 Neutron Deep Dive - DVR
第20回 OpenStack勉強会 Neutron Deep Dive - DVR
Toru Makabe
 
CONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 NetworkCONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 Network
Yuya Takahashi
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコシステムズ合同会社
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門irix_jp
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方
Yuji Oshima
 

Similar to 次世代Webコンテナ Undertowについて (20)

Lagopus Switch Usecases
Lagopus Switch UsecasesLagopus Switch Usecases
Lagopus Switch Usecases
 
Lagopus Router v19.07.1
Lagopus Router v19.07.1Lagopus Router v19.07.1
Lagopus Router v19.07.1
 
loggregator update
loggregator updateloggregator update
loggregator update
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
CloudStack概要と最新動向_JulyTechFesta
CloudStack概要と最新動向_JulyTechFestaCloudStack概要と最新動向_JulyTechFesta
CloudStack概要と最新動向_JulyTechFesta
 
Cloud stack徹底入門7章 20130514
Cloud stack徹底入門7章 20130514Cloud stack徹底入門7章 20130514
Cloud stack徹底入門7章 20130514
 
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
【HinemosWorld2014】B2-2_ビジネス競争力に勝てるネットワーク基盤構築~Hinemos仮想ネットワーク管理オプション~ONIE・ZTP・...
 
ニフティクラウドアップデート in クラウドごった煮@青森
ニフティクラウドアップデート in クラウドごった煮@青森ニフティクラウドアップデート in クラウドごった煮@青森
ニフティクラウドアップデート in クラウドごった煮@青森
 
openQRM V5.1 Update
openQRM V5.1 UpdateopenQRM V5.1 Update
openQRM V5.1 Update
 
Lagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそばLagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそば
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3
 
20150715 xflow kikuta_final
20150715 xflow kikuta_final20150715 xflow kikuta_final
20150715 xflow kikuta_final
 
DPDKを拡張してみた話し
DPDKを拡張してみた話しDPDKを拡張してみた話し
DPDKを拡張してみた話し
 
第20回 OpenStack勉強会 Neutron Deep Dive - DVR
第20回 OpenStack勉強会 Neutron Deep Dive - DVR第20回 OpenStack勉強会 Neutron Deep Dive - DVR
第20回 OpenStack勉強会 Neutron Deep Dive - DVR
 
CONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 NetworkCONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 Network
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方
 

More from Yoshimasa Tanabe

Introduction to Apache ActiveMQ Artemis
Introduction to Apache ActiveMQ ArtemisIntroduction to Apache ActiveMQ Artemis
Introduction to Apache ActiveMQ Artemis
Yoshimasa Tanabe
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
 
WildFly Swarm In Progress
WildFly Swarm In ProgressWildFly Swarm In Progress
WildFly Swarm In Progress
Yoshimasa Tanabe
 
Introduction to WildFly Swarm #jjug
Introduction to WildFly Swarm #jjugIntroduction to WildFly Swarm #jjug
Introduction to WildFly Swarm #jjug
Yoshimasa Tanabe
 
Introduction to WildFly Swarm
Introduction to WildFly SwarmIntroduction to WildFly Swarm
Introduction to WildFly Swarm
Yoshimasa Tanabe
 
Introduction to Drools
Introduction to DroolsIntroduction to Drools
Introduction to Drools
Yoshimasa Tanabe
 
Keycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaKeycloak で SSO #渋谷java
Keycloak で SSO #渋谷java
Yoshimasa Tanabe
 
OpenShift のある生活
OpenShift のある生活OpenShift のある生活
OpenShift のある生活
Yoshimasa Tanabe
 

More from Yoshimasa Tanabe (8)

Introduction to Apache ActiveMQ Artemis
Introduction to Apache ActiveMQ ArtemisIntroduction to Apache ActiveMQ Artemis
Introduction to Apache ActiveMQ Artemis
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
WildFly Swarm In Progress
WildFly Swarm In ProgressWildFly Swarm In Progress
WildFly Swarm In Progress
 
Introduction to WildFly Swarm #jjug
Introduction to WildFly Swarm #jjugIntroduction to WildFly Swarm #jjug
Introduction to WildFly Swarm #jjug
 
Introduction to WildFly Swarm
Introduction to WildFly SwarmIntroduction to WildFly Swarm
Introduction to WildFly Swarm
 
Introduction to Drools
Introduction to DroolsIntroduction to Drools
Introduction to Drools
 
Keycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaKeycloak で SSO #渋谷java
Keycloak で SSO #渋谷java
 
OpenShift のある生活
OpenShift のある生活OpenShift のある生活
OpenShift のある生活
 

次世代Webコンテナ Undertowについて

  • 1. Copyright(c)2014 NTT Corp. All Rights Reserved. 1 次世代 Web コンテナ Undertow について 田邊 義真(NTT OSSセンタ ) 2014-06-25 JJUG ナイトセミナー「 WildFly 8ローンチ記念」
  • 2. Copyright(c)2014 NTT Corp. All Rights Reserved. 2 前提 ● 動作確認環境 – WildFly 8.1.0.Final ● Undertow 1.0.15.Final ● standalone モード – Fedora 20 – OpenJDK 8 ● 記述方法 – CLI 利用箇所は [CLI] と記述します – ターミナルは [Terminal] と記述します ● 検証内容 – 手元環境での簡易な負荷試験を実施
  • 3. Copyright(c)2014 NTT Corp. All Rights Reserved. 3 アジェンダ Undertowとは アーキテクチャ概要 設定ポイント Undertowいろいろ
  • 4. Copyright(c)2014 NTT Corp. All Rights Reserved. 4 Undertow とは
  • 5. Copyright(c)2014 NTT Corp. All Rights Reserved. 5 WildFly の Web/Servlet コンテナ Undertow は WildFly から導入された Web/Servlet コンテナです
  • 6. Copyright(c)2014 NTT Corp. All Rights Reserved. 6 Web/Servlet コンテナの歩み ● JBoss Web(AS7以前 ) – http://jbossweb.jboss.org – Tomcat ベース ● パフォーマンス強化 ● クラスタリングは別実装 ● その他いろいろとカスタマイズされている ● Undertow(WildFly から ) – http://undertow.io – スクラッチ ● 初コミットは 2012/07 。当初は Texugo という名称 ● 基盤は XNIO(NIO ラッパフレームワーク ) – http://xnio.jboss.org/
  • 7. Copyright(c)2014 NTT Corp. All Rights Reserved. 7 Undertow が生まれた背景 ● なぜ新しい Web サーバが必要なのか – Web の発展と共に Web サーバへ求められる機能が増加している ( これからも増え続ける ) 。 – 様々なユースケースに対応できる、柔軟性の高いサーバが欲しい ● 抽象化、使いやすさとカスタマイズ性を両立するために、 XNIO を採用 した。 XNIO は NIO のラッパーで、冗長さの排除とダイレクト I/O と OS とを統合する API といった低レイヤ I/O 層を提供するが、それ以上 は踏み込まない。また、後方互換性にも優れている。 – Undertow FAQ より ● http://undertow.io/documentation/faq.html – また、全体的にクラウド上での利用を強く意識しているように感 じます
  • 8. Copyright(c)2014 NTT Corp. All Rights Reserved. 8 特徴 1. 軽量 ● コア jar のサイズは 1.3MB 程度 ● ヒープサイズ 10MB 以下で起動 – ※ ごくごくシンプルな設定の場合で試行
  • 9. Copyright(c)2014 NTT Corp. All Rights Reserved. 9 特徴 2. 組込み可能 ● 従来の Web/Servlet コンテナとは違い、必要 なものを組み合わせて使うというアーキテクチ ャ ( 後述 ) により、アプリケーションに容易に 組み込み可能 – ※ 本資料の主な内容は、 WildFly の 1 サブシステ ムとしての利用を想定しています
  • 10. Copyright(c)2014 NTT Corp. All Rights Reserved. 10 特徴 3. Blocking/Non-blocking API ● Undertow はブロッキング / ノンブロッキング API 両方を提供する ● Servlet や WebSocket など、使う API によっ てブロッキングとノンブロッキングのどちらで 処理するか自動的に使い分けられる
  • 11. Copyright(c)2014 NTT Corp. All Rights Reserved. 11 特徴 4. HTTP Upgrade Support ● WebSocket 対応とリスンポート削減 – WebSocket(JSR356) 対応に HTTP Upgradeが必要 – EJB や JMS 等、独自プロトコルを利用するものを HTTP Upgrade 経由で接続することで、リスンポートが削減された。 – 1 筐体 /VM インスタンスに複数サーバが実行される PaaS 環境に 有効 $ ss ­anp | grep <as7­pid> tcp LISTEN 127.0.0.1:8080 <­ http tcp LISTEN 127.0.0.1:4447 <­ remoting tcp LISTEN 127.0.0.1:5445 <­ messaging tcp LISTEN 127.0.0.1:9990 <­ management­http tcp LISTEN 127.0.0.1:9999 <­ management­native $ ss ­anp | grep <wildfly­pid> tcp LISTEN 127.0.0.1:8080 tcp LISTEN 127.0.0.1:9990 ※ 出力内容は抜粋しています
  • 12. Copyright(c)2014 NTT Corp. All Rights Reserved. 12 アーキテクチャ概要
  • 13. Copyright(c)2014 NTT Corp. All Rights Reserved. 13 Undertow の構成要素 ● XNIO Worker ● リスナ ● ハンドラ
  • 14. Copyright(c)2014 NTT Corp. All Rights Reserved. 14 XNIO Worker ● IO スレッド ( リスナ ) とタスク ( 処理 ) のスレ ッドプールを管理
  • 15. Copyright(c)2014 NTT Corp. All Rights Reserved. 15 リスナ ● リクエストの受け付け、 HttpServerExchange という リクエスト / レスポンス情報を持つインスタンスへの変 換、クライアントへのレスポンスを担う ● HTTP, HTTPS, AJPが組込まれている – 今後 SPDY もサポートされる予定 ● IO スレッドと紐付いている ● 処理はタスクのスレッドにディスパッチする ● 利用 API によってタスク中の I/O 処理が切り替わる – Servlet: ブロッキング – WebSocket, Async Servlet:ノンブロッキング
  • 16. Copyright(c)2014 NTT Corp. All Rights Reserved. 16 ハンドラ ● 処理を行う単位 ● 複数のハンドラを登録し、チェーンさせること で全体としての処理を形成する
  • 17. Copyright(c)2014 NTT Corp. All Rights Reserved. 17 ハンドラチェーン 出典 : Entering Undertow Web server http://www.javacodegeeks.com/2014/01/entering-undertow-web-server.html
  • 18. Copyright(c)2014 NTT Corp. All Rights Reserved. 18 コード片からイメージをつかむ ● 組込み Undertow のコード例 ( ビルダ API) – “Hello World” を返すだけの http サーバ Undertow server = Undertow.builder()   .addHttpListener(8080, "localhost")   .setHandler(new HttpHandler() {     @Override     public void handleRequest(HttpServerExchange ex) throws Exception {       ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");       ex.getResponseSender().send("Hello World");     }   }).build(); server.start();
  • 19. Copyright(c)2014 NTT Corp. All Rights Reserved. 19 コード片からイメージをつかむ ● 組込み Undertow のコード例 ( ビルダ API) – “Hello World” を返すだけの http サーバ Undertow server = Undertow.builder()   .addHttpListener(8080, "localhost") <­ HTTP リスナのバインディング   .setHandler(new HttpHandler() {     @Override     public void handleRequest(HttpServerExchange ex) throws Exception {       ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");       ex.getResponseSender().send("Hello World");     }   }).build(); server.start();
  • 20. Copyright(c)2014 NTT Corp. All Rights Reserved. 20 コード片からイメージをつかむ ● 組込み Undertow のコード例 ( ビルダ API) – “Hello World” を返すだけの http サーバ Undertow server = Undertow.builder()   .addHttpListener(8080, "localhost")   .setHandler(new HttpHandler() { <­  ハンドラ ( 処理内容 )     @Override     public void handleRequest(HttpServerExchange ex) throws Exception {       ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");       ex.getResponseSender().send("Hello World");     }   }).build(); server.start();
  • 21. Copyright(c)2014 NTT Corp. All Rights Reserved. 21 コード片からイメージをつかむ ● 組込み Undertow のコード例 ( ビルダ API) – “Hello World” を返すだけの http サーバ Undertow server = Undertow.builder()   .addHttpListener(8080, "localhost") <­ HTTP リスナ   .setHandler(new HttpHandler() {     @Override     public void handleRequest(HttpServerExchange ex) throws Exception {       ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");       ex.getResponseSender().send("Hello World");     }   }).build(); server.start(); リクエスト / レスポンス情報
  • 22. Copyright(c)2014 NTT Corp. All Rights Reserved. 22 コード片からイメージをつかむ ● 組込み Undertow のコード例 ( ビルダ API) – “Hello World” を返すだけの http サーバ Undertow server = Undertow.builder()   .addHttpListener(8080, "localhost")   .setHandler(new HttpHandler() {     @Override     public void handleRequest(HttpServerExchange ex) throws Exception {       ex.getResponseHeaders().put(CONTENT_TYPE, "text/plain");       ex.getResponseSender().send("Hello World");     }   }).build(); server.start(); <­  ビルド情報をもとにサーバ起動
  • 23. Copyright(c)2014 NTT Corp. All Rights Reserved. 23 コード片からイメージをつかむ ● ハンドラチェーンの例 public interface HttpHandler {   void handleRequest(HttpServerExchange exchange) throws Exception; } public clss MyHandler implements HttpHandler {   private final HttpHandler next; <­  次のハンドラ。コンストラクタで設定   @Override   public void handleRequest(HttpServerExchange ex) throws Exception {     //  何らかの処理     next.handleRequest(ex); <­  次のハンドラの処理を実行   } }
  • 24. Copyright(c)2014 NTT Corp. All Rights Reserved. 24 ハンドラの集合 ● Undertow はハンドラの集合であり、一般的な コンテナのイメージとは違います ● WildFly の中で Undertow を使う場 合、 Web/Servlet コンテナとして動作するの に必要なハンドラが適切に設定されて起動され るため、普段は意識する必要はありません
  • 25. Copyright(c)2014 NTT Corp. All Rights Reserved. 25 設定ポイント
  • 26. Copyright(c)2014 NTT Corp. All Rights Reserved. 26 設定ポイント ... の前に
  • 27. Copyright(c)2014 NTT Corp. All Rights Reserved. 27 その前に ... 設定方法 ● AS7 からシンプルに – AS6 以前 ● 設定ファイル : 各所に分散 ● 設定方法 : 基本的に xml 直接編集 – AS7 から ● 設定ファイル : 一箇所 (standalone*.xml) に集約 ● 設定方法 : インターフェースが強化されました ● 設定方法あれこれ – CLI – Web コンソール – 設定ファイル (standalone*.xml) 直接編集
  • 28. Copyright(c)2014 NTT Corp. All Rights Reserved. 28 設定方法 1. CLI ● 慣れてきたら CLI がおすすめ – 慣れるまで少々練習を要するかも ( 個人の感想 ) ● タブ補完が利く ● スクリプト化して再利用がしやすい [Terminal] $ cd <WILDFLY_HOME>/bin $ ./standalone.sh   <­ WildFly の起動 $ ./jboss­cli.sh ­c <­ CLI の起動 [CLI] [standalone@localhost:9990 /] <­  プロンプトが変わる ※ 以降ではプロンプトは省略いたします
  • 29. Copyright(c)2014 NTT Corp. All Rights Reserved. 29 設定方法 1. CLI [CLI] ls ­l / <­  管理リソース一覧をルート※から表示 ATTRIBUTE                VALUE       TYPE    [...] release­version          8.1.0.Final STRING  [...] CHILD                MIN­OCCURS MAX­OCCURS  core­service         n/a        n/a         deployment           n/a        n/a         deployment­overlay   n/a        n/a         extension            n/a        n/a         interface            n/a        n/a         path                 n/a        n/a         socket­binding­group n/a        n/a         subsystem            n/a        n/a         system­property      n/a        n/a  ※ 管理リソースはツリー構造になっています
  • 30. Copyright(c)2014 NTT Corp. All Rights Reserved. 30 設定方法 2. Webコンソール ● GUI(Web ブラウザ ) 上の操作のため直感的 – おおまかに何が設定できるのかを確認するときにも おすすめ ● ただし、設定できない項目もある – CLI は全ての項目が設定可能 [Terminal] $ cd <WILDFLY_HOME>/bin $ ./add­user.sh     <­  管理ユーザ (Management User)を作成しておく $ ./standalone.sh   <­ WildFly の起動 ブラウザで以下 URI にアクセス http://localhost:9990
  • 31. Copyright(c)2014 NTT Corp. All Rights Reserved. 31 設定方法 2. Webコンソール
  • 32. Copyright(c)2014 NTT Corp. All Rights Reserved. 32 設定方法 3. standalone*.xml 直接編集 ● 非推奨 ● タイポやコピペミスによる設定不備が起きがち ● 何をしたか記録に残らない – CLI, Webコンソールで行った設定は以下に記録 ● <WILDFLY_HOME>/standalone/configuration/standalone_xml_history ● デフォルト値で設定されている項目はほとんど 表示されない ● CLI での管理リソースのデータ構造と xml スキ ーマは完全一致していない
  • 33. Copyright(c)2014 NTT Corp. All Rights Reserved. 33 設定方法 3. standalone*.xml 直接編集 ● とはいうものの、全体の構成をつかむために眺 めておくのも有用です server    ├ extensions    ├ management    ├ profile    ├ interfaces    └ socket­binding­group ※ その他、必要に応じて path や deployments 属性が追加される
  • 34. Copyright(c)2014 NTT Corp. All Rights Reserved. 34 気を取り直して設定ポイント
  • 35. Copyright(c)2014 NTT Corp. All Rights Reserved. 35 io サブシステム
  • 36. Copyright(c)2014 NTT Corp. All Rights Reserved. 36 io サブシステム ● Undertow は /subsystem=io に依存 – リスナ ( 後述 ) が下記 2 項目を参照しており、性能 面での実質的なチューニングポイントになる可能性 が高い ● Workers ● Buffer Pool
  • 37. Copyright(c)2014 NTT Corp. All Rights Reserved. 37 io サブシステム ● Workers( 緑字はチューニング検討項目 ) – Stack size: スレッドのスタックサイズ。デフォルト 0(= 指 定しない ) – Task keepalive: 同一クライアントからのリクエストに対す るコネクションを何秒維持するか。デフォルト 60 秒 – IO threads: リクエストを受け付けるスレッドの数 – Task max threads: IOスレッドからディスパッチされるタ スクスレッドの最大数 – Task core threads: タスクスレッドの最小数 ( デフォルト 2) ● 無効なパラメータの可能性あり。 xml スキーマ中に存在しない = 永 続化されない , XNIO中で無視されている ?
  • 38. Copyright(c)2014 NTT Corp. All Rights Reserved. 38 io サブシステム ● IO threads – リクエストを受け付けるスレッドの数。ノンブロッ キングな処理を行う – デフォルト : 利用可能 CPU 数 *2
  • 39. Copyright(c)2014 NTT Corp. All Rights Reserved. 39 io サブシステム ● Task max threads – IO スレッドからディスパッチされるタスクスレッ ドの最大数。 Servlet などはブロッキングされる – デフォルト : 利用可能 CPU 数 *16
  • 40. Copyright(c)2014 NTT Corp. All Rights Reserved. 40 io サブシステム ● IO threadsと Task max threads – チューニングではこの 2 オプションがキー – サーブレットを使った簡易な検証では、 Task max threads の変更に効果がみられました ● 実際にタスク ( ブロッキング処理含む ) を実行するスレッ ドなので、 CPU リソースに見合った数を用意するべきと 考えます – IO threadsで実行する処理はノンブロッキングで あることも考えると、 IO threadsは相当な高負荷 である場合チューニングを検討するといったパラメ ータかもしれません
  • 41. Copyright(c)2014 NTT Corp. All Rights Reserved. 41 io サブシステム ● Buffer Pool(以下デフォルト値 ) – Buffer Size: 16KB ● バッファサイズ。一般的に 1 回の write() 呼び出しで送 られるサイズが 16KB なのでこの値は最適 – Buffer Per Slice: 20 ● バッファの分割数。大きなバッファを分割して操作し、 バッファ全体を処理する際のオーバヘッドを回避しま す。 – Direct Buffers: true ● バッファをダイレクトバッファとして利用するか ※ 上記デフォルト値は利用可能なヒープサイズが 128MB 以上の時の値です。
  • 42. Copyright(c)2014 NTT Corp. All Rights Reserved. 42 undertow サブシステム ● /subsystem=undertow – buffer-cache – server – servlet-container – configuration – error-page
  • 43. Copyright(c)2014 NTT Corp. All Rights Reserved. 43 undertow サブシステム ● Buffer Cache – 静的ファイルなどのキャッシュに利用 – 全体の容量は以下 ● buffer-size * buffers-per-region * max-regions – 以下、デフォルト値 ● buffer-size: 1024 ● buffers-per-region: 1024 ● max-regions: 10
  • 44. Copyright(c)2014 NTT Corp. All Rights Reserved. 44 undertow サブシステム ● Server – Undertow 全体の設定 ● リスナ ● ホスト – 設定したハンドラやフィルタをひもづける ( 後述 )
  • 45. Copyright(c)2014 NTT Corp. All Rights Reserved. 45 undertow サブシステム ● Server -> Listener – リクエストの受け付け、レスポンス処理 CLI でリスナの設定を確認する --------------------------------------------- [CLI] cd /subsystem=undertow/server=default­server/http­listener=default :read­resource {     "outcome" => "success",     "result" => {         [...]         "buffer­pool" => "default", (1)         [...]         "record­request­start­time" => true,         [...]         "worker" => "default" (2)     } } (1)(2) ioサブシステムで定義したものを参照
  • 46. Copyright(c)2014 NTT Corp. All Rights Reserved. 46 undertow サブシステム ● Server -> Listener – リクエストの受け付け、レスポンス処理 [Tips]CLI でリスナの設定を変更する ----------------------------------------------------- [CLI] cd /subsystem=undertow/server=default­server/http­listener=default :write­attribute(name=record­request­start­time,value=true) {     "outcome" => "success",     "response­headers" => {         "operation­requires­reload" => true,         "process­state" => "reload­required"     } } /:reload リロードが必要なものの場合表示される
  • 47. Copyright(c)2014 NTT Corp. All Rights Reserved. 47 undertow サブシステム ● Server -> Listener – リクエストの受け付け、レスポンス処理 [Tips] 設定項目の内容 ( 型、説明、デフォルト値など ) を確認する ----------------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/server=default­server/http­listener=default :read­resource­description {     "outcome" => "success",     "result" => {         "description" => "http listener",         "access­constraints" => [...]         "attributes" => {             "record­request­start­time" => {                 "type" => BOOLEAN,                 "description" => “If this is true then ...”             }         }     } }
  • 48. Copyright(c)2014 NTT Corp. All Rights Reserved. 48 undertow サブシステム ● Server -> Listener – リクエストの受け付け、レスポンス処理 [Tips]CLI の出力をリダイレクトする ( 内容が多く標準出力では見えづらい場合など ) ----------------------------------------------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/server=default­server/http­listener=default :read­resource­description > /tmp/http­listener­description [Terminal] $ cat /tmp/http­listener­description {     "outcome" => "success",     "result" => {         "description" => "http listener",         [...]
  • 49. Copyright(c)2014 NTT Corp. All Rights Reserved. 49 undertow サブシステム ● Servlet Container – Servlet コンテナ設定 CLI で Servlet コンテナの設定を確認する ---------------------------------------------------------- [CLI] cd /subsystem=undertow/servlet­container=default :read­resource {     "outcome" => "success",     "result" => {         "allow­non­standard­wrappers" => false,         "default­buffer­cache" => "default",         [...]         "use­listener­encoding" => false,         "setting" => {"jsp" => undefined}     } }
  • 50. Copyright(c)2014 NTT Corp. All Rights Reserved. 50 undertow サブシステム ● Servlet Container – Servlet コンテナ設定 [Tips] 子要素 (setting -> jsp の設定も見たい場合 ------------------------------------------------------------------------ [CLI] cd /subsystem=undertow/servlet­container=default :read­resource(recursive=true) {     "outcome" => "success",     "result" => {         [...]         "setting" => {"jsp" => {             "check­interval" => 0,             [...]         }}     } }
  • 51. Copyright(c)2014 NTT Corp. All Rights Reserved. 51 undertow サブシステム ● Servlet Container – Servlet コンテナ設定 [Tips] :read-resource-descriptionも再帰的に確認できる ---------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/servlet­container=default :read­resource­description(recursive=true) {     "outcome" => "success",         [...]         "children" => {"setting" => {             "description" => "The servlet container settings",             "model­description" => {                 "jsp" => {        }
  • 52. Copyright(c)2014 NTT Corp. All Rights Reserved. 52 アクセスログ ● デフォルトでは出力されない [CLI] cd /subsystem=undertow/server=default­server/http­listener=default :write­attribute(name=record­request­start­time,value=true) cd /subsystem=undertow/server=default­server/host=default­host/setting ./access­log:add(prefix=access,pattern="%t,%a,%m,%U,%s,%D") /:reload レスポンスタイムを出すのに必要 ( デフォルト false) [Console] $ cat <WILDFLY_HOME>/standalone/log/access.log 25/Jun/2014:20:00:00 +0900,127.0.0.1,GET,/,200,12 pettern に設定できる値は以下クラスの javadoc から確認できます。 io.undertow.server.handlers.accesslog.AccessLogHanlder [Github]http://bit.ly/1jHlGs3
  • 53. Copyright(c)2014 NTT Corp. All Rights Reserved. 53 ルートコンテキストの変更 ● 任意のアプリケーションを http://<yourdomain>/ でアクセ スさせるためには以下の 2 ステップが必要 – welcome-content への参照 (File ハンドラ ) を削除 – アプリケーション中に WEB-INF/jboss-web.xml を作成する [CLI] cd /subsystem=undertow/server=default­server/host=default­host ./location="/":remove [ 以下内容の WEB­INF/jboss­web.xml を作成 ] <?xml version="1.0" encoding="UTF­8"?> <jboss­web>   <context­root>/</context­root> </jboss­web>
  • 54. Copyright(c)2014 NTT Corp. All Rights Reserved. 54 Session Cookie ● WildFlyではグローバルなクッキー設定が可能 – comment – domain – http-only – max-age – name – secure 例 : クッキー設定を有効化し、クッキー名の変更と http-only 属性を設定する ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [CLI] cd /subsystem=undertow/servlet­container=default/setting ./session­cookie:add(name=MYCOOKIE,http­only=true) /:reload
  • 55. Copyright(c)2014 NTT Corp. All Rights Reserved. 55 Single Sign On ● 1 度の認証処理で複数の Web アプリケーショ ンの認証を行う ルート (/) を指定することで、全てのアプリケーションを SSO 対象にする。 “JSESSIONIDSSO” というクッキーを共有することで実現している ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [CLI] cd /subsystem=undertow/server=default­server/host=default­host/setting ./single­sign­on:add(path="/") /:reload
  • 56. Copyright(c)2014 NTT Corp. All Rights Reserved. 56 Persistent Sessions ● セッションをファイルに永続化 <WILDFLY_HOME>/standalone/data/persistent-web-session に格納する場合 ※path を指定しない場合、セッションはメモリに格納される ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [CLI] cd /subsystem=undertow/servlet­container=default/setting ./persistent­sessions:add(path=persistent­web­sessions,                           relative­to=jboss.server.data.dir) /:reload relative-to に組込システムプロパティを指定し、 <WILDFLY_HOME>/standalone/data を起点にしている
  • 57. Copyright(c)2014 NTT Corp. All Rights Reserved. 57 組込 Handler と Filter ● ポータビリティとの兼ね合いを判断して利用 ● Handler: 特定のリクエストパスに対して適用 – file – reverse-proxy ● Filter: リクエスト全体に対して適用※ – basic-auth – connection-limit – gzip – response-header ※Handler と組み合わせれば特定パスに適用可 ( 後述 )
  • 58. Copyright(c)2014 NTT Corp. All Rights Reserved. 58 File ハンドラ ● httpd でのエイリアス相当 http://localhost:8080/img/<file-path> で /var/images/<file-path> にアクセス --------------------------------------------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/configuration=handler/file ./images:add(path=/var/images) cd /subsystem=undertow/server=default­server/host=default­host/location ./"/img":add(handler=images) /:reload
  • 59. Copyright(c)2014 NTT Corp. All Rights Reserved. 59 Reverse Proxyハンドラ ● WildFly をリバースプロキシとして利用可能 host に設定した (1)(2) にラウンドロビンで振り分けられる ----------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/configuration=handler/reverse­proxy ./my­reverse­proxy:add cd ./my­reverse­proxy ./host=”http://192.168.0.20:8080/my­app”:add <­ (1) ./host=”ajp://192.168.0.30:8009/my­app”:add  <­ (2)ajp も可 cd /subsystem=undertow/server=default­server/host=default­host/location ./"/my­app":add(handler=my­reverse­proxy) /:reload
  • 60. Copyright(c)2014 NTT Corp. All Rights Reserved. 60 Basic Authフィルタ ● ベーシック認証フィルタ – 2014-06-25 現在、適切に動作しません ● https://issues.jboss.org/browse/WFLY-3342 指定した security domainによるベーシック認証フィルタ ----------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/configuration=filter/connection­limit ./my­auth:add(security­domain=other) <­ ※other は最初から用意されている cd /subsystem=undertow/server=default­server/host=default­host/filter­ref ./my­auth:add /:reload
  • 61. Copyright(c)2014 NTT Corp. All Rights Reserved. 61 Connection Limitフィルタ ● 同時接続数を制限 同時接続数と待ちキュー ( バックログ ) を設定できる ------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/configuration=filter/connection­limit ./my­connection­limit:add(max­concurrent­requests=100,queue­size=5) cd /subsystem=undertow/server=default­server/host=default­host/filter­ref ./my­connection­limit:add /:reload HTTP リクエスト単位で制御したい場合やポータビリティが気になる場合は、 Servlet フィルタや JAX-RS フィルタを作成しましょう [ 参考 ] Tomcat や JBoss で HTTP リクエスト単位で並行実行数を制限するサーブレットフィルタ http://nekop.hatenablog.com/entry/20120424/1335254637
  • 62. Copyright(c)2014 NTT Corp. All Rights Reserved. 62 gzip フィルタ ● リソース gzip 圧縮 predicate で対象を指定する (gzip に限らず、フィルタは全てこの属性を持つ ) ------------------------------------------------------------------------------------------------------------- [CLI] cd /subsystem=undertow/configuration=filter/gzip ./my­gzip:add cd /subsystem=undertow/server=default­server/host=default­host/filter­ref ./my­gzip:add(predicate="path­suffix['.css'] or path­suffix['.js']") /:reload ● 通常 WildFly の前段に設置したリバースプロキシで設定すると思われるので、あまり利 用することはないかも ... 考えられるとしたら以下のようなパターン ? ● リバースプロキシ -WildFly 間の N/W 帯域を節約したい場合 ● リバースプロキシに CPU をあまり使わせたくない場合 ● WildFly がクライアントから直接リクエストを受ける場合
  • 63. Copyright(c)2014 NTT Corp. All Rights Reserved. 63 Response Header フィルタ ● 任意のレスポンスヘッダを追加 [CLI] cd /subsystem=undertow/configuration=filter/response­header ./my­header:add(header­name=My­Header,header­value=My­Header­Value) cd /subsystem=undertow/server=default­server/host=default­host/filter­ref ./my­header:add /:reload
  • 64. Copyright(c)2014 NTT Corp. All Rights Reserved. 64 Response Header フィルタ ● デフォルトで設定されているヘッダを削除 [CLI] cd /subsystem=undertow/server=default­server/host=default­host/filter­ref ./server­header:remove ./x­powered­by­header:remove /:reload
  • 65. Copyright(c)2014 NTT Corp. All Rights Reserved. 65 ハンドラとフィルタの組み合わせ ● 特定のパスにのみ有効なフィルタ 特定パスのみヘッダを設定する例 ( 前述の /img と my-header を利用 ) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [CLI] cd /subsystem=undertow/server=default­server/host=default­host/location ./"/img"/filter­ref=my­header:add
  • 66. Copyright(c)2014 NTT Corp. All Rights Reserved. 66 その他機能 ● error-page – 未実装 ? 調査中 ...
  • 67. Copyright(c)2014 NTT Corp. All Rights Reserved. 67 Undertow いろいろ
  • 68. Copyright(c)2014 NTT Corp. All Rights Reserved. 68 Undertow いろいろ ● Spring Boot Starter Undertow – https://github.com/isopov/spring-boot-starter-undertow – 組込み Web サーバは ...Jetty? Tomcat? Undertow! ● Hammock – https://github.com/johnament/hammock – RESTEasy + Weld + Undertow! ● undertow-dev メーリングリストにて – Undertow をリバースプロキシとして使いたい – などなど 単体でも注目度が高くなってきている
  • 69. Copyright(c)2014 NTT Corp. All Rights Reserved. 69 最後に ● Web はこれからも進化し、企業にとってもます ます重要なものとなります ● Undertow はモダン Web に追従するべく作られ ました。また、従来のアプリケーションに対して も申し分のないパフォーマンスを発揮するポテン シャルを持っています。 ● とはいえ開発からまだ 2 年。ぜひ応援を ! – 機能不足やバグ報告があれば要望、さらには PR! ● 微力ながら私もアクセスログにおける機能追加案を投稿し ました
  • 70. Copyright(c)2014 NTT Corp. All Rights Reserved. 70 参考 ● 公式サイト – http://undertow.io/ ● WildFly ドキュメント – https://docs.jboss.org/author/display/WFLY8/Unde rtow+(web)+subsystem+configuration ● WildFly 8 Administration Guide – http://www.itbuzzpress.com/ebooks/wildfly-8-book.h tml ● Dive Into WildFly 8 – 30:15~ からスペックリードによる Undertow の説明 – http://vimeo.com/79890483
  • 71. Copyright(c)2014 NTT Corp. All Rights Reserved. 71 参考 ● メーリングリスト – https://lists.jboss.org/mailman/listinfo/underto w-dev ● JIRA – https://issues.jboss.org/browse/UNDERTOW/
  • 72. Copyright(c)2014 NTT Corp. All Rights Reserved. 72 参考 ● Undertow のソースツリーを眺める - nekop の日記 – http://d.hatena.ne.jp/nekop/20131224/1387938098 ● Experiences with migrating from JBoss AS 7 to WildFly 8.1 – JBoss Web -> Undertowの Tips も載っています – http://jdevelopment.nl/experiences-migrating-jboss-7-wildfly- 81/ ● JBoss Enterprise Application Platform 6 構築・運用パーフ ェクトガイド – JBoss EAP 6 向けですが、 WildFly 利用時でもほとんどの内容 を踏襲できるので、初めて触る方にもおすすめです – http://gihyo.jp/book/2013/978-4-7741-5794-8