7のtomcatパッケージでこちらを実装してみます。7のtomcatパッケージには2種類のsystemd.execファイルが用意されています。~]#tomcat@.serviceの先頭に以下の記述があり、こちらの手順を模倣するとcatalina.baseの分離ができそうなので早速やってみます。profit.まずはnameにinst1を指定してenableにしてみます。~]#次に/var/lib/tomcats以下にcatalina.baseディレクトリを用意してパッケージデフォルトの内容をコピーします。.webapps以下の不要なアプリケーションは削除します。catalina.baseを指定する設定ファイルは/etc/sysconfig/tomcat@inst1として用意します。これは/etc/tomcat/tomcat.confの先頭に説明があります。/etc/sysconfig/tomcat@instance.ファイルを作成してCATALINA_BASEとCATALINA_TMPDIRを設定します。/etc/sysconfig/tomcat\@inst1サービスを起動してみます。tomcat@inst1catalina.baseやjava.io.tmpdirが分離された状態で起動されていることが確認できます。start利用するポート番号変更などインスタンス個別の設定は、/var/lib/tomcats/inst1/conf以下を編集することで対応できます。daemonによりますと、Tomcarデーモンの起動はcommons-daemonプロジェクトのjsvcツールを使うのがよしとされています。あわせて$CATALINA_HOME/bin/daemon.shが起動用rcスクリプトのテンプレートとして使えるとの情報があるのですが、コピーして加工するのも面倒なので、daemon.shを呼び出す形式での起動用rcスクリプトを用意してみました。6で動作することを確認しています。$?daemon.shの引数で起動ユーザーを指定することもできますが、デフォルトtomcatなので未指定にしています。変更したい場合は–tomcat-userをdaemon.sh呼び出し時の引数に追加してみてください。他にdaemon.sh呼び出し時に指定できる引数は–catalina-baseと–catalina-pidがあります。daemon.shを追いかけてみるとわかるのですが、catalina.shを使うときと同様にsetenv.shが呼び出されるので、CATALINA_OPTSやLANG等、他に必要な変数をそちらに記述していくことができるので便利かと思っています。042008mod_jkでlbワーカを使う場合、セッションによって振り分け先を固定化するためにsticky_sessionという属性が用意されている(デフォルトtrue)。実際のところ、どういう動きになるのかソースを追ってみた。service()部分のここらへん。}get_sessionid()もjk_lb_worker.cで実装されていて、以下のようになっている。}URLパスからsession_path入手を試み、ダメならsession_cookieから値を設定している。この時点でURLパスに含まれるsession_path値のほうがsession_cookieよりも優先されることが判明。ちなみにget_path_param()もget_cookie()もjk_lb_worker.cで実装されていて、get_path_param()のほうはURLパスからp->session_pathで始まる値の”=”以降、終端(?か;か\0)までを返すようになっている。get_cookie()も似たような処理なので割愛。l);で一致するsessionidを探し、なければfind_best_worker()でワーカを決定するようになっている。なんとなく動きはわかったものの、JSESSIONIDという文字列がどこにも出現しないので、今度はそちらを追いかけてみることに。JSESSIONIDはjk/native/common/jk_global.hの中でJK_SESSION_IDENTIFIERとして定義されている。JK_SESSION_IDENTIFIERを参照してるのはjk_lb_worker.cのjk_get_lb_session_cookie()呼び出し部分。JK_SHM_STR_SIZ);jk_get_lb_session_cookie()はjk/native/common/jk_util.cで定義されていて、JK_SESSION_IDENTIFIERはjk_map_get_string()にそのまま渡している。jk_map_get_string()は、結局MAKE_WORKER_PARAM(SESSION_COOKIE_OF_WORKER)マクロでworker.ワーカ名.session_cookieの設定値(デフォルト”JSESSIONID”)を返すようになっていた。jk_get_lb_session_path()もほぼ同じでMAKE_WORKER_PARAM(SESSION_PATH_OF_WORKER)によりworker.ワーカ名.session_path設定値(デフォルト”;jsessionid”)を返す。結局のところ、こちらは両方ともworker.propertiesでの設定値かデフォルト値かを設定しているだけ。ここで設定されたキー(p->session_path=”;jsessionid”かp->session_cookie=”JSESSIONID”)をベースに最初に出てきたget_most_suitable_worker()で振り分け先を決定している、ということになる。202008Tomcatのバイナリ1個で、複数のインスタンスをサービス登録してみました。インスタンス別にCATALINA_BASE配下ディレクトリ(conf,logs,temp,webapps,work)を分けて、Tomcatが使うポート番号も変えてあげれば、バイナリは共通のまま複数インスタンス化することができます。28009まずは以下の手順で各種ディレクトリと設定ファイルを準備。apache-tomcat-6.0.18.zipを入手し、C:\apache\tomcat-6.0.18に展開C:\apache\tomcat-instance1を作成し、C:\apache\tomcat-6.0.18からconf,logs,temp,webapps,workディレクトリをコピーC:\apache\tomcat-instance1\conf\server.xmlのポート番号を変更C:\apache\tomcat-instance2も同様に作成デイレクトリと設定ファイルが準備できたら、service.batコマンドで登録。installed.CATALINA_BASE環境変数を変えて、2個めのインスタンスも同様に登録します。installed.今回は簡単に済ませるためにservice.batコマンドを使いましたが、tomcat6w.exeを使うともっと細かいパラメータを指定して登録することができます。登録したサービスの設定変更をおこなうことも可能です。HOW-TOをご覧ください。Persistenceのハナシではありません。Persistence)。場合によっては便利ですが、セッションに積むインスタンスがシリアライズに対応していないとExceptionが発生したり、作りによっては都合がよくありません。Componentでおこなってますので、こちらの設定で無効化することができるようになってます。/>と書かれた部分がありますのでこちらを有効にします。デフォルトではSESSIONS.serというファイル名なのですが、それをnullにしているので保存しないようになります。Conponentでは、このほかにセッションIDの長さ(sessionIdLength)や、最大セッション数(maxActiveSessions)などを設定することができるようになってます。Managerの設定はContext単位になりますので、バーチャルホストやアプリケーション毎に設定することも可能です。Containerを。Managerがあったのですが、当時はExperimentalと注意書きされていました。122007Tomcat起動時のJava引数でJMXエージェントを有効化するオプションを追加してやればサーバ側はOK。bin/setenv.shでCATALINA_OPTSに追加してやる。\"あとはJConsoleを実行する側でサーバ名とポート番号(上の例では8686)を指定して接続すればよい。ちなみに上の指定はSSLも認証もなしの状態なので、クローズドなN/W経由で利用しないと危険。JMXエージェントとのやりとりはRMIでおこなわれるので、jmxremote.portで指定した番号以外のポートも使われる。Firewallを経由する場合は注意が必要。JDTを使うようになったそうです。javacが不要になったのでJDKではなくJREでも動かすことができると。VM使いたければJDKが必要になります。5.0まではコンパイラの変更もweb.xml設定でOKだったのですが、それが少しややこしくなったようです。以下のスレッドでコンパイラをjikesに変更する方法が話題になってます。Kit)を入れなきゃいけないの?」と思ってたのですが、やっとRuntimeだけでもいけるようになったということですね。262007アプリケーションの実装としてではなく、Tomcatレベルで変更する方法です。@ITのフォーラムには以下のQAがあります。Solutionこちらによれば、Tomcatは「セキュアな通信の場合CookieにSecureを付与してくれる」ことになります。ところがApacheやTomcatでSSLしてる場合はよいのですが、SSLアクセラレータやロードバランサ、stunnelなどでSSLを解除しているとsecureと認識されなくなってしまい、Secure属性が付与されなくなってしまいます。TomcatのAJP13コネクタ定義にはsecureという属性があり、こちらをtrueに設定するとresponse.isSecure()にtrueを返してくれるようになります。false.ですのでserver.xmlのコネクタ定義で以下の設定をおこなえば、毎回cookie.setSecure(true)が実行されて、CookieにSecureが付与されるようになります。102007厳密な方法ではありません。禁止ではなく防止できるかも、というレベルです。rcスクリプト等でtomcatの起動ユーザをroot以外にしていたとします。;;ですが、$CATALINA_HOME/bin/startup.shを直接実行されるとtomcat以外のユーザで起動されてしまう可能性があります。そこでsetenv.shを使い、tomcatユーザ以外で実行した場合にメッセージを出して終了するようにしてみました。"tomcatユーザ以外では起動しないでください。{start|stop}を使ってね。exitfi:こうしておけば、startup.shレベルであれば起動ユーザをチェックできると思います。Foundなどのデフォルトエラーページ出力は、org.apache.catalina.valves.ErrorReportValveクラスで実装されている。このクラスはHostコンテナのerrorReportValveClass属性で変更可能なので、errorReportValveClass=””としてしまえば、Tomcat標準のエラーページは出力されず、HTTPステータスコードだけが返るようにできるようだ。Containerこのクラスのソースを見ると出力メッセージはLocalStrings.propertiesで定義されている文字列が出力されていることがわかる。org.apache.catalina.valves.ErrorReportValve.javaLocalStrings.propertiesLocalStrings_ja.propertiesまぁ、このクラスやプロパティファイルを置き換えるよりweb.xmlでerror-page定義したほうが楽ですけど。ApacheがTomcatからのHTTPステータスコードにしたがってエラーページを返すようになってくれれば、Apache側で定義したErrorDocumentに統一できて楽なのではないかと思う今日この頃。