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みたいな機能は残念ながらないです。
こんにちは。
いつも参考にさせていただいております。
実は今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で動作させようとしております。
かなり漠然としていて大変申し訳ありませんが、
ご回答のほど、お願いいたします。
それもう5年前の記事なんですよね。。。
Jetty7ではパッケージ名が変わったので、org.eclipse.jetty.servlets.CGIにクラス名を変えれば動くかもしれません(未確認)
そのあたりから調べてみてはどうでしょうか
http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/servlets/CGI.html
はじめまして。横レス失礼します。
私はJetty7.5でCGIが実行できなくて困っていたのですが、
org.eclipse.jetty.servlets.CGIにクラス名を変えたところ、実行できるようになりました。
civicさんのコメントのおかげで、助かりました。ありがとうございました。