次世代webコンテナ undertowについて

72
Copyright(c)2014 NTT Corp. All Rights Reserved. 1 次世代 Web コンテナ Undertow について 田邊 義真(NTT OSSセンタ ) 2014-06-25 JJUG ナイトセミナー「 WildFly 8ローンチ記念」

Upload: yoshimasa-tanabe

Post on 18-Dec-2014

5.062 views

Category:

Software


3 download

DESCRIPTION

2014-06-25(水) JJUGナイトセミナー「WildFly 8ローンチ記念」の発表資料です。

TRANSCRIPT

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 1

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

田邊 義真(NTT OSSセンタ )

2014-06-25JJUGナイトセミナー「 WildFly 8ローンチ記念」

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

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]と記述します

● 検証内容– 手元環境での簡易な負荷試験を実施

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 3

アジェンダ

Undertowとは

アーキテクチャ概要

設定ポイント

Undertowいろいろ

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 4

Undertow とは

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 5

WildFly のWeb/Servlet コンテナ

Undertow は

WildFly から導入された

Web/Servlet コンテナです

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

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/

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

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

– また、全体的にクラウド上での利用を強く意識しているように感じます

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 8

特徴 1. 軽量

● コア jarのサイズは1.3MB程度● ヒープサイズ10MB以下で起動

– ※ごくごくシンプルな設定の場合で試行

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 9

特徴 2. 組込み可能

● 従来のWeb/Servletコンテナとは違い、必要なものを組み合わせて使うというアーキテクチャ(後述 )により、アプリケーションに容易に組み込み可能– ※本資料の主な内容は、WildFlyの1サブシステムとしての利用を想定しています

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 10

特徴 3. Blocking/Non-blocking API

● Undertowはブロッキング/ノンブロッキングAPI両方を提供する

● ServletやWebSocketなど、使うAPIによってブロッキングとノンブロッキングのどちらで処理するか自動的に使い分けられる

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

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 <­ httptcp LISTEN 127.0.0.1:4447 <­ remotingtcp LISTEN 127.0.0.1:5445 <­ messagingtcp LISTEN 127.0.0.1:9990 <­ management­httptcp LISTEN 127.0.0.1:9999 <­ management­native

$ ss ­anp | grep <wildfly­pid>tcp LISTEN 127.0.0.1:8080tcp LISTEN 127.0.0.1:9990

※出力内容は抜粋しています

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 12

アーキテクチャ概要

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 13

Undertow の構成要素

● XNIO Worker● リスナ● ハンドラ

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 14

XNIO Worker

● IOスレッド (リスナ )とタスク (処理 )のスレッドプールを管理

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 15

リスナ

● リクエストの受け付け、HttpServerExchangeというリクエスト/レスポンス情報を持つインスタンスへの変換、クライアントへのレスポンスを担う

● HTTP, HTTPS, AJPが組込まれている– 今後SPDYもサポートされる予定

● IOスレッドと紐付いている● 処理はタスクのスレッドにディスパッチする● 利用APIによってタスク中のI/O処理が切り替わる

– Servlet:ブロッキング– WebSocket, Async Servlet:ノンブロッキング

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 16

ハンドラ

● 処理を行う単位● 複数のハンドラを登録し、チェーンさせることで全体としての処理を形成する

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 17

ハンドラチェーン

出典 : Entering Undertow Web server http://www.javacodegeeks.com/2014/01/entering-undertow-web-server.html

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

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();

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

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();

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

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();

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

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();

リクエスト/レスポンス情報

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

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(); <­ ビルド情報をもとにサーバ起動

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

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); <­ 次のハンドラの処理を実行  }

}

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 24

ハンドラの集合

● Undertowはハンドラの集合であり、一般的なコンテナのイメージとは違います

● WildFlyの中でUndertowを使う場合、Web/Servletコンテナとして動作するのに必要なハンドラが適切に設定されて起動されるため、普段は意識する必要はありません

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 25

設定ポイント

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 26

設定ポイント ... の前に

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 27

その前に ... 設定方法

● AS7からシンプルに– AS6以前

● 設定ファイル: 各所に分散● 設定方法: 基本的にxml直接編集

– AS7から● 設定ファイル: 一箇所(standalone*.xml)に集約● 設定方法: インターフェースが強化されました

● 設定方法あれこれ– CLI– Webコンソール– 設定ファイル(standalone*.xml)直接編集

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

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 /] <­ プロンプトが変わる

※以降ではプロンプトは省略いたします

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

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 

