: O. Yuanying

mod_proxy_ajpによるApache - Tomcatの連携

mod_jkがいつの間にか非推奨になっており、Apache - Tomcat間の連携はmod_proxy_ajpを利用しろとのこと。

Fedora Core 5にインストールされているApacheは最初からmod_proxy_ajpを組み込まれているようなので「/etc/httpd/conf.d/proxy_ajp.conf」に以下のように記述すればOK。

<Location /test/>
    ProxyPass ajp://localhost:8009/hoge/
</Location>

以上により、http://localhost/test/*へのリクエストがajp://localhost:8009/hoge/*に転送されます。

VirtualHostを利用している場合もVirtualHostディレクティブ内にProxyPassを記述すればよい。

<VirtualHost 192.168.1.99:80>
    ServerAdmin webmaster@fractus.info
    DocumentRoot /var/www/html
    ServerName www.fractus.info
    ErrorLog logs/www.fractus.info-error_log
    CustomLog logs/www.fractus.info-access_log combined

    ProxyPass /horicuhi/ ajp://www.fractus.info:8009/horiuchi/
</VirtualHost>

ただ、サーバルートへのリクエストをTomcatに連携するときに少々はまった。

具体的には、http://www.mubou.org/へのリクエストをajp://www.mubou.org:8009/に転送したときに、HttpServletRequest#getContextPath()の返り値が「horiuchi」という意味不明な文字列を返したこと。

本来ならばサーバルートへのリクエストなんだからHttpServletRequest#getContextPath()は空文字を返さなければいけないはずなのに、設定ファイル内を色々いじっても全然なおらない。

ちなみにTomcatの設定ファイルでは「$TOMCAT_HOME/conf/Catalina/www.mubou.org/horiuchi.xml」内において以下のように記述していた。

<Context path="" docBase="/tomcat/web/mubou/horiuchi"
        debug="0" privileged="true">
</Context>

結局は設定ファイルの名前を「$TOMCAT_HOME/conf/Catalina/www.mubou.org/horiuchi.xml」から「$TOMCAT_HOME/conf/Catalina/www.mubou.org/.xml」に変更したらうまくいった。

HttpServletRequest#getContextPath()って設定ファイルの名前から値を取得してたんですねえ...ってそんな馬鹿なw

普通Contextタグ内のpath属性の値だと思うよねえ...。まあ仕様書読んでない私が悪いんだろうけどさ。