|
|
Sun Java System Application Server 7 Web应用开发者指南 使用CGI 通用网关接口(CGI)程序运行在服务器上并为客户端请求返回一个响应。可以使用多种语言编写CGI程序,包括C、C++、Perl和shell脚本。通过URL可以调用CGI程序。 现在有大量关于编写CGI程序的资料。刚开始学习的时候,可以参看"The Common Gateway Interface" (通用网关接口),网址如下: http://hoohoo.ncsa.uiuc.edu/cgi/overview.html Sun Java System Application Server遵循了1.1版本的CGI规范。 每次运行CGI脚本或程序时,服务器都会启动一个进程,这是一种开销很大的服务器编程方法。 考虑到安全性,CGI脚本基于服务器的安全配置。如果想获得更多信息,请参考"SHTML和CGI的安全性" 和Sun ONE Application Server管理员安全指南。 这部分包含下列主题:
指定CGI目录指定包含CGI程序的目录(并且仅包含CGI程序): 1. 在计算机上创建CGI目录。该目录不一定要是文档根目录下的子目录。这就是为什么在步骤7中必须指定URL前缀。 2.在Administration界面的服务器实例下打开HTTP服务器组件。 3.进入虚拟服务器页。 4.点击要指定的CGI目录所在的虚拟服务器的名字。 5.点击CGI标签。 6.点击CGI目录选项。 7.在URL前缀域中,输入该目录使用的URL前缀。也就是,输入的文本是URL中的CGI程序的目录。 例如,如果输入cgi-bin 作为URL前缀,那么,所有到这些CGI程序的URL都有相同的结构,如下所示: http://yourserver.domain.com/cgi-bin/program-name
8.在CGI目录文本域中,输入目录位置的绝对路径。 9.点击OK按钮。 10.进入服务器实例页,并且点击Apply Changes(应用改变)按钮。 服务器将这些目录中的所有文件视为CGI程序。 要删除已有的CGI目录,可以在CGI目录页中点击目录的删除(Remove)按钮。点击目录的编辑(Edit)按钮可以改变URL前缀或现有目录的CGI目录。 将CGI程序复制到指定的目录下。记住,这些目录下的任何文件都是作为CGI文件处理的,所以,不要将HTML文件放在CGI目录下。 对于每个CGI目录,文件obj.conf 包含一个 NameTrans 指令,该指令将名字cgi 和每个对该目录中的资源的请求关联起来。在Administration界面中指定CGI目录时,这些指令会自动添加到obj.conf 中,如果你乐意的话,也可以手动将它们添加到obj.conf 中。 例如,下面的指令将所有对http://server-name/cgi-local 中的资源的请求解释成是调用目录C:/SunServer/docs/mycgi 下的程序的请求。 NameTrans fn="pfx2dir" from="/cgi-local" dir="C:/SunServer/docs/mycgi" name="cgi" obj.conf 文件必须包含下列命名对象。
不要删除obj.conf中的这个对象。如果删除了这个对象,那么不管在Administration界面中指定还是手动将NameTrans命令添加到obj.conf中,服务器都不能识别CGI目录。 指定CGI文件扩展名为了让服务器将所有具有特定扩展名的文件视为CGI程序,而不管这些文件处于哪个目录中,你可以: 1. 在Administration界面的服务器实例下打开HTTP服务器组件。 2. 进入虚拟服务器页。 3. 点击要指定的CGI文件类型所在的虚拟服务器的名字。 4. 点击CGI标签。 5. 点击CGI文件类型选项。 6. 从编辑检出器中选择想要应用该变化的资源。 7. 点击激活状态下的CGI中的Yes单选按钮作为文件类型。 8. 点击OK 按钮。 9. 进入服务器实例页,选择应用改变(Apply Changes)按钮。 默认的CGI扩展名是.cgi,.bat 和.exe。 要改变用于表示CGI程序的某个扩展名,可以通过修改mime.types 中如下所示的一行来指定希望使用的扩展名。记住,编辑mime.types后一定要重新启动服务器。 type=magnus-internal/cgi exts=cgi,exe,bat 当服务器能将带有合适扩展名的所有文件视为CGI程序时,obj.conf 文件包含下列服务指令: Service fn="send-cgi" type="magnus-internal/cgi" 创建CGI程序的常规执行环境(仅针对UNIX) |
|
注意 |
推荐将Cgistub 安装在instance_dir/private 目录下。如果将它安装在其它地方,必须在init.conf 中的init-cgi 函数内将路径指定到Cgistub。如果想获得更详细的信息,请参考Sun Java System 应用服务器开发者NSAPI指南。 |
|
注意 |
可能不能将suid Cgistub程序安装在NFS装配台中。如果想使用suid Cgistub,必须将服务器实例安装在本地文件系统中。 |
Cgistub 加强了下列安全约束:
|
注意 |
一些UNIX变种,包括SunOS/Solaris的当前版本,没有指定Socket权限。为了避免恶意的用户利用Cgistub,将服务器的临时目录(使用init.conf TempDir 指令)变成只允许服务器用户访问的目录。如果想获得更详细的信息,请参考Sun Java System 应用服务器管理员配置文件参考。 |
安装了Cgistub后,可以按下列方法创建常规执行环境:
为了避免虚拟服务器的CGI程序干扰其它用户,必须将这些程序存储在唯一的一个目录中,并且只有在具有唯一UNIX 用户和组的权限时才可以执行。
首先,创建UNIX用户和组。各个操作系统中创建用户和组各有不同的步骤。可以参考操作系统文档。
然后,按下列步骤创建虚拟服务器的cgi-bin 目录。
1. 以超级用户身份登录。
su
2. 进入虚拟服务器目录。
cd vs_dir
3. 创建cgi-bin 目录。
mkdir cgi-bin
chown user:group cgi-bin
chmod 755 cgi-bin
通过下列方法中的一种可以设置虚拟服务器的CGI目录、用户和组:
如果想获得更多信息,请参考Sun Java System 应用服务器管理指南。
指定虚拟服务器的Chroot目录为了进一步提高安全性,必须防止这些CGI脚本访问虚拟服务器目录之上或之外的数据。
首先,设置chroot环境。各个操作系统中建立chroot各有不同的步骤。可以查看操作系统文档。 ftpd 和 chroot 的man 页是很好的参考文档。
下面是Solaris 版本2.6到8需要的步骤:
1. 以超级用户身份登录。
su
2. 进入chroot目录。这是前一节提到的vs_dir 目录。
cd chroot
3. 在chroot目录中创建tmp 。
mkdir tmp
chmod 1777 tmp
4. 在chroot目录中创建dev 。
mkdir dev
chmod 755 dev
5. 显示/dev/tcp,并且注意输出结果中的主设备号和次设备号。在该例中, 11是主设备号,42是次设备号。
ls -lL /dev/tcp
crw-rw-rw- 1 root sys 11, 42 Apr 9 1998 /dev/tcp
6. 使用主设备号和次设备号创建tcp 设备。
mknod dev/tcp c 11 42
chmod 666 dev/tcp
7. 为下面每个设备重复步骤5和步骤6 (每个设备有不同的主设备号和次设备号)。
/dev/udp
/dev/ip
/dev/kmem
/dev/kstat
/dev/ksyms
/dev/mem
/dev/null
/dev/stderr
/dev/stdin
/dev/stdout
/dev/ticotsord
/dev/zero
8. 设置chroot目录中的dev的设备权限。
chmod 666 dev/*
9. 创建并显示chroot目录中的lib 和usr/lib 。
mkdir usr
mkdir usr/lib
ln -s /usr/lib
ln /usr/lib/* usr/lib
可以忽略该命令产生的消息。
如果/usr/lib 目录存在于不同的文件系统上,使用下面命令替换最后一条命令。
cp -rf /usr/lib/* usr/lib
10. 创建并显示chroot目录中的bin 和usr/bin 。
mkdir usr/bin
ln -s /usr/bin
ln /usr/bin/* usr/bin
可以忽略该命令产生的消息。
如果 /usr/bin 目录存在不同的文件系统上,使用下面命令替换最后一条命令。
cp -rf /usr/bin/* usr/bin
11. 创建并显示chroot目录中的etc 。
mkdir etc
ln /etc/passwd /etc/group /etc/netconfig etc
12. 测试chroot环境。
chroot chroot bin/ls -l
输出结果应该如下:
total 14
lrwxrwxrwx 1
root other 8
Jan 13 03:32 bin -> /usr/bin
drwxr-xr-x 2
user group 512
Jan 13 03:42 cgi-bin
drwxr-xr-x 2
root other 512
Jan 13 03:28 dev
drwxr-xr-x 2
user group 512
Jan 13 03:26 docs
drwxr-xr-x 2
root other 512
Jan 13 03:33 etc
lrwxrwxrwx 1
root other 8
Jan 13 03:30 lib -> /usr/lib
drwxr-xr-x 4
root other 512
Jan 13 03:32 usr
可以使用下列方法中的一种来设置虚拟服务器的chroot目录:
如果想获得更多信息,请参考Sun Java System Application Server的管理员指南。
在Sun Java System Application Server上添加CGI程序,只需要完成下面的步骤之一:
对于UNIX,应确保程序文件进行权限设置。
要设置CGI程序的优先权,可以:
1. 在服务器实例下打开HTTP服务器组件。
2. 进入虚拟服务器页。
3. 点击要指定的CGI 目录所在的虚拟服务器的名字。
4. 点击一般(General)标签。
5. 在Nice域中输入一个值。该增量决定了服务器中该CGI程序的优先权。典型的情况是,服务器运行时nice的值是0,并且nice增量的值是0 (CGI程序和服务器具有相同的优先权) 到 19 (CGI程序的优先权比服务器要低得多)。通过将优先级指定为-1可以将CGI程序的优先级设置得比服务器高,但是并不推荐这样做。
6. 点击保存(Save)按钮。
7. 进入服务器实例页,并且选择应用改变(Apply Changes)按钮。
如果想获得更多信息,请参考Sun Java System Application Server的管理员指南。
本节讨论如何安装Windows CGI 程序,包含下列主题:
Windows CGI程序的处理类似于其它CGI程序。指定一个目录,在该目录中仅包含Windows CGI程序,或指定所有的Windows CGI程序有相同的文件扩展名,或两样都指定。
虽然Windows CGI程序的行为类似于常规CGI程序,但是服务器在实际执行这两类程序的时候稍微有些不同。因此,需要为Windows CGI程序指定不同的目录。如果能够使用Windows CGI文件类型,就使用文件扩展名.wcg。
Sun Java System Application Servers支持Windows CGI 1.3a 非正式规范,具有下列区别:
要指定包含WinCGI程序(并仅包含WinCGI程序)的目录,可以:
1. 在计算机上创建Windows CGI目录。该目录不一定要是文档根目录的子目录。所以在步骤7中必须指定URL前缀。
2. 在Administration界面的服务器实例下打开HTTP服务器组件。
3. 进入虚拟服务器页。
4. 点击要指定的Windows CGI 目录所在的虚拟服务器的名字。
5. 点击CGI标签。
6. 点击WinCGI目录选项。
7. 在URL前缀域中,输入该目录要使用的URL前缀。也就是,输入的文本是URL中的CGI程序的目录。
例如,如果输入cgi-bin 作为URL前缀,那么,所有指向这些CGI程序的URL都有相同的结构,如下所示:
http://yourserver.domain.com/cgi-bin/program-name
|
注意 |
指定的URL前缀可以和前面几步中指定的真实的CGI目录不同。 |
8. 在WINCGI目录文本域中,输入目录的绝对路径。
9. 允许脚本跟踪,选择Yes单选按钮。
10. 点击OK 按钮。
11. 进入服务器实例页,并且点击应用改变(Apply Change)按钮。
点击WINCGI目录页的目录的删除(Remove)按钮,可以删除已有的W indows CGI目录。点击目录的编辑(Edit)按钮可以改变URL前缀或现有目录的CGI目录。
将W indows CGI程序复制到指定的目录下。记住,这些目录下的任何文件都是作为Windows CGI文件处理的。
为了指定Windows CGI文件的扩展名,执行下列步骤:
1. 在服务器实例下打开HTTP服务器组件。
2. 进入虚拟服务器页。
3. 点击要指定的Windows CGI 目录所在的虚拟服务器的名字。
4. 注意虚拟服务器的MIME 类型文件名。
5. 进入MIME Type Files页。
6. 点击与步骤4中提出的名字相匹配的名字。
7. 点击MIME File... 按钮。
8. 添加一个具有下列设置的新的MIME类型:
9. 点击New Type按钮。
10. 进入服务器实例页,并且选择应用改变(Apply Changes)按钮。
本节讨论如何在Windows下安装Shell CGI 程序。本节包含下列主题:
Shell CGI是一项服务器配置,允许使用Windows中设置的文件关联运行CGI应用。
例如,如果服务器请求一个叫做hello.pl 的shell CGI文件,服务器使用Windows文件关联来运行使用.pl扩展名的程序。如果.pl 扩展名和程序C:\bin\perl.exe相关联,服务器希望按如下方式执行hello.pl 文件:
c:\bin\perl.exe hello.pl
配置shell CGI的最简单的方法是在服务器的文档根目录下创建一个目录,该目录仅包含shell CGI文件。不过,通过编辑Sun Java System Application Server的MIME类型也可以将特定文件扩展和shell CGI关联起来。
|
注意 |
如果想获得关于如何设置Windows 文件扩展名的更多信息,请参考Windows 文档。 |
要指定包含shell CGI程序(并且仅包含shell CGI程序)的目录,可以:
1. 在计算机上创建shell CGI目录。该目录不一定是你的文档根目录下的子目录。所以在步骤7中必须指定URL前缀。
2. 在服务器实例下打开HTTP服务器组件。
3. 进入虚拟服务器页。
4. 点击要指定的shell CGI 目录所在的虚拟服务器的名字。
5. 点击CGI标签。
6. 点击Shell CGI目录选项。
7. 在URL前缀域中,输入该目录使用的URL前缀。也就是,输入的文本作为URL中CGI程序的目录。
例如,如果输入cgi-bin 作为URL前缀,那么所有指向这些CGI程序的URL具有下面的结构:
http://yourserver.domain.com/cgi-bin/program-name
|
注意 |
指定的URL前缀可以和前面步骤中指定的实际的CGI目录不同。 |
8. 在Shell CGI目录文本域中,在目录位置中输入绝对路径。
9. 点击OK 按钮。
10. 进入服务器实例页并选择应用改变(Apply Changes)按钮。
11. 确保shell CGI目录中的任何文件在Windows中也有关联文件。在试图运行没有文件扩展关联的文件时,服务器会返回一个错误。
|
警告 |
服务器必须具有对shell CGI目录的读取和执行的权限。在Windows中,服务器运行的用户账号(例如,LocalSystem)必须具有读取和执行shell CGI目录中程序的权限。 |
点击该目录的shell CGI目录页中的删除(Remove)按钮可以删除现有的shell CGI 目录。点击该目录的编辑(Edit)按钮可以改变现有目录的URL前缀或shell CGI 目录。
将shell CGI程序复制到指定的目录中。记住,这些目录中的任何文件都作为shell CGI文件处理。
可以使用Sun Java System Application Server的 mime.types 文件将文件扩展和shell CGI特性关联起来。这与在Windows中创建关联不同。
为了将文件扩展和服务器上的shell CGI特性关联起来,例如,可以为带有.p1扩展名的文件创建一个关联。当服务器接收到一个对带有该扩展的文件的请求时,服务器知道应该将该文件作为shell CGI文件,调用执行Windows中该文件扩展名关联。
将文件扩展和shell CGI 文件关联起来,执行下列步骤:
1. 在Administration界面的服务器实例下打开HTTP服务器组件。
2. 进入虚拟服务器页。
3. 点击要指定的Windows CGI文件类型所在的虚拟服务器的名字。
4. 注意虚拟服务器的MIME类型文件名。.
5. 进入MIME类型文件页。
6. 点击与步骤4中提到的名字相匹配的名字。
7. 点击MIME File... 按钮。
8.