|
Tomcatのサーバ設定
Tomcatの「server.xml」の設定メモです。
共通のクラスライブラリを配置する
Java VMの設定
Managerの設定
MIMEタイプの設定
SSLの設定
Webアプリケーションの設定
共通のクラスライブラリを配置する
$CATALINA_HOME/libに必要な外部ライブラリのJARファイルを配置します。
開発プロジェクトの配置方針にもよりますが、次のようなJARはここに置くことになるかもしれません。
- log4j.jarとcommons-logging.jar
- JDBCドライバのJAR
- POIフレームワークのJAR
Java VMの設定
Java VMに関する設定は、
$CATALINA_HOME/bin/setenv.sh(Windowsではsetenv.bat)というファイルを自分で作って、
環境変数CATALINA_OPTSで指定できます。
以下はUNIXの例です。
CATALINA_OPTS="-server -Xmx256M"
export CATALINA_OPTS
|
-serverはサーバータイプのVMを使う設定、-Xmxは使用するメモリの最大サイズを指定します。
Tomcatを起動する際に使うシェル(catalina.sh、catalina.bat)に直接書いても良いのですが、
setenv.sh、setenv.batを自分で書いて配置する方法が良いと思います。
ちなみに、CATALINA_OPTSをcatalina.shとsetenv.shの両方に書くとどうなるの?答えはsetenv.shの設定が優先されます。
Java8以前で作ったプログラムが17以降で動かない…?
下のようなエラーが出るときは、多分Java9で実装されたモジュール機構に非対応のライブラリが悪さをしています。
InaccessibleObjectException: Unable to make field protected ... module A does not "opens B" to ...
|
レガシー塩漬けのコードなどで直しようがない場合、また今更Java8以前の古いバージョンで動かしたくない場合、
CATALINA_OPTSに次のようなもろもろを付けると動くことがあります。
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.io=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.util=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.naming/javax.naming=ALL-UNNAMED"
export CATALINA_OPTS
|
特に注意が必要なのはjavax.namingでエラーが出る場合です。
--add-opensの左がモジュール名、右がパッケージ名なので、
スラッシュの左側はjava.naming、右側はjavax.namingと微妙に違います。
Tomcatがファイルを新規作成するときのパーミッション
Tomcatのデフォルトでは、ファイルを新規作成するときのパーミッションは0640になります。
これはデフォルトの「umask」の値が0027になっているためで、8進数で666から0027を引くと0640になるわけです。
それで何が困るの?典型的な例では、Tomcatが出力したファイルをApache(httpd)で公開したい、みたいな場合で、
httpdの実行ユーザーは大抵daemonかnobodyですから、グループがTomcat起動ユーザーと違えばファイルが見れません。
そこでパーミッションを0644にしたければどうするの?
setenv.shに環境変数UMASKを定義し、値を「0022」にすれば8進数で666から引き算して0644になります。
UMASK="0022"
export UMASK
|
OracleのSQLでTO_DATE関数の日付書式を省略するとORA-01861エラーが発生する現象の解決
「ORA-01861: リテラルが書式文字列と一致しません」エラーが出る場合、
本来、TO_DATE関数の日付書式は省略せずに書くのが望ましいですが、古いプログラムで直すのも大変な場合、
何とかやり過ごすには、Java VM起動オプションで次のようにロケールを指定します。
CATALINA_OPTS="$CATALINA_OPTS -Duser.language=ja -Duser.country=JP"
|
日本語環境に設定すると、NLS_DATE_FORMAT のデフォルトが RR-MM-DD になるので、
書式指定なしで正しく認識されるようになります。
なお、Tomcat起動時にJavaVMのロケールではなく、環境変数NLS_LANGを設定すれば解決する、
という情報もあるようですが、私が試した所ではNLS_LANGでは解決しませんでした。
ちなみにこれはTomcatは関係なくOracleの仕様の話ですが、NLS_DATE_FORMATが RR-MM-DD
と年が2桁であっても、「2024-06-25」のように西暦4桁でも正しく認識されます。RRだけでなくYYも同様です。
Managerの設定
Tomcatには「Webアプリケーションマネージャ」(Manager)という、Webベースの管理ツールが付属しています。
初期設定の状態では、Managerは
「http://{host}:{port}/manager」というURLでアクセスできます。
このURLをブラウザで入力すると、ユーザ認証のダイアログが出るはずです。
Managerを使うには、manager-guiロール
を持つユーザでログインする必要があります。
このロールの設定をするファイルは $CATALINA_HOME/conf/tomcat-users.xml
で、ここに
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<user username="sysoper" password="passpass" roles="manager-gui"/>
</tomcat-users>
|
このように、rolesにmanager(manager-gui)を含むユーザを定義します。
usernameは何でも構いません。
初期設定ではこの部分全体がコメントになっているので、
自分で上記設定をしない限り、誰もログインできないようになっています。
Tomcatで配信するコンテンツのMIMEタイプ
TomcatをWebサーバとして使う際に、コンテンツの拡張子に対応するMIMEタイプを設定しておかないと、
Webブラウザが正しい扱いをしてくれないおそれがあります。
といっても、オープンな世界で使われている大半の拡張子は、
既に$CATALINA_HOME/conf/web.xmlで、初期設定で大方の状況で適切なMIMEタイプにマッピングが設定されています。
それ以外の独自の拡張子、
よくある例がMicrosoft Excelのワークシート(.xls)ですがそれらのマッピングをするには、
web.xmlに自分で書き加える必要があります。
<mime-mapping>
<extension>xls</extension>
<mime-type>application/x-excel</mime-type>
</mime-mapping>
|
orai18n.jarとgdk_custom.jarに関するエラーの抑制
TomcatのCLASSPATHにOracleのJDBCドライバ付属のorai18n.jarというJARを配置すると、
「gdk_custom.jarが見つかりません」みたいなエラーメッセージが大量に出ます。
実害はないのかもしれませんがTomcatの起動時に本当に対処が必要なエラーが埋没してしまうので、
ログが見づらい事この上ありません。このエラー出力を抑制するには、
$CATALINA_HOME/conf/context.xmlを編集して、以下の1行を追加すればOKです。
<Context>
...
<JarScanner scanManifest="false"/>
</Context>
|
シンボリックリンクを有効にする
Tomcatのデフォルト設定では、Webアプリケーションのコンテキストルート以下にシンボリックリンクがあっても、
それを辿ることはしません。シンボリックリンクを有効にするには、
$CATALINA_HOME/conf/context.xmlを編集して、以下の1行を追加すればOKです。
<Context>
...
<Resources allowLinking="true" />
</Context>
|
Webアプリが出力するPDF等が初回アクセス時には必ず404エラーになり、2回目以降は正常にアクセスできる現象の対応
Tomcatのサーバーサイドキャッシュが効いているとこの現象が起きます。
解決するにはキャッシュを無効にします。
最低限、cachingAllowedだけで良いのですが、過去のキャッシュも完全に無効にするには以下のようにします。
各値の意味は公式マニュアルの通りです。
<Context>
...
<Resources allowLinking="true" cachingAllowed="false" cacheTtl="1" cacheMaxSize="1" />
</Context>
|
ロードバランサーを使っている時に便利なRemoteIpValveの設定
AWSのELB(ALB)のようなロードバランサーを使っている時に便利な設定。三つの役目を果たします。
一つは、通常のTomcatでALBを挟むと、TomcatのログにはALBのIPアドレスが記録されてしまうのが、
下記の設定をすると本来のクライアントのIPアドレスに置き換わって記録される点。
Webアプリケーションの中でrequestのアドレス等を見て処理を分けている場合にそれが正常に動く点。
最後にALBがhttpsで接続を受けてTomcatにhttpで転送している環境で、
WebアプリがStrutsの <html:base>タグ、HTMLのbaseタグを使うと、
Webページはhttpsなのに読み込むjsやCSSはhttpで読もうとして「Mixed-Content」のブラウザエラーが発生するのを防げる点
(この設定をすると、baseタグはhttpsのURLで補完される)。
ちなみにここでは server.xml の Contextに設定していますが、
Webアプリケーション単位に指定したい場合は各アプリのxmlファイルのContext要素内に記述することもできます。
<Context>
...
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
protocolHeaderHttpsValue="https"
portHeader="x-forwarded-port" />
</Context>
|
SSLの設定
SSLの設定は、公式の
こちらに説明があります。
ここではTomcatを単独のWebサーバとして稼働させる場合のSSL設定方法をメモっています。
- JavaVMについているツール「keytool」を使い、キーストアファイルを作成します。
cd \Wintools\apache-tomcat-9.0.19\conf
keytool -genkey -alias tomcat -keyalg RSA -keystore ./tomcat.keystore
キーストアのパスワードを入力してください:******
新規パスワードを再入力してください:******
姓名を入力してください。
[Unknown]
組織単位名を入力してください。
[Unknown]
...
(後略)
|
コマンドを入力すると、キーストア・パスワードやクライアントに表示する名前、組織単位名、組織名、
都市名・都道府県名・国名(JP)の入力を求められるので順に入力します。
名前(User Name)は証明者を識別するものなので、公知の承認局(CA)などと混同されず、
自分(の組織)を一意に識別できる名前をつけます。
-
作成したキーストアファイルは、通常Tomcat実行ユーザーのホームディレクトリに配置します
(ファイル名は".keystore"がデフォルトだそう)が、
ここでは$CATALINA_HOME/conf/tomcat.keystore という名前で配置したものとします。
-
Tomcatの設定ファイル「server.xml」を編集します。
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="conf/tomcat.keystore" keystorePass="temptemp"
clientAuth="false" sslProtocol="TLS"/>
|
このブロックは最初コメント化されているので、コメントを解除してから編集します。
keystorePass はキーストア・パスワードがデフォルト値「changeit」
以外の場合には指定する必要があります。
またパスワードは大文字・小文字が区別されるので注意が必要です。
-
Tomcatを起動します。
-
Webブラウザで https://localhost:8443/ にアクセスして、
Tomcatのトップページ(猫の絵のページ)が表示されれば成功です。
その後、Webアプリケーションも配置して、Webアプリケーションとしての動作も確認します。
ところで…
「表示されれば成功です」ということですがそうは行かないはずです。
上の手順だけでは正規の認証局からの承認署名を登録していないため
(いわゆるオレオレ証明書)、例えばChromeで https://localhost:8443/ を開くと、
次のように表示されるはずです。
この接続ではプライバシーが保護されません
NET::ERR_CERT_AUTHORITY_INVALID
「詳細設定」を押すと一番下に「localhost にアクセスする(安全ではありません)」
というリンクが出るので、これを押すと本来のページに行けます。
ということで、正式なサービスとして稼働させる場合には、
正式な署名の登録も必要です。その手順は先の公式マニュアルに記載されています。
Webアプリケーションの設定
$CATALINA_HOME/conf の下に Catalina/localhost というディレクトリを自分で作って、
そこにWebアプリケーションごとにXMLファイルを配置します。以下は一例です。
<Context path="/shitenapp07" docBase="C:/usr/java/ec-projects/shitenapp07"
reloadable="true" crossContext="false" debug="0"
cachingAllowed="false" swallowOutput="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="shitenapp07_access" suffix=".txt" pattern="common"/>
<Resource name="jdbc/sadb" auth="Container" type="javax.sql.DataSource"
driverClassName="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost:9001/sadb"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
username="sa" password="temptemp"
maxWait="1000" maxActive="30" maxIdle="10"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" />
</Context>
|
以前のTomcatでは、デフォルトで接続プーリングがなかったため、
DBCPのクラス名をfactory=で明示的に指定する必要がありました。
今はfactoryを省略しても大丈夫なようです。
公式サイトの
JNDI Resources How-Toに詳しい説明が載っています。
path 属性に指定された [/***] は無視されました(?)
ところで、Tomcat起動後にログcatalina.outを見ると、
path 属性に指定された [/***] は無視されました
と出ています。これは修正が必要なの?と思って調べたら、このpathは原則無視されるので、
そのまま書いていても問題にはならないみたいです。
では、省略したらコンテキストパスはどうなるの?
それは、このconfに配置した設定ファイルの主ファイル名が採用されるようです。
つまり上記の例だとpathを省略しても、設定ファイルの名前が「shitenapp07.xml」ならば、
パスは自動的に「/shitenapp07」になる仕様のようです。

(first uploaded 2001/01/19 last updated 2025/07/27, URANO398)
|