Nginx执行CGI

Nginx是个事件驱动的服务程序,非fork类型,并不适合直接执行CGI,关于这方面我之前写过一篇文档。Nginx可以通过fastcgi方式执行CGI程序,简单说,Nginx只是一个反向代理,它通过socket与fastcgi守护程序通信,在用户请求和fastcgi响应结果之间执行转发。

fastcgi有自己的标准,如果每个CGI脚本都改成fastcgi,不是一件容易的事。不过可以通过fastcgi wrapper来执行普通CGI程序。fastcgi wrapper是个守护进程,通过Unix socket或TCP socket与Nginx进行通信。我们首先需要这个fastcgi wrapper。随便找了下,网上有2处提供:

前者提供Unix socket的wrapper,后者提供TCP socket的wrapper,两者都是Perl实现。经实际测试,前者有bug,运行异常。Linode提供的这个可以正常工作。

下载Linode的那个fastcgi-wrapper.pl,设置成可执行,然后运行它,可以看到打开了TCP端口127.0.0.1:8999. 后面在Nginx配置里需要用到这个端口。

创建一个Nginx的site文件,写入如下内容:

server {
listen 80;
server_name www.example.net;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /var/www;

location ~ \.cgi$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

上述配置表示,对.cgi结尾的文件,转发到fastcgi进程去执行。SCRIPT_FILENAME表示CGI脚本的具体位置,根据实际情况更改。

在文档根目录/var/www下创建hello.cgi,如下内容:

#!/usr/bin/perl
use strict;
use CGI;

my $q=CGI->new;
print $q->header;
print "Hello world";

将hello.cgi设置成可执行,然后重启Nginx。这样就可以了。

在浏览器里输入:http://www.example.net/hello.cgi

看到输出Hello world的内容。这样在Nginx里运行CGI程序就配置OK了。

此条目发表在Common分类目录,贴了, , , 标签。将固定链接加入收藏夹。