Tomcatでは、いままでもスレッドプールには対応していましたが、コネクタごとにしか設定できませんでした。Tomcat 6からは、ほかの<Executor>タグの実装によりコンポーネント間でもスレッドプールを共有できるようになりました。この機能について軽く説明しておきましょう。
<Executor>タグは<Server>タグ要素の子として設定できるようになっています。このタグを設定することで1つのサービス内でスレッドプールを共有できます。
さて、それでは内容を簡単に見てみましょう。<Executor>タグは標準で以下の属性を設定できます。
要素 | 内容 |
---|---|
className | 実装するJavaのクラス名。org.apache.catalina.Executorインターフェイスの実装が必要。指定しなければ標準のorg.apache.catalina.StandardThreadExecutorインターフェイスが実装される |
name | このプールをserver.xml上で参照するために使う名前。名前は一意である必要がある |
また、標準実装では以下の属性を設定できます。
要素 | 内容 | デフォルト値 | 型/クラス |
---|---|---|---|
threadPriority | excutor内のスレッドのプライオリティを設定 | Thread.NORM_PRIORITY | int |
daemon | スレッドをdaemonスレッドにするかどうかを設定 | true | boolean |
namePrefix | executorが作る各スレッドに付く名前のプリフィックスを設定。個々のスレッドのスレッド名はnamePrefix+threadNumberになる | なし | String |
maxThreads | このプールのactiveスレッドの最大個数を設定 | 200 | int |
minSpareThreads | 常時即応できるように待機しているスレッドの最小個数を設定 | 25 | int |
maxIdleTime | acitveスレッドの個数がminSpareThreadsを超えているとき、アイドル状態のスレッドがシャットダウンするまでのミリ秒単位の時間 | 60000(1分) | int |
ただし、<Executor>タグは<Connector>タグの前に設定しなければ、<Connector>タグに利用されない点に注意する必要があります。
次に、context.xmlの設定について見ていきましょう。contexist(コンテキスト)とは、Tomcat上で実行される1個のWebアプリケーションのことです。コンテキストには、アプリケーションの実行に必要なファイルが含まれています。
以前までのTomcatと違い、Tomcat 6では、<Context>タグはserver.xmlに記述することは推奨されていないため、context.xmlに記述するのが一般的です。
context.xmlは$CATALINA_HOME/conf/context.xmlに設置することで全体の設定を行えます。エンジンごとに個別に設定する場合には、$CATALINA_HOME/conf/[エンジン名]/[ホスト名]/に設置できます。この場合、ディレクトリ配下にxml拡張子のコンテキスト名のファイルを作ることで特定のコンテキスト用のcontext.xmlを作成できます。
複数のホストを運用したりしない限りはデフォルトのままでも機能的には足りることが多いので、設定できるタグや詳細な情報はこちらをご覧ください。
デフォルトのcontext.xmlの中身
<!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> </Context>
最後にweb.xmlを見ていきましょう。web.xmlはWebアプリケーションの動作を制御するために利用されます。
context.xmlと同様に$CATALINA_HOME/conf/web.xmlに設置することで全体の設定ができます。個別に設定する場合には、それぞれのアプリケーションを格納したディレクトリ以下のWEB-INF内に格納されます。
前回作成したweb.xmlの中身
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
web.xmlの書き方については、ここでは解説いたしませんので、JCP(Java Community Process、Javaの仕様が掲載されている)などでServlet 2.5の解説をご覧ください。
それでは、最後にTomactの運用で悩むログ管理についての設定を行ってみましょう。アプリケーションのログファイルは放っておくとかなり大きくなり、リソースを大量に消費してしまいます。このような場合には、ログをローテーションして整理するのがお勧めです。
CentOSでは、ログ管理ソフトウェアとして“logrotate”というソフトウェアが導入されています。このソフトウェアを使ってログをローテーションしてみましょう。
まず、設定ファイルを作成します。logrotateは追加パッケージ用の設定ファイルをincludeして利用するようになっており、専用の設定ファイルを作成します。設定ファイルを開いたら、次の内容で記入して作成します。
/opt/tomcat6/logs/*.out { copytruncate monthly missingok notifempty compress rotate 12 postrotate /bin/kill -HUP `cat /var/run/tomcat6.pid 2>/dev/null` 2> /dev /null || true endscript }
これで、後は放っておいても月1回ローテーションされるようになります。ログは1年分残すようにして、過去のものはgzipで圧縮して保存します。
それでは実際に、logrotateを使ってみてください。すると、読者がお使いのTomcatサーバのログディレクトリ(/opt/tomcat6/logs/)の中身はTomcatのログ(catalina.out)以外は恐らく何もない状態になっていることでしょう。
drwxr-xr-x 2 tomcat root 4096 11月 10 02:42 .
drwxr-xr-x 9 tomcat root 4096 9月 22 00:12 ..
-rw-r--r-- 1 root root 113916 11月 10 02:42 catalina.out
念のため、本当にログがローテーションできるかどうかをコマンドラインから実行してみましょう。強制的にログをローテーションさせるために、以下のコマンドを実行してみてください。
logrotate -f /etc/logrotate.d/tomcat
コマンド実行後にコマンドラインに戻ったら、再度ログディレクトリをのぞいてみると、
drwxr-xr-x 2 tomcat root 4096 11月 10 02:46 .
drwxr-xr-x 9 tomcat root 4096 9月 22 00:12 ..
-rw-r--r-- 1 root root 120570 11月 10 02:46 catalina.out
-rw-r--r-- 1 root root 12720 11月 10 02:46 catalina.out.1.gz
このように前のログファイルがgzipで圧縮された形で残っていれば設定は成功です。
この方法を用いれば、各アプリケーションで出力するログファイルもlogrotateに設定を追加することで簡単にローテーションできるようになりますので、ぜひお試しください。
今回は以上で終わりですが、次回はTomcat 6の新機能の1つであるCometを利用して、簡単なチャットアプリを作成します。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.