CGI
Common Gateway Includes(CGI) 通用网关接口: 为web服务器定义了一种和外部程序交互的方法,而这类外部程序主要是产生网页内容,通常也被称为CGI程序或CGI脚本程序。
CGI processing servlet 通用网关包含处理servlet: 对于CGI很多著名的web服务器软件都是支持的,如Apache, IIS, Ngnix以及基于node.js的服务器等,其中Tomcat服务器专门对于CGI配置的处理CGI的servlet叫做CGI processing servlet。这个servlet类主要的作用是处理服务器上实现了通用网关接口的程序或脚本。
综上所述,CGI是一套专门针对web服务器上web应用中脚本程序的编写标准和规范,只要编写的程序或脚本符合该规范,那么web 服务器就能够根据客户端请求而调用该程序或者脚本输出结果。而tomcat中,CGI servlet是一个在tomcat服务器上专门处理实现了 CGI的脚本的serlvet类。
Tomcat 部署CGI运行Python脚本
下面以一个python的CGI脚本程序为例,手动在tomcat配置CGI处理servlet。
1. 安装Tomcat
2. 修改/etc/apache2/httpd.conf
2.1 取消注释
AddHandler cgi-script .cgi (1)
AddType text/html.shtml (2)
AddOutputFilterINCLUDES.shtmk (3)
2.2 在(1)中添加py, 表示把什么样的文件视为cgi文件,此处我们把python文件加入
AddHandler cgi-script .cgi .py
(2),(3)表示允许服务器端返回文件的格式与内容和包含的输出文件
3. 创建一个web应用项目(testpython)
META-INF:metadata-information
WEB-INF: web应用的专属配置文件夹,可以包含web 应用部署描述文件(web.xml),以及其他希望包含进web应用的资源文件。
4. 新建web.xml,并配置cgi processing servlet及其映射
在WEB-INF文件夹中创建web.xml文件,内容如下。
<?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_4_0.xsd"
version="4.0">
<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>python</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
</web-app>
其中,<servlet>
至</servlet>
部分是CGI处理servlet类的定义部分,包括servlet名<servlet-name>
、servlet类<servlet-class>
和若干个初始化参数<init-param>
;<servlet-mapping>
至</servlet-mapping>
部分是CGI处理servlet类的servlet映射部分,包括servlet名<servlet-name>
和URL格式<url-pattern>
。
这些内容基本都是Tomcat预先定义或编辑好的(除了参数executable
及其值,后面会讲到),直接从$CATALINA_BASE/conf/web.xml
相应位置复制过来的就行。
下面仅对几个重点问题进行说明:
①关于初始化参数executable
及其值的设置问题。参数executable
的默认值是perl
,这意味着在不指定该参数值的情况下,访问本应用中后缀名为*.cgi
的文件,默认采用perl编译器进行编译执行,而若要采用Python编译器编译执行*.cgi
文件,则须将该值设置为python
。另外,不可忽视的一点是,无论期望采用何种程序语言编译器运行CGI程序,首先要保证搭载服务器的计算机上配置好相应编译器的环境变量或启动路径,否则即使参数值正确,CGI程序也是无法运行。
②关于初始化参数cgiPathPrefix
及其值的含义问题。参数cgiPathPrefix
表示的是查找CGI程序的(部分)路径。它的完整路径表达应该是“web应用根目录”+“分隔符”+“参数cgiPathPrefix
值”。简单地说,就是服务器判断出客户端要调用某个CGI程序了,它该去哪里找这个CGI程序。
③关于servlet映射问题。servlet映射其实就是针对特定格式的URL指定专门的servlet负责处理。具体来讲,访问本例中web应用的URL应包含http://localhost:8080/testpython*
,“”部分就是需要指定的<url-patten>
’部分,当“”为“/cgi-bin/*”时,服务器就将该请求交由servlet名为cgi
的servlet类进行处理,而这恰恰是上文刚刚配置的servlet类,这样服务器就完成了一个“中间商”的作用,后续对CGI程序的调用和动态页面内容的生成都交由CGI处理servlet类和CGI程序完成。
5. 创建cgi文件夹及cgi脚本(python)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print "Content-type:text/html"
print # 空行,告诉服务器结束头部
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello Word - 我的第一个 CGI 程序!</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! Hello Python</h2>'
print '</body>'
print '</html>'
6. 在tomcat的context.xml中配置Context的属性
CGI处理servlet类和CGI脚本程序就算基本配置完成了,但还有一个关键步骤需要做,是什么呢?那就是需要给本web应用设置
“特权”。出于安全考虑,Tomcat服务器默认是不支持CGI脚本程序的, 我们可以打开这个特权。privileged="true"
/{tomcat}/conf/context.xml
<Context privileged="true">
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
7. 启动Tomcat服务器,并访问CGI脚本程序,查看结果
sudo sh startup.sh
localhost:8080/testpython/cgi-bin/hello.py