详解Httpd配置CGI的方法

-- TOC --

本文详细描述如何在Httpd服务器上配置CGI。

什么是CGI

CGI,Common Gateway Interface,定义了一个Web Server与可以产生内容输出的外部程序或脚本(一般称为CGI脚本)的交互方式。这是一种简单的在网站上输出动态内容的方式,你可以使用任何你熟悉的编程语言编写CGI脚本。

CGI标准:https://www.ietf.org/rfc/rfc3875.txt

打开CGI模块

配置在Apache Httpd上配置CGI,你首先需要打开CGI模块的调用。

LoadModule cgid_module modules/mod_cgid.so

When using a multi-threaded MPM under unix, the module mod_cgid should be used in place of this module. At the user level, the two modules (mod_cgi and mod_cgid) are essentially identical.

Windows系统需要使用mod_cgi

ScriptAlias

ScriptAlias指令告诉Httpd服务器,一个特别的目录用来存放CGI脚本,Httpd会默认这个目录下所有文件都是一个可执行的CGI脚本,当有对应的访问请求时,Httpd会去执行它们。

ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"

ScriptAlias指令与Alias指令很相似,它们都定义了一个URL前缀与特定路径对应。而且,这两条指令都是用于DocumentRoot定义的范围之外。不同的地方在于,ScriptAlias指令增加了一层含义,即制定的路径内都是CGI可执行脚本,Httpd服务器在有对应请求到来的时候,回去执行它们。

配置CGI的坑

我在初学CGI配置的时候,遇到了很多坑,身心俱疲,差点想放弃......不管配置上遇到什么问题,记得第一时间查看error log

零号坑

切记!ScriptAlias指向的路径,不要再DocumentRoot的范围之内!

如果出现这个情况,其配置方式完全不一样。建议不要这样搞!

第一坑

ScriptAlias指定的路径,需要有访问权限,只是指定不行,还要设定权限。如果不设定权限,Httpd会提示Forbidden。

<IfModule alias_module>
    #
    # ScriptAlias: This controls which directories contain server scripts.
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the target directory are treated as applications and
    # run by the server when requested rather than as documents sent to the
    # client.  The same rules about trailing "/" apply to ScriptAlias
    # directives as to Alias.
    #
    ScriptAlias /cgi-bin/ "/usr/local/apache-test1/cgi-bin/"
</IfModule>

#
# "/usr/local/apache-test1/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache-test1/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

以上是Httpd.conf中的cgi默认配置,通过 <Directory> 设定cgi-bin目录的访问权限,Require all granted,这样用户才可以访问cgi脚本。

第二坑

CGI脚本没有可执行权限!例如默认的cgi-bin目录中:

$ ls -l cgi-bin
total 16
-rw-r--r-- 1 pi pi  820 Dec 18  2012 printenv
-rw-r--r-- 1 pi pi 1074 Dec 18  2012 printenv.vbs
-rw-r--r-- 1 pi pi 1133 Dec 18  2012 printenv.wsf
-rw-r--r-- 1 pi pi 1275 Oct  1 08:48 test-cgi

默认安装的几个CGI脚本,都没有x权限,当然这是出于安全考虑,x权限需要配置人员手动加上去。

$ sudo chmod 755 test-cgi

另外,也是出于安全考虑,例如test-cgi这个脚本,没有shebang这一行(CGI脚本文件第一行,#!/usr/bin/bash), 也需要配置人员手动编辑。

如何面对500错误

首先不要慌,静静地想一想......当Httpd返回500错误的时候,一般情况下都是CGI脚本执行失败,执行过程中出现异常,或者CGI脚本不可执行。还有各种权限问题,除了在 <Directry> 中配置的权限,还有运行Httpd服务器的用户,对于待访问执行的文件的权限等等。

记住:遇到任何问题,找不到原因,就去查看 error log!配置修改后,重启生效!

小结

虽然CGI现在不是生产环境的主流配置,因为速度和效率的问题,但是CGI依然还是有很多可以使用的场景,特别是开发人员的测试场景!希望本文可以帮到你。

本文链接:https://cs.pynote.net/net/httpd/202110015/

-- EOF --

-- MORE --