※管理リソースはツリー構造になっています

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

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

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 31

設定方法 2. Webコンソール

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 32

設定方法 3. standalone*.xml直接編集

● 非推奨● タイポやコピペミスによる設定不備が起きがち● 何をしたか記録に残らない

– CLI, Webコンソールで行った設定は以下に記録● <WILDFLY_HOME>/standalone/configuration/standalone_xml_history

● デフォルト値で設定されている項目はほとんど表示されない

● CLIでの管理リソースのデータ構造とxmlスキーマは完全一致していない

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 33

設定方法 3. standalone*.xml直接編集

● とはいうものの、全体の構成をつかむために眺めておくのも有用です

server   ├ extensions   ├ management   ├ profile   ├ interfaces   └ socket­binding­group

※その他、必要に応じてpathやdeployments属性が追加される

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 34

気を取り直して設定ポイント

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 35

io サブシステム

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 36

io サブシステム

● Undertow は /subsystem=io に依存– リスナ(後述 )が下記2項目を参照しており、性能面での実質的なチューニングポイントになる可能性が高い

● Workers● Buffer Pool

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

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中で無視されている ?

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 38

io サブシステム

● IO threads– リクエストを受け付けるスレッドの数。ノンブロッキングな処理を行う

– デフォルト :利用可能CPU数 *2

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 39

io サブシステム

● Task max threads– IOスレッドからディスパッチされるタスクスレッドの最大数。Servletなどはブロッキングされる

– デフォルト : 利用可能CPU数 *16

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 40

io サブシステム

● IO threadsと Task max threads– チューニングではこの2オプションがキー– サーブレットを使った簡易な検証では、Task max threadsの変更に効果がみられました

● 実際にタスク(ブロッキング処理含む )を実行するスレッドなので、CPUリソースに見合った数を用意するべきと考えます

– IO threadsで実行する処理はノンブロッキングであることも考えると、IO threadsは相当な高負荷である場合チューニングを検討するといったパラメータかもしれません

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

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以上の時の値です。

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 42

undertow サブシステム

● /subsystem=undertow– buffer-cache– server– servlet-container– configuration– error-page

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

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

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 44

undertow サブシステム

● Server– Undertow全体の設定

● リスナ● ホスト

– 設定したハンドラやフィルタをひもづける (後述 )

Page 45: 次世代Webコンテナ 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サブシステムで定義したものを参照

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

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

リロードが必要なものの場合表示される

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

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 ...”            }        }    }}

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

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",        [...]

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

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}    }}

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

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,            [...]        }}    }}

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

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" => {       

}

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

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.log25/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

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

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>

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

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

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

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

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

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を起点にしている

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 57

組込Handler と Filter

● ポータビリティとの兼ね合いを判断して利用● Handler: 特定のリクエストパスに対して適用

– file– reverse-proxy

● Filter: リクエスト全体に対して適用※– basic-auth– connection-limit– gzip– response-header

※Handler と組み合わせれば特定パスに適用可 ( 後述 )

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

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

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

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

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

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

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

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

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

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がクライアントから直接リクエストを受ける場合

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

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

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

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

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

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

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 66

その他機能

● error-page– 未実装 ? 調査中 ...

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 67

Undertow いろいろ

Page 68: 次世代Webコンテナ 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をリバースプロキシとして使いたい– などなど

単体でも注目度が高くなってきている

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 69

最後に

● Webはこれからも進化し、企業にとってもますます重要なものとなります

● UndertowはモダンWebに追従するべく作られました。また、従来のアプリケーションに対しても申し分のないパフォーマンスを発揮するポテンシャルを持っています。

● とはいえ開発からまだ 2年。ぜひ応援を !– 機能不足やバグ報告があれば要望、さらにはPR!

● 微力ながら私もアクセスログにおける機能追加案を投稿しました

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 70

参考

● 公式サイト– http://undertow.io/

● WildFly ドキュメント– https://docs.jboss.org/author/display/WFLY8/Undertow+(web)+subsystem+configuration

● WildFly 8 Administration Guide– http://www.itbuzzpress.com/ebooks/wildfly-8-book.html

● Dive Into WildFly 8– 30:15~からスペックリードによるUndertowの説明– http://vimeo.com/79890483

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

Copyright(c)2014 NTT Corp. All Rights Reserved. 71

参考

● メーリングリスト– https://lists.jboss.org/mailman/listinfo/undertow-dev

● JIRA– https://issues.jboss.org/browse/UNDERTOW/

Page 72: 次世代Webコンテナ 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