Slide 1

Slide 1 text

Tomcatコミッタがお送りするちょ っとマニアックなTomcatのコンフ ィグレーション10選 藤野圭一 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 2

Slide 2 text

Agenda ● 自己紹介 ● ちょっとマニアックなTomcatのコンフィグレーション10選 ● Tomcat10以降のバージョン体系の話 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 3

Slide 3 text

Topic ● About Me Confidential Copyright ©︎ 2021 by Future Corporation 自己紹介

Slide 4

Slide 4 text

誰? ● 藤野圭一 ● 2019/10 Future入社 ○ 独立系SI企業から転職。2社目 ● 趣味 ○ 生き物飼育(クワガタ、カブトムシ、アクアリウム) ○ OSS活動 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 5

Slide 5 text

OSS活動 ● ロール ○ Tomcat コミッタ ○ Tomcat PMCメンバ ○ Incubator コミッタ ○ Incubator PMCメンバ ○ ASF メンバ ● その他 ○ 本も出しています ○ 国内外カンファレンス多数登壇 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 6

Slide 6 text

Topic ● 知っているとちょっと得する?マ ニアックな設定 Confidential Copyright ©︎ 2021 by Future Corporation Tomcatコンフィグレーション10選

Slide 7

Slide 7 text

設定値を外部リソースから読み込む ● Tomcatの設定ファイルの設定項目は通常直接値を設定する ● 直接値を設定するのではなく、${Key}指定で別ソースから経 由することも可能 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 8

Slide 8 text

設定値を外部リソースから読み込む ● デフォルトではJavaのシステムプロパティ経由で利用可能 ○ Javaオプション ○ setenv.sh ○ catalina.properties等 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 9

Slide 9 text

設定値を外部リソースから読み込む ● さらに、org.apache.tomcat.util.digester. PROPERTY_SOURCE=org.apache.tomcat.util.digester. EnvironmentPropertySourceをJavaオプションに指定す るとプロセスの環境変数から取得することが可能 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 10

Slide 10 text

ポートオフセット ● 同一筐体で複数台のTomcatを立ち上げる際の良くやるやり 方としてserver.xmlのport番号の設定だけ変更してTomcat を起動する。(バインド例外を避ける為) ● でも、複数あるport番号をちまちま変更するのは面倒 ● そんなときはポートオフセットを利用 ● offset分ずらした値でportを設定する。 ● 例えば、 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 11

Slide 11 text

ポートオフセット ● ログにもベースportとoffsetが出力される Confidential Copyright ©︎ 2021 by Future Corporation

Slide 12

Slide 12 text

Json Error Report ● Tomcatのエラーページ ○ デフォルト設定ではHTMLページをTomcatが組み立てて返却 ○ TomcatをAPIServerとして動作させる場合、HTMLが返却されると 嬉しくないことがある。JSONでレシポンスを返して欲しい。 ○ そんなときは、エラーをHTMLページではなく、JSONデータで返 すerrorReportValveを利用する Confidential Copyright ©︎ 2021 by Future Corporation

Slide 13

Slide 13 text

Json Error Report ● デフォルトのエラーページ Confidential Copyright ©︎ 2021 by Future Corporation

Slide 14

Slide 14 text

Json Error Report ● JSONレスポンス Confidential Copyright ©︎ 2021 by Future Corporation

Slide 15

Slide 15 text

StuckThreadDetectionValve ● Tomcatを利用しているシステムのどこかわからんが処理が スタックしたり、レスポンスが遅延して返ってこないケー ス ● Javaだとスレッドダンプを取得してアナライザで解析 ● 発生時に即座にとれれば良いが。。 ● 依頼するにも再現させてなど、タイムリーにできない Confidential Copyright ©︎ 2021 by Future Corporation

Slide 16

Slide 16 text

StuckThreadDetectionValve ● そんなときは、StuckThreadDetectionValveを利用 ● StuckThreadDetectionValveはバックグラウンドでリクエス ト処理スレッドを常に監視し、閾値を超えたリクエスト処 理スレッドのスタックトレースを出力してくれる Confidential Copyright ©︎ 2021 by Future Corporation 閾値

Slide 17

Slide 17 text

StuckThreadDetectionValve ● スレッドスタック検知時にログが出力される Confidential Copyright ©︎ 2021 by Future Corporation パスも出る

Slide 18

Slide 18 text

StuckThreadDetectionValve ● スタックしていたスレッドが戻ってきた際もログに Confidential Copyright ©︎ 2021 by Future Corporation ● 但しスレッドダンプのようなロック情報等は見れないの で、ロック状態の解析を行う場合は、スレッドダンプが必 要 処理時間も

Slide 19

Slide 19 text

Legacyアプリケーションベース ● javaEE→jakartaEEへのネームスペース変更のビックバンの 影響(後述)で、javaEEを含むアプリケーションは Tomcat10では動かない。つまり、今Tomcat9等にデプロイ しているアプリケーションはTomcat10では動かない。 ● 恒久対応としては、jakartaEEに対応したアプリにアップデ ートすること ● 暫定対応として、Host#legacyAppBaseをアプリケーシ ョンディレクトリとして利用することが可能 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 20

