tomcat5,tomcat6,apache--cgi配置/shell脚本
很多功能都是需要用到CGI(Common Gateway Interface)进行工作。在使用CGI进行工作时候,我们首先要进行CGI服务器的配置。一般情况下可以直接使用Apache来架设CGI服务器。由于我们后期的一些应用可能是在JEE平台上进行开发,所以在一个可以运行Web Container的Server?上架设CGI服务是有必要的。本文将介绍如何在Tomcat下配置CGI服务。
运用情况,1、后端服务由脚本语言(shell、perl、python)提供,前端js ajax调用
一、tomcat下的cgi配置如下:
1、tomcat5、6都需要修改
a、 在Tomcat的conf/web.xml 文件中,把关于<servlet-name> CGI的那段的注释去掉。内容样式如下:
<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>/bin/sh</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
cgiPathPrefix与cgi的存放目录有关系,excutable与cgi的语言有关系,Tomcat默认的cgi语言为perl,需要自已添加进去,它的值就是我们用来解释CGI脚本的程序。
linux下 shell :/bin/sh
perl :/bin/perl
c/c++都行,类推
b、 在Tomcat的%CATALINA_BASE%/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉。内容样式如下:
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
其中url-pattern就是将来我们访问CGI脚本的url地址模式。
2、tomcat5比6多的配置
a、把servlets-cgi.renametojar (在%CATALINA_HOME%/server/lib/目录下)改名为servlets-cgi.jar。
b、配置权限
在conf/context.xml 修改下面这一行
<Context privileged="true">
不配置权限,将会出现java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.CGIServlet is privileged and cannot be loaded by this web application这一异常。
完成上面几个步骤后,我们的Tomcat服务器就具有了运行CGI脚本的能力了。
配置过程中遇到一个问题,就是静态网页可以正常显示,但点击其中的cgi连接时,cgi就被当成文件下载了,而不是由服务器解释执行。
Apache会在html所在当前文件夹下寻找cgi文件。但默认的cgi前缀是WEB-INF/cgi-bin,路径不对,无法执行
二、cgi测试
1、shell 脚本cgi
参考
http://lovingtree.blog.163.com/blog/static/14485342008834225624/
测试工作中,经常会涉及到一些要验证服务器对某些cgi接口查询结果返回信息进行解析是否正确的情况。而提供cgi接口的通常又是另外的部门,测试的时候需要调试一些返回结果不方便。所以需要自己模拟虚假的cgi接口来达到同样的目的。
比如说,类似http://www.yousite.com/query.cgi?username=***&kind=***这样的接口会根据username和kind的值的不同返回6类结果,每一类结果,请求服务器都会针对地走不同的处理流程,这就需要每一个返回结果都需要模拟到,于是乎,建立模拟的cgi接口势在必行。以前自己也没有接触过cgi程序,翻了一些基础资料发现总体框架也不是很复杂,而解析html发过来的参数有不少现成的程序可以使用,不用自己写了。因为只是需要简单的模拟返回结果,所以用shell写cgi程序,开始用了uncgi解析,配置很方便,具体方法可以看:
http://www.midwinter.com/~koreth/uncgi.html
后来又发现一个shell写的解析程序proccgi.sh,似乎在简单的cgi接口中使用更方便
proccgi.sh文件内容如下:
使用方法:
在自己的cgi脚本中直接调用这个shell解析参数即可,如:
eval `proccgi.sh $*` # 可以把proccgi.sh放在你服务器的cgi-bin目录
如果上面的调用出错,尝试用绝对路径调用 eval `/home/www/cgi-bin/proccgi.sh $*`
例子,比如有一个cgi接口,按照下面的参数调用:
http://your-website/cgi-bin/mycript?username=your_name&password=mypass
返回结果:
your_name
mypass
则,mycript的内容为:#!/bin/sheval `/home/www/cgi-bin/proccgi.sh $*`echo Content-type: text/plainechoecho $FORM_usernameecho $FORM_password
参数里面每一对key/value存储在$FORM_key 环境变量里面。
2、c语言 (windows下的,未经测试)
a创建cgitest4.cpp
b生成 cgitest4.exe,并在WEB-INF下创建目录cgi,将cgitest4.exe放置其中
c、浏览器通过 http://localhost:8080/yourweb/cgi-bin/cgitest4.exe即可访问
8080为服务器端口,更改为自己的,yourweb也改成自己的网站目录
cgitest4.cpp
#include "stdio.h"
#include "stdafx.h"
void main()
{
FILE* f = fopen("bbb.txt","w");
fprintf(f,"hello world");
fclose(f);
printf("content-type:text/html;\r\n\r\n");
printf("<html><body>hello world</body></html>");
}
三、apache支持cgi
apache默认支持cgi,很容易
参考
http://hi.baidu.com/higkoo/blog/item/d3af504e85ede8c6d0c86ac0.html