Tomcat

提供: ArchWiki
移動先: 案内検索

Tomcat は Apache ソフトウェア財団によって開発されているオープンソースの Java Servlet コンテナです。

ノート: Tomcat には現在2つの安定ブランチが存在します: 7, 8。新しいバージョンしか動作しないということはなく、各ブランチはそれぞれ "Servlet" と "JSP" の Java 標準仕様を実装 しています。Arch Linux では全てのバージョンが公式にサポートされています: tomcat7, tomcat8。使用したいウェブアプリケーションの要件にあわせて必要なバージョンは変わります。Tomcat を試してみたいだけであまり時間を割きたくない場合、tomcat7 を試してみると良いでしょう。この wiki ページでは tomcat7 について記述していますが、大体の内容は tomcat6 や tomcat8 でも同じです。

インストール

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, admin-{gui,script} , 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 にあります。

ノート: セキュリティを確保するために、Arch Linux の Tomcat パッケージは Apache の common-daemonsjsvc バイナリを使っています。Tomcat の systemd サービスは Apache のバイナリを root 権限で実行しますが、Tomcat は非特権ユーザーで起動されます (Arch Linux の場合 tomcat7:tomcat7)。これによって、悪意のあるウェブアプリケーションによる攻撃コードの実行を防ぐことができます。また、必要な場合、1024番ポートが使われます。/etc/conf.d/tomcat7CATALINA_OPTS 環境変数で指定することができるオプションについては man jsvc を参照してください。

手動で操作する方法

上流のスクリプトを使って Tomcat を直接制御することもできます:

/usr/share/tomcat/bin/{startup.sh,shutdown.sh,..}

アプリケーションや Tomcat をデバッグするときは上記のコマンドが役に立ちますが、一番最初に Tomcat を起動するときには systemd を使ってください。パーミッションが間違って設定されてウェブアプリが実行できなくなる可能性があります。また、上記のスクリプトを使用するには多少の設定が必要になります。上のノートに書かれている jsvc のセキュリティ機構が使えなくなることにも注意してください。

ウェブアプリケーションのデプロイと管理

Tomcat 7 には5つのウェブアプリケーションがバンドルされています (場合によっては localhost をサーバーの FQDN に変えてください):

GUI を使用する

マネージャウェブアプリ http://localhost:8080/manager/html を使用するのが一番簡単な方法です。tomcat-users.xmlmanager に定義したユーザー名・パスワードを使ってください。ログインしたら、既に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.xmlValve と定義されている、アクセスログやビジネスログなどのログはデフォルトのまま /var/log/tomcat7/ に記録されます。

上流のようにログを保存したい場合、systemd ファイル /lib/systemd/system/tomcat7.service/etc/systemd/system/tomcat7.service にコピーして、ログファイルの絶対パスを指定する SYSLOG を変更してください。

ヒントとテクニック

基本的な設定はバーチャルホストのウェブアプリケーションで行うことができます: http://localhost:8080/host-manager/htmltomcat-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#ユニットファイルの編集に書かれているように、カスタム設定で変数を上書きすることができます:

  1. /etc/systemd/system/tomcat7.service.d ディレクトリを作成
  2. 作成したディレクトリの中に以下の内容で 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 を編集して autoDeployfalse に設定:
/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. Only tomcat user and/or root 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