lighty reloaded
blog的运行一直不太稳定。主要原因是wordpress大量依赖apache的url rewrite,此外部分plugin的相互兼容性存在问题。说到wordpress的不稳定,我的mac机器上甚至都跑不起来。最早我们使用的是lighttpd,不过很快发现很多错误,比如无法正确登录,最后发现可能是wp的部分代码无法兼容fast-cgi方式。修改了几次都不太理想。最后使用zend core的mod_fastcgi来替换apache本身的fast-cgi,似乎好一些。但是好景不长,很快就频繁出现页面空白等现象。重启apache就ok。是不是只有用mod_php方式最好呢?节前将php降级到redhat的官方64版本。情况更加糟糕,经常出现页面无法打开。我初步断定是代码问题。不过由此也看出,mod_php的确没有fast-cgi方式来的健壮。mod_php一旦有问题会危机httpd本身,而之前用Lighttpd15,尽管php-cgi频繁seg fault,但是lighttpd处理静态文件仍然很好。到了51节后,blog的出错让我忍无可忍,下决心重新使用lighttpd。 但是首先要解决url-rewrite的问题。之前使用lighttpd的url rewrite,由于缺乏条件重写,因此性能比较差,需要将所有静态文件手工补上规则,这也是以前页面侧栏无法工作的主要原因。不过还好,这次发现lighttpd的mod_magnet可以完成。
事情并非如此顺利,首先是如何编译mod_magnet, 这需要安装Lua这个语言,首先尝试自己编译,lua的安装简单,直接make linux就完了,但是在配置lighttpd的时候出现问题,虽然使用了 –with-lua=lua51,但是死活找不到lua的lib库。后来我手动加上-I/usr/loca/lib/lua 虽然config通过了,但是link阶段发现仍然有问题。在僵持了快1个小时后,我最终放弃,不过很快发现有rpm包可以用。从rpmfind.net找到 lua-5.1.2-1.fc7.src.rpm,为了避免最终link出问题,我使用icc rebuild了这个rpm。最后安装了lua,lua-devel 这2个rpm。lighttpd终于顺利的编译成功。通过查阅mod_magnet的例子,写了一个blog.lua:
if (not lighty.stat(lighty.env["physical.path"])) then
if (string.match(lighty.env["uri.path"], "^(/?[^/]*/)files/$")) then
lighty.env["physical.rel-path"] = "index.php"
lighty.env["uri.path"] = "index.php"
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)files/(.+)")
if a then
lighty.env["physical.rel-path"] = "wp-content/blogs.php"
lighty.env["uri.path"] = "wp-content/blogs.php"
lighty.env["uri.query"] = "file=" .. a
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)(wp-.*)")
if a then
f = lighty.env["physical.doc-root"] .. a
if lighty.stat(f) then
lighty.env["physical.rel-path"] = a
lighty.env["uri.path"] = a
else
print("missing " .. f)
lighty.env["physical.rel-path"] = "index.php"
lighty.env["uri.path"] = "index.php"
end
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)(.*\.php)$")
if a then
lighty.env["physical.rel-path"] = a
lighty.env["uri.path"] = a
else
lighty.env["physical.rel-path"] = "index.php"
lighty.env["uri.path"] = "index.php"
end
end
end
end
lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
print("physical.path " .. lighty.env["physical.path"])
print("uri.path " .. lighty.env["uri.path"])
end
这里看起来简单,但是非常让人恼火的是,如果没有uri.path,那么会显示403 错误。这是在反复测试了3个小时候换来的血的教训。 也许问题不是出在lighty本身而是wordpress自己。
终于能跑起来了,但是很快发现rss不能用,尤其是全站。 这又花费了相当长的时间才搞定。
最后,删除了几个不稳定的plugin。
不良的代码竟然导致web server crash,这是我以前很少遇到的。
使用ab测试了一下,在高负载下还是有seg fault,不过还算能抗过去了。
不管怎么说,apache先休息一下吧
Comments
Leave a Reply