前两天对lighttpd+fastcgi(php)进行了压力测试,在我的破虚拟机上,对一个简单的php页面访问QPS是60+,而纯静态页面QPS是700+。

所以坚定了对部分关键页面静态化的决心。但是希望尽量不破坏网站原有逻辑,所以使用了bash来做。具体流程图如下:

静态化流程图

静态化流程图

触发静态化

我们的内容是由运营人员在后台发布的,所以当新增、修改、删除(相当于修改了产品的状态为deleted)的时候需要触发静态化。我的做法是插入一条新纪录到static_help表,该表的id是自增的。

cron判断是否需要静态化

该脚本定时运行,首先会检查本地文件static_flag.txt,其中保存了上次运行的static_help.id。如果static_help.id不存在或者为空,则需要重新静态化。然后curl’获取线上的动态内容首页,获取其中的js变量index(动态获取的max(static_help.id)),如果static_help.id > page.index,说明有新变动,则需要更新。

cron单例

为了避免多个cron同时运行,造成冲突,所以使用了以下简单的脚本,保证同一时刻仅有一个进程运行:

function LockFile() {
        [ -e /dev/shm/${0##*/} ] && errorexit "Self already Run!"
        ln -s /proc/$$ /dev/shm/${0##*/}
        trap "Exit" 0 1 2 3 15 22 24
}
function Exit(){
        unlink /dev/shm/${0##*/} >/dev/null 2>&1
        exit 0;
}

在程序中,首先调用LockFile函数,检查临时目录中是否存在以当前程序名称命名的link,如果存在则退出;否则建立该link。同时,为了保证程序中异常中断的时候也可以调用Exit函数释放link,使用trap函数注册了single的handle。在程序结束的时候,调用Exit函数。

cron获取待静态化内容

这里,为了尽量少的破坏现有代码的结构,在lighttpd中做了如下配置:

url.rewrite                = (
                "^/try/(?:\?(?:s=(\w+)&?)?(?:page=(\d+))?)?$" => "/static/try_$1_$2.htm", # pure static
)

这里我希望把http://127.0.0.1/try/?s=time&page=1重定向到/path/to/dir/static/try_time_1.htm,而htm文件是不经过fastcgi的。

通过以上配置可以看出,如果url不匹配该正则,就不会发生这样的重定向。所以为了获取动态内容,可以使用http://127.0.0.1/try/?s=time&page=1&v=dynamic类似的链接。

但是,这样的配置还有一个问题是,如果静态化失败,/path/to/dir/static/try_time_1.htm类似的文件不存在,则返回404error。待解决。

ajax加载动态内容

页面上肯定会有动态内容,比如访问数、用户相关信息等,这些可以使用ajax的方式动态加载。

这样就完成了整个静态化的步骤,附上完整的bash脚本:http://staticize-webpage.googlecode.com/files/static_listpage.tar.gz。

One Comment

  1. Carolann Genualdo says:

    I would like to use the chance of thanking you for the professional instruction I have always enjoyed browsing your site. I am looking forward to the commencement of my college research and the entire groundwork would never have been complete without coming over to your site. If I could be of any help to others, I might be glad to help by means of what I have learned from here.

Leave a Reply