Tomcat 主要充当 Servlet/JSP 容器,不过它却含有大量的功能可以与传统的 Web 服务器相媲美。例如,对公共网关接口(Common Gateway Interface,CGI)的支持就是其中之一。
传统的 Web 服务器为了响应浏览器的请求,提供了一种方式去运行外挂程序。该外挂程序常常用于处理基于 Web 的表单,而这种机制称为 CGI。
CGI 之所以称为通用,是因为它几乎可以调用所有编程或脚本语言,如:Perl、Python、awk、Unix shell 脚本,甚至还可以选择性地支持 Java。实际上,由于启动负荷过载,您可能不会将 Java 应用程序当成 CGI 来执行。而设计 Servlet 规范的起因就是为了消除这种系统负载过载。Servlet 几乎永远都比 CGI 高效,因为每次当有人点击链接或按钮时,并不会启动新的进程(进程开销很大)。
下面将介绍在 Tomcat 中怎样去开启 CGI 支持。Tomcat 默认包含了一个可选的 CGI Servlet,以用来执行遗留的 CGI 脚本。
默认情况下,Tomcat 并没有开启 CGI 支持,需要我们手动去开启 CGI 支持功能。开启步骤如下:
(1)编辑 %TOMCAT_HOME%confweb.xml 文件,去掉 cgi 的 <servlet> 注释,大约在 345 行。如下:
<!-- --> <servlet> <servlet-name>cgi</servlet-name> <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>cgiPathPrefix</param-name> <param-value>WEB-INF/cgi</param-value> </init-param> <init-param> <param-name>executable</param-name> <param-value>D:ProgramFilesPython310python.exe</param-value> </init-param> <load-on-startup>5</load-on-startup> </servlet>
常用的 CGI Servlet 初始化参数如下:
cgiPathPrefix:指定存放 CGI 脚本文件的目录,默认为 WEB-INFO/cgi
clientInputTimeout:放弃读文件输入之前所等待的时间,以毫秒为单位。默认值为 100
executable:执行执行 CGI 脚本的可执行程序,上面指定 python.exe 程序来执行 CGI 脚本
debug:调试登记,默认为 0
(2)编辑 %TOMCAT_HOME%confweb.xml 文件,去掉 cgi 的 <servlet-mapping> 注释,大约在 400 行。如下:
<!-- --> <servlet-mapping> <servlet-name>cgi</servlet-name> <url-pattern>/cgi-bin/*</url-pattern> </servlet-mapping>
定义了 cgi Servlet 的访问地址映射,用户可以通过 http://localhost:8080/cgi-bin/** 方式访问。
(3)编辑 %TOMCAT_HOME%confcontext.xml 文件,在 <Context> 元素上添加 privileged="true" 属性。如下:
<!-- The contents of this file will be loaded for each web application --> <Context privileged="true"> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- ... --> </Context>
这里将采用 Python 脚本作为 CGI 脚本,创建一个名为 demo.py 的 Python 脚本。内容如下:
#!/usr/bin/python # CGI demo print("content-type: text/html") print("") print("<html>") print("<head>Welcome Tomcat CGI</head>") print("<body>") print("<h1>Welcome to the output of a CGI under Tomcat</h1>") print("<p>The subject says all.</p>") print("</body>") print("</html>")
将保存好的 demo.py 文件拷贝到 %TOMCAT_HOME%webappsROOTWEB-INFcgi 目录,如下图:
注意:Python 版本信息如下:
Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
完成上面所有配置后,重新启动 tomcat,在浏览器访问 http://localhost:8080/cgi-bin/demo.py, 效果如下图: