用 fcgiwrap 来跑 Movable Type

• 本文约 711 字,阅读大致需要 2 分钟 | Security | #fcgiwrap | #nginx | #Movable Type | #FastCGI | #SysAdmin

我的blog在之前一直是用 Apache HTTPD 来作为CGI引擎来跑 Movable Type。在迁移到北美之前,使用两个域名/IP来分别运行静态页面 (lighttpd) 和CGI内容。后来因为全面转向 nginx,在迁移过程中改成了使用一个域名、使用nginx在前面跑静态页,并作为反向代理来连接后端的Apache 1.3.x实例(先前是Apache 2.2.x,由于这个实例只用来跑CGI,所以采用了较低版本的Apache以节省资源)。

之前一直有完全停用Apache HTTPD的想法,不过一直没有时间去实作。由于Apache 1.3.x早已是不再维护的分支,近期发现的 CVE-2011-3368 虽然和我的用法完全没有关系,但 FreeBSDport 已经被标记为 “FORBIDDEN” 状态,于是最近找时间学习了一下如何在nginx上跑这些cgi。现在,这台服务器已经完全停用Apache HTTPD了。

nginx 有很多跑CGI的办法,但是没有一种是原生的。官方推荐的方法是使用thttpd,然而大概看了看代码之后发现thttpd虽然代码量很少,但不支持使用Unix socket连接,而且我只要能支持FastCGI接口就好,并不真的需要封好HTTP,所以改为用fcgiwrap (ports/www/fcgiwrap)。

fcgiwrap没有什么特别的配置。FreeBSD上提供了一个rc.d脚本,直接拿来用。

对应的rc.conf.local配置如下:

fcgiwrap_enable="YES"
fcgiwrap_socket="unix:/var/run/www/fcgiwrap.sock"
fcgiwrap_user="www"
fcgiwrap_group="www"

这里没有使用通常的 /var/run/fcgiwrap.sock,而是单独建立了一级目录 (/var/run/www/),其owner用户和组均为www。上述配置令rc.d系统在启动时使用www身份,如果不单独建立目录,则系统会无法创建对应的socket文件。

fcgiwrap信任来自Web服务器的路径。下面是告诉nginx如何透过FastCGI接口传递这些参数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
	location ~ ^/mt(/[^/]*)(/.*)?$ {
		root <此处填写具体的cgi-bin/mt目录>/;
		fastcgi_split_path_info (^/mt/[^/]*)(.*)$;
		include fastcgi_params;
		fastcgi_param GATEWAY_INTERFACE CGI/1.1;
		fastcgi_param SCRIPT_FILENAME $document_root$1;
		fastcgi_param PATH_INFO $fastcgi_path_info;
		fastcgi_param PATH_TRANSLATED $document_root$2;
		fastcgi_pass unix:/var/run/www/fcgiwrap.sock;
	}

去掉原先的代理配置,启动fcgiwrap,然后稍作测试即可。