Tomcat
Tomcat は Apache ソフトウェア財団によって開発されているオープンソースの Java Servlet コンテナです。
目次
インストール
tomcat7 または tomcat8 のどちらかをインストールしてください。
Tomcat を本番環境にデプロイするときは、tomcat-native をインストールすることも考慮してください。Tomcat のネイティブライブラリは Apache Portable Runtime (APR) ライブラリのネットワーク接続 (ソケット) と RNG 実装を使用するようにサーバーを設定します。ネイティブの32・64ビットのコードを使うことでパフォーマンスが改善されるので、速度が重要な本番環境でしばしば使われています。デフォルトの Tomcat に設定を加える必要はありません。詳しくは 公式の Tomcat ドキュメント を参照。
tomcat-native を使用すると catalina.err
の以下の警告が消えます:
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path [...]
ファイルシステム階層
パス名 | 目的 |
---|---|
/usr/share/tomcat7 |
スクリプトや他のディレクトリのリンクが存在する Tomcat のメインフォルダ。 |
/usr/share/java/tomcat7 |
Tomcat の Java ライブラリ (jar)。 |
/etc/tomcat7 |
設定ファイル。例: tomcat-users.xml (管理ツールを使用するユーザーやロールを定義), server.xml (Tomcat のメイン設定ファイル), catalina.policy (セキュリティポリシーの設定ファイル)。
|
/var/log/tomcat7 |
ログファイル。systemd からは処理されません (#ログを参照)。
|
/var/lib/tomcat7/webapps |
Tomcat がウェブアプリケーションをデプロイするフォルダ。 |
/var/tmp/tomcat7 |
Tomcat がウェブアプリのデータを保存するフォルダ。 |
初期設定
マネージャウェブアプリや管理者ウェブアプリを使用するには次のファイルを編集する必要があります: /etc/tomcat7/tomcat-users.xml
。
XML 宣言の "role and user" をアンコメントして、必要に応じてロール tomcat
, {{Ic|admin-{gui,script} }}, {{Ic|manager-{gui,script,jmx,status} }} を有効にしてください (Configuring Manager Application Access を参照)。簡単に説明すると、tomcat
は tomcat を実行するのに必須のロールで、manager-*
はウェブアプリケーションを管理することができるロール、admin-*
は Tomcat サーバーに関する全ての権限を持つ管理者です。
上記のロールとユーザー名、パスワードを定義すると以下のようになります ([CHANGE_ME] は適当なパスワードに置き換えてください):
/etc/tomcat7/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat"/> <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <role rolename="admin-gui"/> <role rolename="admin-script"/> <user username="tomcat" password="[CHANGE_ME]" roles="tomcat"/> <user username="manager" password="[CHANGE_ME]" roles="manager-gui,manager-script,manager-jmx,manager-status"/> <user username="admin" password="[CHANGE_ME]" roles="admin-gui"/> </tomcat-users>
上記のファイルに修正を加えたら、都度、Tomcat を再起動する必要があります。
ロールについては このブロク記事 に詳しい説明があります。
IDE と統合するために設定ファイルの読み込み権限を設定するには、tomcat グループ (使用しているバージョンによって tomcat7 または tomcat8 となります) にユーザーを追加してください:
# gpasswd -a <user> tomcat<number>
Tomcat の起動・停止
tomcat7
(または tomcat8
) サービスを起動してください。
Tomcat を起動したら、次のページを開いて動作していることを確認します: http://localhost:8080。素敵な Tomcat のローカルホームページが表示されたら、Servlet コンテナが問題なく立ち上がっています。起動スクリプトが上手く動作しなかった場合、ブラウザには Java のエラーだけが表示されます。systemd の journalctl を使って起動ログを確認してください。Tomcat のログに書かれている問題の答えは全て Google にあります。
手動で操作する方法
上流のスクリプトを使って Tomcat を直接制御することもできます:
/usr/share/tomcat/bin/{startup.sh,shutdown.sh,..}
アプリケーションや Tomcat をデバッグするときは上記のコマンドが役に立ちますが、一番最初に Tomcat を起動するときには systemd を使ってください。パーミッションが間違って設定されてウェブアプリが実行できなくなる可能性があります。また、上記のスクリプトを使用するには多少の設定が必要になります。上のノートに書かれている jsvc のセキュリティ機構が使えなくなることにも注意してください。
ウェブアプリケーションのデプロイと管理
Tomcat 7 には5つのウェブアプリケーションがバンドルされています (場合によっては localhost をサーバーの FQDN に変えてください):
- デフォルトホームページ: http://localhost:8080/
- Tomcat 7 のローカルドキュメント: http://localhost:8080/docs/
- Servlets と JSP のサンプル: http://localhost:8080/examples/
- バーチャルホストを管理するホストマネージャ: http://localhost:8080/host-manager/
- ウェブアプリケーションを管理するマネージャ: http://localhost:8080/manager/html/
GUI を使用する
マネージャウェブアプリ http://localhost:8080/manager/html を使用するのが一番簡単な方法です。tomcat-users.xml
で manager
に定義したユーザー名・パスワードを使ってください。ログインしたら、既に5つのウェブアプリケーションがデプロイされていることが確認できます。"Deploy" エリアからアプリケーションを追加して "Applications" エリアでアプリケーションを停止・起動・削除します。
CLI を使用する
WAR ファイルをアプリケーションディレクトリにコピーする方法もあります: /usr/share/tomcat7/webapps
。その場合、以下のように適切なホストで autoDeploy
オプションが設定されていることを確認してください:
/etc/tomcat7/server.xml
... <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> ...
webapps フォルダ以外にあるファイルをホスト
Context
を作成することで、プロジェクトを webapps フォルダ以外に配置することができます。/etc/tomcat<number>/Catalina/localhost/
を開いてコンテキストを作成してください。コンテキストはシンプルな xml ファイルで、tomcat が参照するべきディレクトリを指定します。ファイルの基本的なフォーマットは以下のようになっています:
/etc/tomcat7/Catalina/localhost/whatShouldFollowLocalhost.xml
<Context path="/whatSholdFollwLocalhost" docBase="/where/your/project/is/" reloadable="true"/>
実際の例は以下です。ユーザーの /home
フォルダにプロジェクトを配置しています:
/etc/tomcat7/Catalina/localhost/myProject.xml
<Context path="/myProject" docBase="/home/archie/code/jsp/myProject" reloadable="true"/>
上記のように設定すると /home/archie/code/jsp/myProject/
にプロジェクトのファイルを置くことができ、ウェブブラウザでプロジェクトを確認したいときはhttp://localhost:8080/myProject を開きます。tomcat がファイルをロードできない場合、おそらくパーミッションに問題があります。chmod o+x /home/archie/code/jsp/myProject
を実行してください。
ログ
公式の Arch Linux パッケージの Tomcat は systemd の journalctl で起動ログを記録します。/var/log/tomcat7/catalina.err
や /var/log/tomcat7/catalina.out
ファイルは使われません。/etc/tomcat7/server.xml
で Valve
と定義されている、アクセスログやビジネスログなどのログはデフォルトのまま /var/log/tomcat7/
に記録されます。
上流のようにログを保存したい場合、systemd ファイル /lib/systemd/system/tomcat7.service
を /etc/systemd/system/tomcat7.service
にコピーして、ログファイルの絶対パスを指定する SYSLOG
を変更してください。
Tips and tricks
基本的な設定はバーチャルホストのウェブアプリケーションで行うことができます: http://localhost:8080/host-manager/html 。tomcat-users.xml
で設定したユーザー名とパスワードを使ってください。他のオプションについては /etc/tomcat7
の設定ファイル (特に server.xml
) で変更できます。詳しくは Tomcat 7 の公式ドキュメント を参照。
前のバージョンの Tomcat からの移行
上に書いてあるように、Tomcat 8 によって Tomcat 7 が使えなくなることはありません。2つとも Servlet/JSP 標準の実装です。まず、あなたが使用したいアプリケーションがどのバージョンの Servlet/JSP を必要するのかによって Tomcat の 使用するバージョン を選択する必要があります。バージョンの移行が必要なときは、公式ウェブサイトに 移行を行う手順 が書かれています。
別の JRE/JDK で Tomcat を使用する
推奨されている JRE/JDK をインストールしない場合、Tomcat の systemd
サービスファイルで TOMCAT_JAVA_HOME
変数を設定してください。
Systemd#ユニットファイルの編集に書かれているように、カスタム設定で変数を上書きすることができます:
/etc/systemd/system/tomcat7.service.d
ディレクトリを作成- 作成したディレクトリの中に以下の内容で
start.conf
ファイルを保存 (Oracle の JDK パッケージ jdkAUR を使用する場合、/usr/lib/jvm/java-8-jdk
としてください):
[Service] Environment=TOMCAT_JAVA_HOME=/usr/lib/jvm/java-8-openjdk
もしくは、サービスファイル /usr/lib/systemd/system/tomcat7.service
を /etc/systemd/system/
にコピーして次の行を:
Environment=TOMCAT_JAVA_HOME=/usr/lib/jvm/java-7-openjdk
以下のように置き換えてください (例: Oracle JDK):
Environment=TOMCAT_JAVA_HOME=/opt/java
セキュリティ設定
このページはあくまで Tomcat の上でウェブアプリケーションを動かすために必要な最低限の設定について説明しています。Tomcat の管理に関する総合的なガイドではありません。必要な情報は Tomcat の公式サイトで収集できます。O'Reilly のページ や 大気研究大学連合のページ も参照すると良いでしょう。セキュリティのヒント:
- Tomcat 環境は常にセキュリティフィックスが適用された最新状態にしてください。
- 不必要な
examples
,docs
,ROOT
(manager
ウェブアプリの "_") などのデフォルトアプリケーションは削除してください。セキュリティホールになってしまう可能性があります。manager
を使ってください。
セキュリティを高めたい場合、host-manager と manager ウェブアプリケーションも削除します。ただし、後者はウェブアプリケーションのデプロイに役立ちます。
- WAR の自動デプロイオプションは無効化してください。
/usr/share/java/webapps
ディレクトリに WAR ファイルをコピーする権限が盗まれても勝手に実行されなくなります。server.xml
を編集してautoDeploy
をfalse
に設定:
/etc/tomcat7/server.xml
... <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false"> ...
- Tomcat のデフォルトエラーページを変更することで Tomcat のバージョンの漏洩を防げます。デフォルトで Tomcat がどのような表示をするのか確認するには、http://localhost:8080/I_dont_exist など適当なページを開いてみてください。ページの末尾に Tomcat のバージョンが記載されていることが確認できます。
変更するには、以下の JAR を編集してください (vim
などのエディタは zip を直接編集できます):
/usr/share/tomcat7/lib/catalina.jar
そして以下のファイルを編集します:
org/apache/catalina/util/ServerInfo.properties
... server.info= server.number= server.built= ...
server.xml
の使用していないconnectors
を無効化してください。- Keep restricted access to
/etc/tomcat7/server.xml
. Onlytomcat
user and/orroot
should be able to read and write this. - Keep
jsvc
usage. Do not use upstream startup scripts unless particular reason as explained in the security note above. - Use strong different passwords for each user in
tomcat-users.xml
, give roles to users who really need them and even disable usernames/roles you do not use/need.
以下のようにスクリプトを使うことで tomcat-users.xml
のパスワードを暗号化できます:
/usr/share/tomcat7/bin/digest.sh -a SHA NEW_PASSWORD
以下のように出力されます:
NEW_PASSWORD:b7bbb48a5b7749f1f908eb3c0c021200c72738ce
ハッシュ化された部分を tomcat-users.xml
に貼り付けて平文のパスワードを置き換えてください。そして server.xml
に以下を追加:
/etc/tomcat7/server.xml
<Host ... <Realm ... className="org.apache.catalina.realm.MemoryRealm" digest="SHA" ... /> ... />
Note that this may not be relevant because only root and/or tomcat is supposed to have read/write access to that file. If an intruder manages to gain root access then he would not need such passwords to mess with your applications/data anyway. Be sure to keep restricted RW access to that file!
- Always know what you are deploying