freebsd + lighttpd + fastcgi + MoinMoin
最近重新整理了一下实验室的服务器,全新安装了 FreeBSD 7.2。比较郁闷的事情就是在 lighttpd 上重新配置 MoinMoin,以前做过成功的配置,但是升级系统时,忘记保存 lighttpd 的配置文件了。尝试了一段时间,总算又搞定了,这次得做个记录。
首先可以参考这篇文章安装并配置好 lighttpd 环境,然后就可以去 MoinMoin 的官方网站去下载 MoinMoin 的最新版本,目前最新的稳定版本是 1.8.5。
按照 MoinMoin 安装包内的 docs/INSTALL.html 文档的指点,将 MoinMoin 基本安装以及 Wiki 实例创建步骤都做完了,最后的环节就是配置 lighttpd.conf 文件,由于 INSTALL.html 文档在这部分语焉不详,并且我对 Web 服务器的原理以及 lighttpd 的配置语法都不熟悉,让我茫然了好大一会。翻来覆去,看了好几遍 INSTALL.html 给出的这段 lighttpd.conf 的配置代码:
$HTTP["host"] =~ "^(www\.)?example\.org" { url.rewrite-once = ( "^/robots.txt" => "/robots.txt", "^/favicon.ico" => "/favicon.ico", "^/moin_static161/(.*)" => "/moin_static161/$1", "^/(.*)" => "/wiki-engine/$1" ) server.document-root = "/srv/org.example/htdocs/" $HTTP["url"] =~ "^/wiki-engine/" { fastcgi.server = ( "/wiki-engine" => (( "docroot" => "/", "min-procs" => 10, "max-procs" => 10, "max-load-per-proc" => 2, # allocate successive port numbers for each process, starting with "port" "bin-path" => "/srv/org.example/bin/moin.fcg", "host" => "127.0.0.1", "port" => 3060, "check-local" => "disable", )) ) } }
不禁有点飘飘欲仙之感,因为这串代码对我来说简直如天书一般。连猜带蒙的,最后我是这么来理解的:
- $HTTP["host"] 是用来设置虚拟主机的,就是那种多个域名共享 1 个 IP 的虚拟主机,那个 ^(www\.)?example\.org" 是采用正则表达式来匹配 www.example.org 这个域名。"=~" 就表示后面跟随的字串是正则表达式,对于非正则表达式,可以用 "=="。
- url.rewrite-once 是采用正则表达式匹配的方式用来替换 "www.example.org" 后面所跟随的字串(即 url 字串)的。比如 "www.example.org/robots.txt" 所跟随的字串是 "/robots.txt",当它被 url.rewrite-once 中的 "^/robots.txt" 所匹配时,就会被替换为 "/robots.txt"。嗯,这里对于 "/robots.txt"、"^/favicon.ico" 以及 "^/moin_static161/(.*)" 都是替换为其自身,好像是在咬自己尾巴玩,实际上它们是为了让对应的三个 url 不被那个 "^/(.*)" 替换规则篡改。
- server.documet-root 就是指定 MoinMoin 网页模板所在的目录,而那个 wiki-engine 是 MoinMoin 实例所在的目录。
- $HTTP["url"] 是用来定义 fastcgi 服务器的,它也是采用正则表达式来匹配 "/wiki-engine/" 这个 url 字串,表示只要匹配通过的 url 字串所代表的页面请求都通过一个 fastcgi.server 来处理。
- 在 fastcgi.server 的配置中,除了做一些平常的配置之外,最关键的在于指定 moin.cfg 文件所在的全路径。moin.cfg 是用来实现 MoinMoin 与 fastcgi 服务器相互联接的,它默认位于 server.document-root/../server 目录内,我们可以将它复制到 wiki-engine 所在的目录。
基于上述的理解,我对上述 lighttpd.conf 的配置片段进行了以下修改:
### M2WK MoinMoin server.modules += ( "mod_alias" ) alias.url = ( "/moin_static185/" => "/usr/local/share/moin/htdocs/" ) $HTTP["host"] =~ "^192\.168\.0\.2" { url.rewrite-once = ( "^/robots.txt" => "/robots.txt", "^/favicon.ico" => "/favicon.ico", "^/moin_static185/(.*)" => "/moin_static185/$1", "^/(.*)" => "/m2wk/$1" ) server.document-root = "/usr/local/share/moin/htdocs/" $HTTP["url"] =~ "^/m2wk/" { fastcgi.server = ( "/m2wk" => (( "docroot" => "/", "min-procs" => 10, "max-procs" => 10, "max-load-per-proc" => 2, "bin-path" => "/usr/local/var/m2wk/moin.fcg", "host" => "127.0.0.1", "port" => 3060, "check-local" => "disable" )) ) } }
值得注意的地方是:我配置的服务器只是在内网中使用的,没有域名,所以 $HTTP["host"] 只能匹配服务器的 IP 地址了;需要启用 lighttpd 的 alias 模块,以便将 MoinMoin 所生成的网页中所使用的 "/moin_static185/" 路径映射到服务器本地目录。
配置完 lighttpd.conf 之后,还得对 moin.fcg 中的一处代码片段进行一些修改:
class Config(FastCgiConfig): # properties = {'script_name': '/'} # use this instead of the line above if your wiki runs under "/" url # for backlog, we use a default of 5. if the listen(backlog) call crashes for you, try a smaller value! # backlog = 1 max_requests = 1000 properties = {'script_name': '/'} # <--- 必须有
现在启动(重新启动) lighttpd 之后,在浏览器中输入服务器的 IP 地址,就应该能够看到 MoinMoin 的页面了,剩下的事情就是有关 Wiki 的配置,不再细说。
但是,这里有个费解的问题。通过上述方式配置好 MoinMoin 之后,当我重启 FreeBSD 时,通过 rc.d 的方式启动 lighttpd 会失败,等 FreeBSD 启动完毕后,通过手工启动 lighttpd,就不出错。
基于 mod_python 的 Moinmoin 1.7 附件上传 bug 问题的解决方案
Moinmoin 1.7.0 发布快一个月了,期间,我反复折腾了多次,都是因为没法解决 apache + mod_python 环境中存在着附件上传失败的问题,后来只好继续死心塌地的用着 1.6.3 版。今晚总算在 Moinmoin 的 bug 列表中看到了有关这一 bug 产生原因,原来并非是 Moinmoin 1.7.0 的问题,而是 mod_python 的 bug,因此开发者建议使用 mod_wsgi 替换 mod_python,详情见:1.7ModPythonAttachmentUploadFails。