Jetty 中的 FastCGI
最后修改于 2024 年 1 月 27 日
Jetty 可以通过 FastCGI 来提供 PHP、Python 或 Ruby 脚本。FastCGI 是一种网络协议,主要由 Web 服务器用来与 FastCGI 服务器通信。FastCGI 服务器用于提供由动态 Web 语言(包括 PHP、Python、Ruby、Perl 等)生成的 Web 内容。
处理 CGI 脚本的 Servlet 称为 org.eclipse.jetty.servlets.CGI。该 Servlet 是异步的,因此,我们必须将 <async-supported>true</async-supported> 添加到 web.xml 文件中。
<!DOCTYPE html>
<html>
<body>
Get environment <a href="cgi-bin/evars.py">variables</a>
</body>
</html>
当我们的 Web 应用程序启动时,它会显示这个简单的 HTML 文件。一个链接指向一个 Python CGI 脚本,用于获取环境变量。
#!/usr/bin/python
import sys
import os
from cgi import escape
print "Content-type: text/html"
print
print "<!doctype html>"
print "<html>"
print "<body>"
print "<pre>"
for k in sorted(os.environ):
print "<b>%s: </b>%s" %(escape(k), escape(os.environ[k]))
print "</pre>"
print "</body>"
print "</html>"
我们的示例将处理这个 Python 脚本。它创建一个简单的 HTML 页面,其中包含环境变量。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>CGI</servlet-name>
<servlet-class>org.eclipse.jetty.servlets.CGI</servlet-class>
<init-param>
<param-name>Path</param-name>
<param-value>/bin:/usr/bin:/usr/local/bin</param-value>
</init-param>
<init-param>
<param-name>cgibinResourceBaseIsRelative</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>commandPrefix</param-name>
<param-value>/usr/bin/python</param-value>
</init-param>
<init-param>
<param-name>cgibinResourceBase</param-name>
<param-value>WEB-INF/cgi-bin</param-value>
</init-param>
<async-supported>true</async-supported>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CGI</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
这是应用程序的 web.xml 文件。它将 CGI Servlet 映射到 /cgi-bin/* URL 模式。在欢迎文件列表中,我们指定了包含指向 Python 脚本链接的 index.html 文件。cgibinResourceBaseIsRelative 将 cgi-bin 目录的路径设置为相对于 Web 应用程序文档根目录。commandPrefix 参数指定了 Python 解释器的路径。
<?xml version="1.0" encoding="UTF-8"?>
<project name="FastCGIServlet" default="archive">
<property name="name" value="cgiexample"/>
<property environment="env"/>
<property name="src.dir" value="src"/>
<property name="web.dir" value="${src.dir}/web"/>
<property name="dist.dir" location="dist"/>
<property name="deploy.path" location="${env.JETTY_BASE}/webapps"/>
<target name="init">
<mkdir dir="${dist.dir}"/>
</target>
<target name="archive" depends="init">
<war destfile="${dist.dir}/${name}.war"
webxml="${web.dir}/WEB-INF/web.xml">
<fileset dir="${web.dir}"/>
</war>
<echo>Archive created</echo>
</target>
<target name="clean" depends="init">
<delete dir="${dist.dir}"/>
<echo>Cleaning completed</echo>
</target>
<target name="deploy" depends="archive">
<copy file="${dist.dir}/${name}.war" overwrite="true"
todir="${deploy.path}"/>
<echo>Archive deployed</echo>
</target>
</project>
Ant 的 archive 任务创建了一个 Web 归档文件,其中包含 index.html 文件、web.xml 文件以及 WEB-INF/cgi-bin/ 子目录中的 Python 脚本。deploy 任务将 WAR 文件复制到 Jetty 基础的部署目录中。
$ java -jar $JETTY_HOME/start.jar --add-to-start=http,deploy,servlets
假设我们还没有在 Jetty 基础中启用任何模块,我们启用了这三个模块。Jetty CGI Servlet 在 servlets 模块中。
$ java -jar $JETTY_HOME/start.jar
我们启动 Jetty 服务器。现在我们可以导航到 https://:8080/cgiexample/ URL。
在本章的 Jetty 教程中,我们使用 Jetty 的 CGI Servlet 执行了一个 Python 脚本。
作者
列出所有Java教程。