Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Tomcatコミッタがお送りするちょっとマニアックなTomcatのコンフィグレーション10選
Search
kfujino
May 27, 2021
Technology
1
3.5k
Tomcatコミッタがお送りするちょっとマニアックなTomcatのコンフィグレーション10選
kfujino
May 27, 2021
Tweet
Share
Other Decks in Technology
See All in Technology
BDD(Cucumber)コミュニティが無料提供しているコンテンツの紹介と現在起きている危機
nihonbuson
4
730
大規模なアジャイル開発の現場と技術負債 / Technical Debt
yoshiitaka
20
4k
暗黙知を集積するプラットフォーム : 「健常者エミュレータ事例集」の取り組み
sora32127
1
160
業務で使えるかもしれない…!?GitHub Actions の Tips 集 / CI/CD Test Night #7
ponkio_o
PRO
24
7k
やっていきテスト
k6s4i53rx
0
160
チーム単位で保守性を高める:独自指標と向上にむけた実践
tarappo
0
300
期待しすぎずに取り組む両面 TypeScript
shozawa
2
300
中央集権体制からDataOpsへの転換 / centralized-to-dataops-transformation
pei0804
7
1.5k
#51 “Empowering Azure Storage with RDMA”
cafenero_777
3
210
単回帰分析について数式を追いながら実装してみた
kentaitakura
0
500
生成AI・LLM時代における 機械学習エンジニアとしてのキャリア戦略・開発戦略 / my-career-and-development-strategies-for-ml-engineer-2024
yuya4
4
390
オーティファイ会社紹介資料 / Autify Company Deck
autifyhq
7
100k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
42
6.7k
Building Applications with DynamoDB
mza
88
5.6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
153
14k
RailsConf 2023
tenderlove
0
510
Bash Introduction
62gerente
604
210k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
58
14k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
272
12k
Documentation Writing (for coders)
carmenintech
59
3.8k
Designing Experiences People Love
moore
135
23k
Build your cross-platform service in a week with App Engine
jlugia
223
17k
The Pragmatic Product Professional
lauravandoore
24
5.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
124
32k
Transcript
Tomcatコミッタがお送りするちょ っとマニアックなTomcatのコンフ ィグレーション10選 藤野圭一 Confidential Copyright ©︎ 2021 by Future
Corporation
Agenda • 自己紹介 • ちょっとマニアックなTomcatのコンフィグレーション10選 • Tomcat10以降のバージョン体系の話 Confidential Copyright ©︎
2021 by Future Corporation
Topic • About Me Confidential Copyright ©︎ 2021 by Future
Corporation 自己紹介
誰? • 藤野圭一 • 2019/10 Future入社 ◦ 独立系SI企業から転職。2社目 • 趣味
◦ 生き物飼育(クワガタ、カブトムシ、アクアリウム) ◦ OSS活動 Confidential Copyright ©︎ 2021 by Future Corporation
OSS活動 • ロール ◦ Tomcat コミッタ ◦ Tomcat PMCメンバ ◦
Incubator コミッタ ◦ Incubator PMCメンバ ◦ ASF メンバ • その他 ◦ 本も出しています ◦ 国内外カンファレンス多数登壇 Confidential Copyright ©︎ 2021 by Future Corporation
Topic • 知っているとちょっと得する?マ ニアックな設定 Confidential Copyright ©︎ 2021 by Future
Corporation Tomcatコンフィグレーション10選
設定値を外部リソースから読み込む • Tomcatの設定ファイルの設定項目は通常直接値を設定する • 直接値を設定するのではなく、${Key}指定で別ソースから経 由することも可能 Confidential Copyright ©︎ 2021
by Future Corporation
設定値を外部リソースから読み込む • デフォルトではJavaのシステムプロパティ経由で利用可能 ◦ Javaオプション ◦ setenv.sh ◦ catalina.properties等 Confidential
Copyright ©︎ 2021 by Future Corporation
設定値を外部リソースから読み込む • さらに、org.apache.tomcat.util.digester. PROPERTY_SOURCE=org.apache.tomcat.util.digester. EnvironmentPropertySourceをJavaオプションに指定す るとプロセスの環境変数から取得することが可能 Confidential Copyright ©︎ 2021
by Future Corporation
ポートオフセット • 同一筐体で複数台のTomcatを立ち上げる際の良くやるやり 方としてserver.xmlのport番号の設定だけ変更してTomcat を起動する。(バインド例外を避ける為) • でも、複数あるport番号をちまちま変更するのは面倒 • そんなときはポートオフセットを利用 •
offset分ずらした値でportを設定する。 • 例えば、 Confidential Copyright ©︎ 2021 by Future Corporation
ポートオフセット • ログにもベースportとoffsetが出力される Confidential Copyright ©︎ 2021 by Future Corporation
Json Error Report • Tomcatのエラーページ ◦ デフォルト設定ではHTMLページをTomcatが組み立てて返却 ◦ TomcatをAPIServerとして動作させる場合、HTMLが返却されると 嬉しくないことがある。JSONでレシポンスを返して欲しい。
◦ そんなときは、エラーをHTMLページではなく、JSONデータで返 すerrorReportValveを利用する Confidential Copyright ©︎ 2021 by Future Corporation
Json Error Report • デフォルトのエラーページ Confidential Copyright ©︎ 2021 by
Future Corporation
Json Error Report • JSONレスポンス Confidential Copyright ©︎ 2021 by
Future Corporation
StuckThreadDetectionValve • Tomcatを利用しているシステムのどこかわからんが処理が スタックしたり、レスポンスが遅延して返ってこないケー ス • Javaだとスレッドダンプを取得してアナライザで解析 • 発生時に即座にとれれば良いが。。 •
依頼するにも再現させてなど、タイムリーにできない Confidential Copyright ©︎ 2021 by Future Corporation
StuckThreadDetectionValve • そんなときは、StuckThreadDetectionValveを利用 • StuckThreadDetectionValveはバックグラウンドでリクエス ト処理スレッドを常に監視し、閾値を超えたリクエスト処 理スレッドのスタックトレースを出力してくれる Confidential Copyright ©︎
2021 by Future Corporation 閾値
StuckThreadDetectionValve • スレッドスタック検知時にログが出力される Confidential Copyright ©︎ 2021 by Future Corporation
パスも出る
StuckThreadDetectionValve • スタックしていたスレッドが戻ってきた際もログに Confidential Copyright ©︎ 2021 by Future Corporation
• 但しスレッドダンプのようなロック情報等は見れないの で、ロック状態の解析を行う場合は、スレッドダンプが必 要 処理時間も
Legacyアプリケーションベース • javaEE→jakartaEEへのネームスペース変更のビックバンの 影響(後述)で、javaEEを含むアプリケーションは Tomcat10では動かない。つまり、今Tomcat9等にデプロイ しているアプリケーションはTomcat10では動かない。 • 恒久対応としては、jakartaEEに対応したアプリにアップデ ートすること •
暫定対応として、Host#legacyAppBaseをアプリケーシ ョンディレクトリとして利用することが可能 Confidential Copyright ©︎ 2021 by Future Corporation
Legacyアプリケーションベース • Host#legacyAppBase指定したディレクトリ(デフォル ト:webapps-javaee)にアプリケーションを配置すると マイグレーションツールが起動して、バイナリをjakartaEE 対応に変更してデプロイしてくれる ※他のEEコンテナは知らない。最初いろいろ議論していたが 各コミュニティでその先どうなったかは不明 Confidential Copyright
©︎ 2021 by Future Corporation
Legacyアプリケーションベース • ※bin/配下にmigrate.shもあるのでこのシェルを直実行する ことでもマイグレーション可能 Confidential Copyright ©︎ 2021 by Future
Corporation アプリをマイグレーションして、 webappsディレクトリにコピー
Legacyアプリケーションベース • JavaEE→Jakartaのマイグレーションを実施した場合はロ グに出力 Confidential Copyright ©︎ 2021 by Future
Corporation
静的クラスタメンバーシップ • Tomcatでクラスタ構成を組む場合、デフォルトのクラスタ リングのメンバシップはマルチキャストを利用する • Cloud環境等マルチキャストが使えないケースのクラスタメ ンバシップの組み方を二つ紹介 Confidential Copyright ©︎
2021 by Future Corporation Tomcat1 Tomcat2 Tomcat3 マルチキャストAddr Group
静的クラスタメンバーシップ • Staticメンバシップ ◦ マルチキャストは動的にマルチキャストアドレスにジョ インしてきたノードを登録するが、staticメンバシップ はあらかじめクラスタメンバを定義する ◦ 定義したクラスタメンバでクラスタを構成する ◦
定義した全てを起動しておく必要はなく、必要数分定義 しておけば良い Confidential Copyright ©︎ 2021 by Future Corporation
静的クラスタメンバーシップ • Staticメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation
Tomcat1 Static(Unicast Addr)Group メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3 Tomcat2 メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3 Tomcat3 メンバ定義 • Tomcat1 • Tomcat2 • Tomcat3
静的クラスタメンバーシップ Confidential Copyright ©︎ 2021 by Future Corporation
静的クラスタリングメンバーシップ • 注意 ◦ 当初から方針が大分変っているのでググって出る情報は古 いものが多いので注意 ◦ 詳解Tomcatでも古い方法で書かれている ◦ StaticMembershipInterceptorでも出来るが非推奨、
LocalMember設定不要等 ◦ IPをキャッシュしてしまうので、今度修正しておきます! Confidential Copyright ©︎ 2021 by Future Corporation
Cloudクラスタメンバーシップ • Cloudメンバシップ ◦ kubernetes用のクラスタメンバシップ ◦ DNSPingとKubePingの2実装(※後者を説明) ◦ 別途kubernetesの環境が必要 ◦
PodにCloudメンバシップを設定したTomcatインスタンスをデプロイ ◦ KubePingを利用してダイナミックにクラスタメンバシップを構築す る Confidential Copyright ©︎ 2021 by Future Corporation
Cloudクラスタメンバーシップ • Cloudメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation
Tomcat1 Kubernetes(Openshift) クラスタ Pod Tomcat1 Pod Tomcat1 Pod Master KubePing KubePing Pod情報 Pod情報
Cloudクラスタメンバーシップ • コンテナオーケストレーションツールなどのヘルスチェッ ク用にHealthCheckValveも追加で設定要 • KUBERNETES_NAMESPACE、認証情報等の環境変数を Dockerfile等で指定する Confidential Copyright ©︎
2021 by Future Corporation
Cloudクラスタメンバーシップ • 注意 ◦ 作成したのが2年以上前なので最新のkubernetesでどう なるか未確認 ◦ 公式ドキュメントに設定方法が未 Confidential Copyright
©︎ 2021 by Future Corporation
組込みTomcatのコンフィグソース • SpringBoot等に組込まれているTomcat • SpringBoot専用機ではないので、だれでもnew Tomcat()で Tomcatインスタンスを作成できる。起動もできる。 • とはいっても、new Tomcat()した後、どうやってTomcatを
コンフィグするのかわからない • 簡単なWebサーバならさっくっと出来るが、少し凝った設 定をしているserver.xmlで構成されたTomcatを組込みで再 現するのはなかなか大変 • そんな時のコンフィグを二つ紹介 Confidential Copyright ©︎ 2021 by Future Corporation
組込みTomcatのコンフィグソース • ConfigurationSourceを利用し、Tomcatを初期化 • CatalinaBaseConfigurationSourceを利用すればserver.xml をパースして構成された組込みTomcatを作成してくれる Confidential Copyright ©︎ 2021
by Future Corporation
ソースコード生成 • 起動オプションgenerateCodeを追加して、 Tomcatを起動 すると組込みTomcatのソースコードが出力されます。 Confidential Copyright ©︎ 2021 by
Future Corporation
ソースコード生成 Confidential Copyright ©︎ 2021 by Future Corporation
多言語化対応 • Tomcatのログ等はその環境に合わせた言語で出力されます • ただ、あらゆる言語を操るコミッタはいないので、コミュ ニティ全員で協力して多言語化を進めています • そのツールとして、コミュニティではPOEditorを利用して います •
https://cwiki.apache.org/confluence/display/TOMCAT/M anaging+translations Confidential Copyright ©︎ 2021 by Future Corporation
多言語化対応 • こんな感じ Confidential Copyright ©︎ 2021 by Future Corporation
多言語化対応 • Tomcat translations projectにジョインして言語を選択する ことで手軽に翻訳が可能 • ソースをハッキングしなくてもコミュニティ貢献が気軽に 出来ます •
なのでTomcatのログの日本語がおかしかったらPOEditor経 由で直して頂ければ、リリース時に反映されます • 8割くらい私が勢いでやっているのでいろいろ問題あると思 いますので気軽に修正してください Confidential Copyright ©︎ 2021 by Future Corporation
Topic • わかり難い。。 • 今後少し変わるかもしれない が今はコレ。。 Confidential Copyright ©︎ 2021
by Future Corporation Tomcat10以降のバージョン体系
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
Tomcat10以降のバージョン体系 • はじめに。知っておくこと2 ◦ JavaEEがEclipse Foundationに ▪ JavaEE8 → JakartaEE8
◦ JakartaEE8は名前が変わって、機能に影響の無いちょ っとした修正のみ ◦ 要は完全互換 Confidential Copyright ©︎ 2021 by Future Corporation
Tomcat10以降のバージョン体系 • JakartaEE8→JakartaEE9へのバージョンアップ ◦ 仕様の追加云々はないが、めんどくさい ◦ javax.* -> jakarta.* のネームスペースの変更
◦ 簡単にいうと、JavaEE8(JakartaEE8)のアプリケーションは JakartaEE9と互換性はない ◦ つまり動かない。Java的に言うとClassNotFoundException Confidential Copyright ©︎ 2021 by Future Corporation
Tomcat10以降のバージョン体系 • Tomcat10について ◦ Tomcat10.0.xはJakartaEE9をサポートする ◦ Tomcat9以前で稼働しているアプリケーションは Tomcat10では(マイグレーションしないと)動作しな い ◦
まぁいつかはマイグレーションはしないといけないので 可能ならやりましょう。 Confidential Copyright ©︎ 2021 by Future Corporation
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
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
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
Tomcat10以降のバージョン体系 • 複雑ですが、自分のアプリケーションをどのTomcatで実行す るのか適切に判断しましょう。 Confidential Copyright ©︎ 2021 by Future
Corporation
Thank you for listening. Copyright ©︎ 2021 by Future Corporation
Confidential