プロジェクト

全般

プロフィール

Tomcat設定

はじめに

本記事は、Tomcat 10.1をベースに記述しています。

配備

warファイルの配備

warファイルの配置場所と自動展開有無

Tomcatのconf/server.xml にHost要素で配置場所とwarファイルの自動展開の設定を定義しています。

     <Host name="localhost"  appBase="webapps" 
            unpackWARs="true" autoDeploy="true">
  • appBaseに、tomcatのインストールディレクトリしたディレクトリ下のアプリケーション配置ディレクトリを定義
  • unpackWARsに、warファイルをアプリケーション配置ディレクトリに置いたときに自動で解凍・展開するかどうかを定義
  • autoDeployに、Tomcatサーバー稼働中にwarファイルまたはアプリケーションのディレクトリ一式をアプリケーション配置ディレクトリに配置したときに、自動的に読み込むかどうかを定義。falseにするとTomcatサーバーの起動時にのみアプリケーションを読み込む。

context.xml

各アプリケーションごとに定義します。

  • warファイルの/META-INF/context.xmlに、パラメータの設定、クラスパスの設定を記述し、web.xmlの設定を補足可能
  • autoDeploy、deployOnStartupが有効なときは、context.xmlにpath属性を指定しても反映されない

memo
warファイルの/META-INFの下の設定ファイルは、サーブレットコンテナ製品によってファイル名、設定可能な範囲が異なります。

バージョニング

warファイル名を、アプリケーション名##バージョン名.war と記述することで、コンテキストパスをアプリケーション名として展開し、バージョン名を変えることで同じアプリケーションの異なるバージョンを複数並行してアクセス可能となり、新しいセッションは新しいバージョンのアプリケーションに割り振られ、古いバージョンのアプリケーションのセッションはセッションが終了するまで古いバージョンのアプリケーションを使用します。

バージョンの新旧は、バージョン名の文字列的なオーダー(辞書順)になるようです。

JDBCドライバー

アプリケーションのWEB-INF/libに配置したドライバーを使用する場合、service providerの仕組みによるJDBCドライバーのロードができません。
Tomcatは、アプリケーションごとに異なるクラスローダーを使用するのですが、service providerは、システムクラスローダーでロードする必要があるので、Tomcatの $CATALINA_HOME/lib$CATALINA_BASE/lib にJDBCドライバーを置く必要があるようです。

https://tomcat.apache.org/tomcat-10.0-doc/jndi-datasource-examples-howto.html

配置の検討

Tomcatの $CATALINA_HOME/lib にJDBCドライバーを配置すると、

  • 追加・更新の際にTomcatサーバーの再起動が必要となります。
  • 同じドライバーでバージョン違いのものを配置するのは難しいかもしれません。

設定

Tomcatサーバー設定

リクエストおよびレスポンスのエンコーディング

<Tomcatインストールディレクトリ>/conf/web.xml には次の設定が記述されています。

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" 
  version="6.0">

  <!-- ======================== Introduction ============================== -->
  <!-- This document defines default values for *all* web applications      -->
  <!-- loaded into this instance of Tomcat.  As each application is         -->
  <!-- deployed, this file is processed, followed by the                    -->
  <!-- "/WEB-INF/web.xml" deployment descriptor from your own               -->
  <!-- applications.                                                        -->
  <!--                                                                      -->
  <!-- WARNING:  Do not configure application-specific resources here!      -->
  <!-- They should go in the "/WEB-INF/web.xml" file in your application.   -->

  <!-- Set the default request and response character encodings to UTF-8.   -->
  <request-character-encoding>UTF-8</request-character-encoding>
  <response-character-encoding>UTF-8</response-character-encoding>
  : 以降略

ここに、次の記述(再掲)があり、リクエストの文字コード、レスポンスの文字コードがUTF-8で定義されています。
これは、Servlet 4.0仕様で定義されたweb.xmlの要素です。

  <request-character-encoding>UTF-8</request-character-encoding>
  <response-character-encoding>UTF-8</response-character-encoding>

コネクタのエンコーディング

HTTP Connectorには、URIEncodingの属性があり、URIエンコーディング(%と文字コードで表現)のURIバイトの文字コードを指定します。
デフォルトはUTF-8となっています。

<Tomcatインストールディレクトリ>/conf/server.xml の Connector要素に記述します。

プログラミング

JNDIデータソース

データベースのコネクションプーリングとclose

Tomcatのドキュメントより、Preventing database connection pool leaks
https://tomcat.apache.org/tomcat-10.0-doc/jndi-datasource-examples-howto.html

  • Webアプリケーションは明示的に ResultSet、Statement、Connectionをクローズすべき
  • クローズされない場合、コネクションプールのリークが発生する


3日前に更新