Slide 20 text

Legacyアプリケーションベース ● Host#legacyAppBase指定したディレクトリ(デフォル ト:webapps-javaee)にアプリケーションを配置すると マイグレーションツールが起動して、バイナリをjakartaEE 対応に変更してデプロイしてくれる ※他のEEコンテナは知らない。最初いろいろ議論していたが 各コミュニティでその先どうなったかは不明 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 21

Slide 21 text

Legacyアプリケーションベース ● ※bin/配下にmigrate.shもあるのでこのシェルを直実行する ことでもマイグレーション可能 Confidential Copyright ©︎ 2021 by Future Corporation アプリをマイグレーションして、 webappsディレクトリにコピー

Slide 22

Slide 22 text

Legacyアプリケーションベース ● JavaEE→Jakartaのマイグレーションを実施した場合はロ グに出力 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 23

Slide 23 text

静的クラスタメンバーシップ ● Tomcatでクラスタ構成を組む場合、デフォルトのクラスタ リングのメンバシップはマルチキャストを利用する ● Cloud環境等マルチキャストが使えないケースのクラスタメ ンバシップの組み方を二つ紹介 Confidential Copyright ©︎ 2021 by Future Corporation Tomcat1 Tomcat2 Tomcat3 マルチキャストAddr Group

Slide 24

Slide 24 text

静的クラスタメンバーシップ ● Staticメンバシップ ○ マルチキャストは動的にマルチキャストアドレスにジョ インしてきたノードを登録するが、staticメンバシップ はあらかじめクラスタメンバを定義する ○ 定義したクラスタメンバでクラスタを構成する ○ 定義した全てを起動しておく必要はなく、必要数分定義 しておけば良い Confidential Copyright ©︎ 2021 by Future Corporation

Slide 25

Slide 25 text

静的クラスタメンバーシップ ● Staticメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation Tomcat1 Static(Unicast Addr)Group メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3 Tomcat2 メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3 Tomcat3 メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3

Slide 26

Slide 26 text

静的クラスタメンバーシップ Confidential Copyright ©︎ 2021 by Future Corporation

Slide 27

Slide 27 text

静的クラスタリングメンバーシップ ● 注意 ○ 当初から方針が大分変っているのでググって出る情報は古 いものが多いので注意 ○ 詳解Tomcatでも古い方法で書かれている ○ StaticMembershipInterceptorでも出来るが非推奨、 LocalMember設定不要等 ○ IPをキャッシュしてしまうので、今度修正しておきます! Confidential Copyright ©︎ 2021 by Future Corporation

Slide 28

Slide 28 text

Cloudクラスタメンバーシップ ● Cloudメンバシップ ○ kubernetes用のクラスタメンバシップ ○ DNSPingとKubePingの2実装(※後者を説明) ○ 別途kubernetesの環境が必要 ○ PodにCloudメンバシップを設定したTomcatインスタンスをデプロイ ○ KubePingを利用してダイナミックにクラスタメンバシップを構築す る Confidential Copyright ©︎ 2021 by Future Corporation

Slide 29

Slide 29 text

Cloudクラスタメンバーシップ ● Cloudメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation Tomcat1 Kubernetes(Openshift) クラスタ Pod Tomcat1 Pod Tomcat1 Pod Master KubePing KubePing Pod情報 Pod情報

Slide 30

Slide 30 text

Cloudクラスタメンバーシップ ● コンテナオーケストレーションツールなどのヘルスチェッ ク用にHealthCheckValveも追加で設定要 ● KUBERNETES_NAMESPACE、認証情報等の環境変数を Dockerfile等で指定する Confidential Copyright ©︎ 2021 by Future Corporation

Slide 31

Slide 31 text

Cloudクラスタメンバーシップ ● 注意 ○ 作成したのが2年以上前なので最新のkubernetesでどう なるか未確認 ○ 公式ドキュメントに設定方法が未 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 32

Slide 32 text

組込みTomcatのコンフィグソース ● SpringBoot等に組込まれているTomcat ● SpringBoot専用機ではないので、だれでもnew Tomcat()で Tomcatインスタンスを作成できる。起動もできる。 ● とはいっても、new Tomcat()した後、どうやってTomcatを コンフィグするのかわからない ● 簡単なWebサーバならさっくっと出来るが、少し凝った設 定をしているserver.xmlで構成されたTomcatを組込みで再 現するのはなかなか大変 ● そんな時のコンフィグを二つ紹介 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 33

Slide 33 text

組込みTomcatのコンフィグソース ● ConfigurationSourceを利用し、Tomcatを初期化 ● CatalinaBaseConfigurationSourceを利用すればserver.xml をパースして構成された組込みTomcatを作成してくれる Confidential Copyright ©︎ 2021 by Future Corporation

