Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tomcatコミッタがお送りするちょっとマニアックなTomcatのコンフィグレーション10選

 Tomcatコミッタがお送りするちょっとマニアックなTomcatのコンフィグレーション10選

214f29d430a1640d72da95e66659382b?s=128

kfujino

May 27, 2021
Tweet

Transcript

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

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

    2021 by Future Corporation
  3. Topic • About Me Confidential Copyright ©︎ 2021 by Future

    Corporation 自己紹介
  4. 誰? • 藤野圭一 • 2019/10 Future入社 ◦ 独立系SI企業から転職。2社目 • 趣味

    ◦ 生き物飼育(クワガタ、カブトムシ、アクアリウム) ◦ OSS活動 Confidential Copyright ©︎ 2021 by Future Corporation
  5. OSS活動 • ロール ◦ Tomcat コミッタ ◦ Tomcat PMCメンバ ◦

    Incubator コミッタ ◦ Incubator PMCメンバ ◦ ASF メンバ • その他 ◦ 本も出しています ◦ 国内外カンファレンス多数登壇 Confidential Copyright ©︎ 2021 by Future Corporation
  6. Topic • 知っているとちょっと得する?マ ニアックな設定 Confidential Copyright ©︎ 2021 by Future

    Corporation Tomcatコンフィグレーション10選
  7. 設定値を外部リソースから読み込む • Tomcatの設定ファイルの設定項目は通常直接値を設定する • 直接値を設定するのではなく、${Key}指定で別ソースから経 由することも可能 Confidential Copyright ©︎ 2021

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

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

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

    offset分ずらした値でportを設定する。 • 例えば、 Confidential Copyright ©︎ 2021 by Future Corporation
  11. ポートオフセット • ログにもベースportとoffsetが出力される Confidential Copyright ©︎ 2021 by Future Corporation

  12. Json Error Report • Tomcatのエラーページ ◦ デフォルト設定ではHTMLページをTomcatが組み立てて返却 ◦ TomcatをAPIServerとして動作させる場合、HTMLが返却されると 嬉しくないことがある。JSONでレシポンスを返して欲しい。

    ◦ そんなときは、エラーをHTMLページではなく、JSONデータで返 すerrorReportValveを利用する Confidential Copyright ©︎ 2021 by Future Corporation
  13. Json Error Report • デフォルトのエラーページ Confidential Copyright ©︎ 2021 by

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

    Future Corporation
  15. StuckThreadDetectionValve • Tomcatを利用しているシステムのどこかわからんが処理が スタックしたり、レスポンスが遅延して返ってこないケー ス • Javaだとスレッドダンプを取得してアナライザで解析 • 発生時に即座にとれれば良いが。。 •

    依頼するにも再現させてなど、タイムリーにできない Confidential Copyright ©︎ 2021 by Future Corporation
  16. StuckThreadDetectionValve • そんなときは、StuckThreadDetectionValveを利用 • StuckThreadDetectionValveはバックグラウンドでリクエス ト処理スレッドを常に監視し、閾値を超えたリクエスト処 理スレッドのスタックトレースを出力してくれる Confidential Copyright ©︎

    2021 by Future Corporation 閾値
  17. StuckThreadDetectionValve • スレッドスタック検知時にログが出力される Confidential Copyright ©︎ 2021 by Future Corporation

    パスも出る
  18. StuckThreadDetectionValve • スタックしていたスレッドが戻ってきた際もログに Confidential Copyright ©︎ 2021 by Future Corporation

    • 但しスレッドダンプのようなロック情報等は見れないの で、ロック状態の解析を行う場合は、スレッドダンプが必 要 処理時間も
  19. Legacyアプリケーションベース • javaEE→jakartaEEへのネームスペース変更のビックバンの 影響(後述)で、javaEEを含むアプリケーションは Tomcat10では動かない。つまり、今Tomcat9等にデプロイ しているアプリケーションはTomcat10では動かない。 • 恒久対応としては、jakartaEEに対応したアプリにアップデ ートすること •

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

    ©︎ 2021 by Future Corporation
  21. Legacyアプリケーションベース • ※bin/配下にmigrate.shもあるのでこのシェルを直実行する ことでもマイグレーション可能 Confidential Copyright ©︎ 2021 by Future

    Corporation アプリをマイグレーションして、 webappsディレクトリにコピー
  22. Legacyアプリケーションベース • JavaEE→Jakartaのマイグレーションを実施した場合はロ グに出力 Confidential Copyright ©︎ 2021 by Future

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

    2021 by Future Corporation Tomcat1 Tomcat2 Tomcat3 マルチキャストAddr Group
  24. 静的クラスタメンバーシップ • Staticメンバシップ ◦ マルチキャストは動的にマルチキャストアドレスにジョ インしてきたノードを登録するが、staticメンバシップ はあらかじめクラスタメンバを定義する ◦ 定義したクラスタメンバでクラスタを構成する ◦

    定義した全てを起動しておく必要はなく、必要数分定義 しておけば良い Confidential Copyright ©︎ 2021 by Future Corporation
  25. 静的クラスタメンバーシップ • Staticメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation

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

  27. 静的クラスタリングメンバーシップ • 注意 ◦ 当初から方針が大分変っているのでググって出る情報は古 いものが多いので注意 ◦ 詳解Tomcatでも古い方法で書かれている ◦ StaticMembershipInterceptorでも出来るが非推奨、

    LocalMember設定不要等 ◦ IPをキャッシュしてしまうので、今度修正しておきます! Confidential Copyright ©︎ 2021 by Future Corporation
  28. Cloudクラスタメンバーシップ • Cloudメンバシップ ◦ kubernetes用のクラスタメンバシップ ◦ DNSPingとKubePingの2実装(※後者を説明) ◦ 別途kubernetesの環境が必要 ◦

    PodにCloudメンバシップを設定したTomcatインスタンスをデプロイ ◦ KubePingを利用してダイナミックにクラスタメンバシップを構築す る Confidential Copyright ©︎ 2021 by Future Corporation
  29. Cloudクラスタメンバーシップ • Cloudメンバシップ Confidential Copyright ©︎ 2021 by Future Corporation

    Tomcat1 Kubernetes(Openshift) クラスタ Pod Tomcat1 Pod Tomcat1 Pod Master KubePing KubePing Pod情報 Pod情報
  30. Cloudクラスタメンバーシップ • コンテナオーケストレーションツールなどのヘルスチェッ ク用にHealthCheckValveも追加で設定要 • KUBERNETES_NAMESPACE、認証情報等の環境変数を Dockerfile等で指定する Confidential Copyright ©︎

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

    ©︎ 2021 by Future Corporation
  32. 組込みTomcatのコンフィグソース • SpringBoot等に組込まれているTomcat • SpringBoot専用機ではないので、だれでもnew Tomcat()で Tomcatインスタンスを作成できる。起動もできる。 • とはいっても、new Tomcat()した後、どうやってTomcatを

    コンフィグするのかわからない • 簡単なWebサーバならさっくっと出来るが、少し凝った設 定をしているserver.xmlで構成されたTomcatを組込みで再 現するのはなかなか大変 • そんな時のコンフィグを二つ紹介 Confidential Copyright ©︎ 2021 by Future Corporation
  33. 組込みTomcatのコンフィグソース • ConfigurationSourceを利用し、Tomcatを初期化 • CatalinaBaseConfigurationSourceを利用すればserver.xml をパースして構成された組込みTomcatを作成してくれる Confidential Copyright ©︎ 2021

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

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

  36. 多言語化対応 • Tomcatのログ等はその環境に合わせた言語で出力されます • ただ、あらゆる言語を操るコミッタはいないので、コミュ ニティ全員で協力して多言語化を進めています • そのツールとして、コミュニティではPOEditorを利用して います •

    https://cwiki.apache.org/confluence/display/TOMCAT/M anaging+translations Confidential Copyright ©︎ 2021 by Future Corporation
  37. 多言語化対応 • こんな感じ Confidential Copyright ©︎ 2021 by Future Corporation

  38. 多言語化対応 • Tomcat translations projectにジョインして言語を選択する ことで手軽に翻訳が可能 • ソースをハッキングしなくてもコミュニティ貢献が気軽に 出来ます •

    なのでTomcatのログの日本語がおかしかったらPOEditor経 由で直して頂ければ、リリース時に反映されます • 8割くらい私が勢いでやっているのでいろいろ問題あると思 いますので気軽に修正してください Confidential Copyright ©︎ 2021 by Future Corporation
  39. Topic • わかり難い。。 • 今後少し変わるかもしれない が今はコレ。。 Confidential Copyright ©︎ 2021

    by Future Corporation Tomcat10以降のバージョン体系
  40. 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
  41. Tomcat10以降のバージョン体系 • はじめに。知っておくこと2 ◦ JavaEEがEclipse Foundationに ▪ JavaEE8 → JakartaEE8

    ◦ JakartaEE8は名前が変わって、機能に影響の無いちょ っとした修正のみ ◦ 要は完全互換 Confidential Copyright ©︎ 2021 by Future Corporation
  42. Tomcat10以降のバージョン体系 • JakartaEE8→JakartaEE9へのバージョンアップ ◦ 仕様の追加云々はないが、めんどくさい ◦ javax.* -> jakarta.* のネームスペースの変更

    ◦ 簡単にいうと、JavaEE8(JakartaEE8)のアプリケーションは JakartaEE9と互換性はない ◦ つまり動かない。Java的に言うとClassNotFoundException Confidential Copyright ©︎ 2021 by Future Corporation
  43. Tomcat10以降のバージョン体系 • Tomcat10について ◦ Tomcat10.0.xはJakartaEE9をサポートする ◦ Tomcat9以前で稼働しているアプリケーションは Tomcat10では(マイグレーションしないと)動作しな い ◦

    まぁいつかはマイグレーションはしないといけないので 可能ならやりましょう。 Confidential Copyright ©︎ 2021 by Future Corporation
  44. 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
  45. 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
  46. 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
  47. Tomcat10以降のバージョン体系 • 複雑ですが、自分のアプリケーションをどのTomcatで実行す るのか適切に判断しましょう。 Confidential Copyright ©︎ 2021 by Future

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

    Confidential