次世代webコンテナ undertowについて
DESCRIPTION
2014-06-25(水) JJUGナイトセミナー「WildFly 8ローンチ記念」の発表資料です。TRANSCRIPT
Copyright(c)2014 NTT Corp. All Rights Reserved. 1
次世代Web コンテナ Undertow について
田邊 義真(NTT OSSセンタ )
2014-06-25JJUGナイトセミナー「 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 <as7pid>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 < managementhttptcp LISTEN 127.0.0.1:9999 < managementnative
$ ss anp | grep <wildflypid>tcp LISTEN 127.0.0.1:8080tcp 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 の起動$ ./jbosscli.sh c < CLI の起動
[CLI][standalone@localhost:9990 /] < プロンプトが変わる
※以降ではプロンプトは省略いたします
Copyright(c)2014 NTT Corp. All Rights Reserved. 29
設定方法 1. CLI
[CLI]ls l / < 管理リソース一覧をルート※から表示ATTRIBUTE VALUE TYPE [...]releaseversion 8.1.0.Final STRING [...]
CHILD MINOCCURS MAXOCCURS coreservice n/a n/a deployment n/a n/a deploymentoverlay n/a n/a extension n/a n/a interface n/a n/a path n/a n/a socketbindinggroup n/a n/a subsystem n/a n/a systemproperty n/a n/a
※管理リソースはツリー構造になっています
Copyright(c)2014 NTT Corp. All Rights Reserved. 30
設定方法 2. Webコンソール
● GUI(Webブラウザ )上の操作のため直感的– おおまかに何が設定できるのかを確認するときにもおすすめ
● ただし、設定できない項目もある– CLIは全ての項目が設定可能
[Terminal]$ cd <WILDFLY_HOME>/bin$ ./adduser.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 └ socketbindinggroup
※その他、必要に応じて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=defaultserver/httplistener=default:readresource{ "outcome" => "success", "result" => { [...] "bufferpool" => "default", (1) [...] "recordrequeststarttime" => 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=defaultserver/httplistener=default:writeattribute(name=recordrequeststarttime,value=true){ "outcome" => "success", "responseheaders" => { "operationrequiresreload" => true, "processstate" => "reloadrequired" }}
/:reload
リロードが必要なものの場合表示される
Copyright(c)2014 NTT Corp. All Rights Reserved. 47
undertow サブシステム
● Server -> Listener– リクエストの受け付け、レスポンス処理
[Tips]設定項目の内容(型、説明、デフォルト値など )を確認する-----------------------------------------------------------------------------------------[CLI]cd /subsystem=undertow/server=defaultserver/httplistener=default:readresourcedescription{ "outcome" => "success", "result" => { "description" => "http listener", "accessconstraints" => [...] "attributes" => { "recordrequeststarttime" => { "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=defaultserver/httplistener=default:readresourcedescription > /tmp/httplistenerdescription
[Terminal]$ cat /tmp/httplistenerdescription{ "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/servletcontainer=default:readresource{ "outcome" => "success", "result" => { "allownonstandardwrappers" => false, "defaultbuffercache" => "default", [...] "uselistenerencoding" => false, "setting" => {"jsp" => undefined} }}
Copyright(c)2014 NTT Corp. All Rights Reserved. 50
undertow サブシステム
● Servlet Container– Servletコンテナ設定
[Tips]子要素 (setting -> jsp の設定も見たい場合------------------------------------------------------------------------[CLI]cd /subsystem=undertow/servletcontainer=default:readresource(recursive=true){ "outcome" => "success", "result" => { [...] "setting" => {"jsp" => { "checkinterval" => 0, [...] }} }}
Copyright(c)2014 NTT Corp. All Rights Reserved. 51
undertow サブシステム
● Servlet Container– Servletコンテナ設定
[Tips] :read-resource-descriptionも再帰的に確認できる----------------------------------------------------------------------------------[CLI]cd /subsystem=undertow/servletcontainer=default:readresourcedescription(recursive=true){ "outcome" => "success", [...] "children" => {"setting" => { "description" => "The servlet container settings", "modeldescription" => { "jsp" => {
}
Copyright(c)2014 NTT Corp. All Rights Reserved. 52
アクセスログ
● デフォルトでは出力されない[CLI]cd /subsystem=undertow/server=defaultserver/httplistener=default:writeattribute(name=recordrequeststarttime,value=true)
cd /subsystem=undertow/server=defaultserver/host=defaulthost/setting./accesslog: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
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=defaultserver/host=defaulthost./location="/":remove
[ 以下内容の WEBINF/jbossweb.xmlを作成 ]<?xml version="1.0" encoding="UTF8"?><jbossweb> <contextroot>/</contextroot></jbossweb>
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/servletcontainer=default/setting./sessioncookie:add(name=MYCOOKIE,httponly=true)
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 55
Single Sign On
● 1度の認証処理で複数のWebアプリケーションの認証を行う
ルート (/) を指定することで、全てのアプリケーションをSSO対象にする。“JSESSIONIDSSO”というクッキーを共有することで実現している[CLI]cd /subsystem=undertow/server=defaultserver/host=defaulthost/setting./singlesignon: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/servletcontainer=default/setting./persistentsessions:add(path=persistentwebsessions,\ relativeto=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=defaultserver/host=defaulthost/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/reverseproxy./myreverseproxy:add
cd ./myreverseproxy./host=”http://192.168.0.20:8080/myapp”:add < (1)./host=”ajp://192.168.0.30:8009/myapp”:add < (2)ajpも可
cd /subsystem=undertow/server=defaultserver/host=defaulthost/location./"/myapp":add(handler=myreverseproxy)
/: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/connectionlimit./myauth:add(securitydomain=other) < ※other は最初から用意されている
cd /subsystem=undertow/server=defaultserver/host=defaulthost/filterref./myauth:add
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 61
Connection Limitフィルタ
● 同時接続数を制限同時接続数と待ちキュー ( バックログ )を設定できる-------------------------------------------------------------------------[CLI]cd /subsystem=undertow/configuration=filter/connectionlimit./myconnectionlimit:add(maxconcurrentrequests=100,queuesize=5)
cd /subsystem=undertow/server=defaultserver/host=defaulthost/filterref./myconnectionlimit: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./mygzip:add
cd /subsystem=undertow/server=defaultserver/host=defaulthost/filterref./mygzip:add(predicate="pathsuffix['.css'] or pathsuffix['.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/responseheader./myheader:add(headername=MyHeader,headervalue=MyHeaderValue)
cd /subsystem=undertow/server=defaultserver/host=defaulthost/filterref./myheader:add
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 64
Response Header フィルタ
● デフォルトで設定されているヘッダを削除[CLI]cd /subsystem=undertow/server=defaultserver/host=defaulthost/filterref./serverheader:remove./xpoweredbyheader:remove
/:reload
Copyright(c)2014 NTT Corp. All Rights Reserved. 65
ハンドラとフィルタの組み合わせ
● 特定のパスにのみ有効なフィルタ特定パスのみヘッダを設定する例 ( 前述の /img とmy-header を利用 )[CLI]cd /subsystem=undertow/server=defaultserver/host=defaulthost/location./"/img"/filterref=myheader: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/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
Copyright(c)2014 NTT Corp. All Rights Reserved. 71
参考
● メーリングリスト– https://lists.jboss.org/mailman/listinfo/undertow-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