Slide 34

Slide 34 text

ソースコード生成 ● 起動オプションgenerateCodeを追加して、 Tomcatを起動 すると組込みTomcatのソースコードが出力されます。 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 35

Slide 35 text

ソースコード生成 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 36

Slide 36 text

多言語化対応 ● Tomcatのログ等はその環境に合わせた言語で出力されます ● ただ、あらゆる言語を操るコミッタはいないので、コミュ ニティ全員で協力して多言語化を進めています ● そのツールとして、コミュニティではPOEditorを利用して います ● https://cwiki.apache.org/confluence/display/TOMCAT/M anaging+translations Confidential Copyright ©︎ 2021 by Future Corporation

Slide 37

Slide 37 text

多言語化対応 ● こんな感じ Confidential Copyright ©︎ 2021 by Future Corporation

Slide 38

Slide 38 text

多言語化対応 ● Tomcat translations projectにジョインして言語を選択する ことで手軽に翻訳が可能 ● ソースをハッキングしなくてもコミュニティ貢献が気軽に 出来ます ● なのでTomcatのログの日本語がおかしかったらPOEditor経 由で直して頂ければ、リリース時に反映されます ● 8割くらい私が勢いでやっているのでいろいろ問題あると思 いますので気軽に修正してください Confidential Copyright ©︎ 2021 by Future Corporation

Slide 39

Slide 39 text

Topic ● わかり難い。。 ● 今後少し変わるかもしれない が今はコレ。。 Confidential Copyright ©︎ 2021 by Future Corporation Tomcat10以降のバージョン体系

Slide 40

Slide 40 text

Tomcat10以降のバージョン体系 ● はじめに。知っておくこと1 ○ TomcatはJavaEEのサブセットをsupport ■ Tomcat7.0.x : support Java EE 6 ■ Tomcat8.5.x : support Java EE 7 ■ Tomcat9.0.x : support Java EE 8 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 41

Slide 41 text

Tomcat10以降のバージョン体系 ● はじめに。知っておくこと2 ○ JavaEEがEclipse Foundationに ■ JavaEE8 → JakartaEE8 ○ JakartaEE8は名前が変わって、機能に影響の無いちょ っとした修正のみ ○ 要は完全互換 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 42

Slide 42 text

Tomcat10以降のバージョン体系 ● JakartaEE8→JakartaEE9へのバージョンアップ ○ 仕様の追加云々はないが、めんどくさい ○ javax.* -> jakarta.* のネームスペースの変更 ○ 簡単にいうと、JavaEE8(JakartaEE8)のアプリケーションは JakartaEE9と互換性はない ○ つまり動かない。Java的に言うとClassNotFoundException Confidential Copyright ©︎ 2021 by Future Corporation

Slide 43

Slide 43 text

Tomcat10以降のバージョン体系 ● Tomcat10について ○ Tomcat10.0.xはJakartaEE9をサポートする ○ Tomcat9以前で稼働しているアプリケーションは Tomcat10では(マイグレーションしないと)動作しな い ○ まぁいつかはマイグレーションはしないといけないので 可能ならやりましょう。 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 44

Slide 44 text

Tomcat10以降のバージョン体系 ● Tomcat10を含めたサポート状況 ○ Tomcat7.0.x : support Java EE 6 ○ Tomcat8.5.x : support Java EE 7 ○ Tomcat9.0.x : support Java EE 8(JakartaEE8) ○ Tomcat10.0.x : support JakartaEE9 ● これが今現在の状態。まぁまだ分かる Confidential Copyright ©︎ 2021 by Future Corporation

Slide 45

Slide 45 text

Tomcat10以降のバージョン体系 ● では、JakartaEE10がリリースされるとどうなるか? ○ Tomcat8.5.x : support Java EE 7 ○ Tomcat9.0.x : support Java EE 8 ○ Tomcat9.10.x : support Java EE 8 with Tomcat10 API ○ Tomcat10.0.x : EOL ○ Tomcat10.1.x : support JakartaEE10 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 46

Slide 46 text

Tomcat10以降のバージョン体系 ● では、JakartaEE11がリリースされるとどうなるか? ○ Tomcat8.5.x : support Java EE 7 →多分EOL ○ Tomcat9.0.x : support Java EE 8 ○ Tomcat9.10.x : EOL ○ Tomcat9.11.x : support Java EE 8 with Tomcat11 API ○ Tomcat10.1.x : support JakartaEE10 ○ Tomcat11.0.x : support JakartaEE11 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 47

Slide 47 text

Tomcat10以降のバージョン体系 ● 複雑ですが、自分のアプリケーションをどのTomcatで実行す るのか適切に判断しましょう。 Confidential Copyright ©︎ 2021 by Future Corporation

Slide 48

Slide 48 text

Thank you for listening. Copyright ©︎ 2021 by Future Corporation Confidential