2008年1月17日木曜日

Tomcat 6.x によるCGIの実行について

PerlやRubyなどのスクリプトをCGIで実行するには
Apache等のサーバの設定を書き換えればできます。
Apacheならhttpd.confでコメントアウトされてる部分のコメントを取り除けば
普通に実行できます。その辺の細かいことは他に資料が沢山あるので別にいいでしょう。

Tomcatにも簡易Webサーバの機能があるのですが、TomcatのWebサーバだけでもCGIを実行することが出来ます。

$CATALINA_HOME/conf/web.xmlを開いて($CATALINA_HOMEはtomcatを入れた所です)

<servlet>
<servlet-name>cgi</servlet-name>
長いので省略

この部分と

<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>

この部分がコメントアウトされているのでコメントを除去します。

ここで、web.xmlのコメントでは
$CATALINA_HOME/server/lib/servlets-cgi.renametojar

$CATALINA_HOME/server/lib/servlets-cgi.jar
にファイル名を変えろといってます。
Tomcat5.xまではこの/server/lib/があったのですが
Tomcat6.xでは/server/lib/が見当たりません。

このservlets-cgi.jarは6.xでは
$CATALINA_HOME/lib/catalina.jar
に入っています。
jarをzipに変えて中を見てみると
org/apache/catalina/servlets
の中にCGIServlet.classがあるのが分かります。

じゃあweb.xmlを書き換えるだけでCGI使えるじゃない。
・・・と思ったら使えない。
catalinaのログファイルを見てみると

java.lang.SecurityException: クラス org.apache.catalina.servlets.CGIServlet のサーブレットは特権を与えられているので、このWebアプリケーションによってロードできません

とか言われてます。何のことやらさっぱりです。

で、色々見て回った結果、context.xmlのContext要素に
privileged="true"
を付け加えればいけるみたいです。

これで多分Tomcat単体のWebサーバでCGIが実行できるようになるはず。
後でprivileged属性の意味とか調べておこう。

まあTomcatでCGIを実行する機会なんてそうないですが。
ほとんどはApacheとTomcatを繋いで使うと思いますし
JSPとCGIを併用なんてしないと思うので
これが役に立つことはあまりないですがせっかくなので書いておこう。

2/12追記
どうやらWebアプリケーションがサーブレットコンテナを使うためにはContext要素のprivileged属性をtrueにする必要があるみたい。…すごい基本的なことですね。

まぁ色々セキュリティ上の問題があるかもしれませんが、その辺は適当にやってください。

0 件のコメント: