CGIの利用

JettyはHTTPサーバとしても機能するので、CGIも使えるように設定できます
(最近はTomcatにもCGIServletなるものがあるようですが。。。)

これのやり方については、JettyのサイトのFAQにも載ってあります。
そこにあるやり方は、config XMLで設定する方法です。指定したContextに対して、CGIを動作させるサーブレットを起動するようになっています。
これだとなんか分かりづらかったので、私はweb.xmlに書いてみました
web.xml


  ...略...

  <!-- =============================== -->
  <!-- CGI Servlet   -->
  <!-- =============================== -->
  <servlet>
    <servlet-name>CGI</servlet-name>
    <servlet-class>org.mortbay.servlet.CGI</servlet-class>
    <init-param>
      <param-name>Path</param-name>
      <param-value>/usr/bin/:/usr/local/bin/</param-value>
    </init-param>
  </servlet>

 ...略...

  <!-- ==================================================================== -->
  <servlet-mapping>
    <servlet-name>CGI</servlet-name>
    <url-pattern>*.cgi</url-pattern>
  </servlet-mapping>

(web.xmlはDTDに従って記述する必要があるので、末尾にこの記述を追記すると、DTDに従っていないフォーマットになってしまうので、注意してください。)

このようにweb.xmlを記述し、CGIを動作させたいWebアプリケーションのWEB-INFに配置すればOKです。etc/webdefault.xmlに記述すれば、全てのアプリケーションで、.cgiで終わるファイルはCGIとして動作させることができます。

JSPを動作させるJspServletと同じように設定しています。サーブレット「org.mortbay.servlet.CGI」の初期化パラメータとして、Pathを指定する必要があります。CGI実行プログラムのパスです。(例えば、Perlなどを見つけられる場所)

注意
CGIを実行するユーザーはJettyを動作させたユーザです。rootでJettyを起動すると、root権限でCGIを実行してしまうので、非常に危険です。Jettyはrootで起動しないようにしましょう。
Apacheのsuexecみたいな機能は残念ながらないです。


CGIの利用」への3件のフィードバック

  1. こんにちは。
    いつも参考にさせていただいております。
    実は今jettyでPHPを使うため、上記のように設定を行ったのですが、
    以下のようなExceptionが発生します。
    java.lang.ClassNotFoundException: org.mortbay.servlet.CGI
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:420)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:373)
    at org.eclipse.jetty.util.Loader.loadClass(Loader.java:90)
    at org.eclipse.jetty.util.Loader.loadClass(Loader.java:70)
    at org.eclipse.jetty.servlet.Holder.doStart(Holder.java:81)
    at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:239)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55

    クラスが無いということなのかもしれませんが、org.mortbay.servlet.CGIのクラスを
    ロードもしくはインストールするためにはどのようにすればよいですか?
    環境はCentOS 5.4
    jetty7で動作させようとしております。

    かなり漠然としていて大変申し訳ありませんが、
    ご回答のほど、お願いいたします。

  2. はじめまして。横レス失礼します。
    私はJetty7.5でCGIが実行できなくて困っていたのですが、
    org.eclipse.jetty.servlets.CGIにクラス名を変えたところ、実行できるようになりました。

    civicさんのコメントのおかげで、助かりました。ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)