开发可缓存加速的动态页面
星期六, 十一月 22nd, 2008为什么需要缓存加速?
目前有很多网站是基于PHP、Java或ASP甚至C等语言开发而成, 但无论使用哪种语言进行开发,都必须跟数据库连接、读取和处理数据然后生成页面内容并输出。而数据库正好就是动态页面的速度瓶颈,对于一个百万级访问量的网站,如果没有缓存加速的设计,无法想象网站数据库的压力是如何之大。每秒上千个数据库连接和处理,该需要什么样的数据库系统才能支撑起来?
为什么需要缓存加速?
目前有很多网站是基于PHP、Java或ASP甚至C等语言开发而成, 但无论使用哪种语言进行开发,都必须跟数据库连接、读取和处理数据然后生成页面内容并输出。而数据库正好就是动态页面的速度瓶颈,对于一个百万级访问量的网站,如果没有缓存加速的设计,无法想象网站数据库的压力是如何之大。每秒上千个数据库连接和处理,该需要什么样的数据库系统才能支撑起来?
综上所述,未找到适合 Yo2 使用的技术,所以我在第一种技术方式的基础上进行加强,实现虚拟URI+域名秘匙的防盗链技术。详细描述如下:
目前我们的页面 http://oneoo.com/ 上包含一个图片 http://image-001.yo2cdn.com/picture.png。我们在页面的输出过程中加入过滤器,过滤器根据页面所在域名 oneoo.com 生成域名秘匙: ocm (生成秘匙的规则请自行定义),并把 http://image-001.yo2cdn.com/picture.png 替换为 http://image-001.yo2cdn.com/ocm/picture.png,这样服务器上收到图片访问的请求时,就会根据 Referer 的域名生成一个 Key,并把这个 Key 与访问 URI 上的域名秘匙进行对比,就可以起到防盗链的作用。当然我们还可以给 feedsky.com 等网站进行授权,下载软件使用图片所在域名作为 Referer 也是无法突破的,并且域名秘匙是经过加密的,也不能轻易伪造出来。
我们的服务器端 yo2cache 在做防盗链判断后,会对合法的访问请求进行 uri 改写 ,http://image-001.yo2cdn.com/ocm/picture.png 自动改回真实地址 http://image-001.yo2cdn.com/picture.png,返回正确的内容。
该防盗链技术适合有能力改造或自行编写 web server 的网站使用,效果不错 ![]()
为防止有人恶意的用于 SEO 操作,所以我们对 feed 地址的数量作出了限制:免费用户3个,绑定域名用户10个。我们也会监测用户的使用情况,发现恶意使用者,将会被关闭博客服务处理。我们提供用户需要的工具,如菜刀,但我们必须阻止使用菜刀杀人的情况发生。
我们充分考虑到文章的版权问题,所以插件不会提供文章全文转载,只能显示几百字以内的摘要。对于文章上的图片,则以小的缩略图显示。或者有人会说文章罢了,不值几个钱。但我却认为低价值不能代表可以随意转载。人家本来就只值那么一点点,你还要落井下石啊?
mass 插件本身意义不是丰富自己博客的内容,而是给大家提供一个互相展示的场所,给访客多一些内容导航。这就相当于更高层次的友情链接。好比我自个的博客,内容以博客界、互联网技术为主,所以我的聚合 feed 都与这些有关,访客如果有更多的内容需求,可以通过 mass 插件导航到其他博客上 ![]()
结语:我认为 mass 插件是有益于博客发展的,希望大家能更好的使用它。
举个比较长见的例子:
一个使用 Javascript (或图片) 方式记录的统计程序,需要用户每次打开页面都在服务器端做记录操作,而我们不需要收取服务器端返回的任何结果,只要服务器能做计数的操作就可以了。
虽然是 Javascript 或图片的调用,但在页面在浏览器渲染并显示给用户的过程,依然会造成一定的延时。如果我们能把这个没用的等待剔除,就可以加快页面的加载速度。
但这个应用非常特殊,正常来说根本没有这样的 web server 支持 _-!!,我在 google 查阅过一些资料,可以使用给浏览器发送 Header : Content-Length: 0 的方法来实现 ,经过测试在未经过 nginx 的情况下确实能够令到浏览器停止加载,但如果前端有 nginx 就没有任何效果了。
如需要 100% 的效果,只能从 web server下手,在收到 GET 请求时就直接返回一个内容,但继续进入 PHP 处理接下来的数据操作。
Yo2 的页面访问都是经由 yo2cache 处理的,so 我们很容易就实现了这项功能 ![]()