用 fcgiwrap 来跑 Movable Type
我的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 虽然和我的用法完全没有关系,但 FreeBSD 的 port 已经被标记为 “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接口传递这些参数:
| |
去掉原先的代理配置,启动fcgiwrap,然后稍作测试即可。