‘Develop’ 分类

使用加密 cookie 代替 session 的应用方案

星期二, 十二月 23rd, 2008

传统的网站应用中,我们会把一些相对敏感的用户信息保存在 session 中,目的就是为了避免这些敏感信息的意外泄漏,给用户带来不便。但要实现这个功能,我们却要付出比较昂贵的代价。比如单服务器的小型网站,session 占用文件系统或数据库资源,当然因为网站小,用户数量并不多,这个不会带来多大的问题。但如果对一个大型网站,过数万个用户同时在线的话,这个成本就非常大了,并且为了解决多服务器共享 session 的问题,还可能会使用数据库来保存 session 的数据,数万个在线用户的 session 可不是随便搞个数据库就可以抗起来的。

  其实在我们真实的互联网应用中,这部分的数据是否真的很敏感?这个值得大家思考。为了避免使用 session 所要花费的成本,我们可以考虑使用加密的 cookie 来代替。下面介绍一下我做的 cookie 共享方案:

 使用加密cookie代替session的应用

  从图中可以看到,我们为加密 cookie 专门提供了一个 XTea Server(Xtea是一个加密协议),其实它就是一个加密和解密字符串的服务程序,采用 TCP Socket 进行连接。

  因为网站会涉及到多种开发语言和多种应用,比如 PHP/Java 和 Flash 等常用的。为了实现大家的 cookie 共享,我们就需要专门提供这样一个 XTea Server 了。这样无论是什么语言或应用,只要它能够使用 Socket 连接,就可以很方便的共享cookie,比如 Flash 就有 XMLSocket,Flash 也可以很方便的读取浏览器上的 cookie。并且加密和解密都在我们的服务器后台,cookie 可被解密的可能性就降低了。

  当然实现 cookie 的加密共享只是重要的一环,另外我们还需要给 cookie 的数据定制一个数据结构标准,这里我建议大家使用 JSON 数据格式进行共享,因为 JSON 是可以方便的给 JavaScript 语言解析读取,并且现在流行的开发应用都支持 JSON 数据格式。(其实 XML 更广,但它的数据格式实现起来比较长,并不适合我们使用到 cookie 上)

  就是这样我们就已经实现了cookie 加密数据在多种应用中共享使用了。比如用户在网站上登录了,再进入我们的 Flash 应用,Flash 应用就可以直接把用户浏览器上的 cookie 发送到 XTea Server上解密,解读出用户信息了 :)

FastDFS 分布式存储与 yo2cache 的结合

星期四, 十二月 11th, 2008

astDFS 是由 Yahoo中国工程师开发的一个开源的轻量级分布式文件系统,她对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

  FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。且跟踪器(tracker)可使用多台服务器进行均衡,这样就可以避免单点故障的发生。

  使用 FastDFS 分布式文件系统并不能像常规的文件操作一样,需要通过 FastDFS 的 API 把文件上传到分布式文件系统中。同样道理,读取文件也是需要通过 API 接口把文件下载回来。对于没接触过类似文件系统的,可能会感到有些茫然了 _-!! 不会每个读取都要经过 API 吧,这样开发和性能上会不会出现问题?

  其实 FastDFS 分布式文件系统的使用并不复杂,你只需要知道她是一个帮你把文件分发到多个服务器进行存储就Ok了。我们也就是需要这个功能,至于读取的操作我们可以交由 Web Server (yo2cache) 进行处理。

  这是一个简单的应用示意图:

FastDFS & yo2cache

  用户上传文件,经过 PHP 使用 FastDFS 的 API,把文件分发到多个文件服务器上。

  用户下载文件,经过 yo2cache 使用 FastDFS 的 API,到文件所在的文件服务器获取文件,并返回给用户。其中 yo2cache  Web 服务器可做 CDN 均衡,并设置节点本地缓存,起到访问加速作用 :)

开发可缓存加速的动态页面

星期六, 十一月 22nd, 2008

缓存加速的动态页面--指页面内容可以被静态化,可供多个访客读取的。而传统的动西红柿,右手提了玻璃水壶便向阳台走去,哗啦哗啦地摇晃着玻璃水壶。附近的花鸟市场有塑料的喷小巷中穿行,寻找这稚嫩的朗读声,不一会晕头转向,随即问个老太太附近有房子出租么,热情的她告诉我她家就有待租的房水壶,可惜它是塑料的。玻璃水壶。附近的花鸟市场有塑料的喷小巷中穿行,寻找这稚嫩的朗读声,不一会晕头转向,随即问个老太太附近有房子出租么,热情的她告诉我她家就有待租的房水壶,可惜它是塑料的。当然,玻璃的水壶易碎。我宽容卖塑料喷小巷中穿行,寻找这稚嫩的朗读声,不一会晕头转向,随即问个老太太附近有房子出租么,热情的她告诉我她家就有待租的房水壶小贩所能给的理网页并不能直接实现静态化缓存处理,因为当中可能包括了一个用户信息,或与个别用户关联的信息。这些是无法进行公开缓存加速的,本文主要是提供一个开发可公开缓存页面的解决方案   :)

为什么需要缓存加速?

  目前有很多网站是基于PHP、Java或ASP甚至C等语言开发而成, 但无论使用哪种语言进行开发,都必须跟数据库连接、读取和处理数据然后生成页面内容并输出。而数据库正好就是动态页面的速度瓶颈,对于一个百万级访问量的网站,如果没有缓存加速的设计,无法想象网站数据库的压力是如何之大。每秒上千个数据库连接和处理,该需要什么样的数据库系统才能支撑起来?

  只有使用缓存加速的技术,才能有效降低数据库的压力并提高页面处理的效率,从而加快页面打开速度。 (全文...)

使用虚拟URI+域名秘匙技术进行防盗链

星期三, 九月 3rd, 2008

互联网上被广泛采用的防盗链技术有三类:

  1.  判断访问请求的 Referer 是否合法
    技术防盗链效果比较差,下载软件很容易通过伪造 Referer 突破防线。并且不适合授权多个请求来源,比如 Yo2 上的绑定域名用户 a.com ,页面上包含了 image-001.yo2cdn.com/a.jpg ,而验证 Referer 的关键就是要知道 a.com 是可正常获取内容的域名,但 Yo2 上绑定的域名非常多哦,不可能把它们都写到 Referer 的配置列表上吧 :)
  2. 使用 Cookiesession 验证
    该技术的防盗链效果非常好,目前 Blogbus 就是采用该技术。但难以给外界网站设置访问授权,比如需要允许来自 FeedSky 页面可以显示图片,我们就需要 FeedSky 的页面可以在客户浏览器给 blogbus.com 域名下添加验证 cookie ,并且 feedsky.com 是无法跨域名写入 blogbus.com 的 cookie 哦,这个很重要。目前 Blogbus 是给 feedsky 提供 feedsky.blogbus.com 来实现验证 cookie 的。但如果要给多个网站提供访问授权,会很累哈 :)
  3. 使用访问记录数据库验证
    该技术实现防盗链效果最好,也是无法破解的。用户访问一个网页页面,就会记录在一个数据库中,当访问页面上的附件时(如图片),服务器会判断 Referer 地址是否在访问记录的数据库里,如果没有对应的访问记录,就会返回错误的页面了。当然还可以添加 cookie 进一步阻挡非法的请求。但该技术只适合一个网站使用,很难给外界网站进行访问授权。并且还要维护一个庞大的访问记录表,不适合大型网站使用。

综上所述,未找到适合 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 的网站使用,效果不错 :)

Yo2mass 插件已进入内部测试

星期六, 八月 30th, 2008

m
ass 插件将给大家提供一个聚合自己所关注或者好友文章的页面,你只需要到后台开启插件,并在设置页面中添加 feed 地址,就能在博客上添加一个聚合页面了,还支持侧栏输出哦。很简单、很方便 :)

  为防止有人恶意的用于 SEO 操作,所以我们对 feed 地址的数量作出了限制:免费用户3个,绑定域名用户10个。我们也会监测用户的使用情况,发现恶意使用者,将会被关闭博客服务处理。我们提供用户需要的工具,如菜刀,但我们必须阻止使用菜刀杀人的情况发生。

  我们充分考虑到文章的版权问题,所以插件不会提供文章全文转载,只能显示几百字以内的摘要。对于文章上的图片,则以小的缩略图显示。或者有人会说文章罢了,不值几个钱。但我却认为低价值不能代表可以随意转载。人家本来就只值那么一点点,你还要落井下石啊?

  mass 插件本身意义不是丰富自己博客的内容,而是给大家提供一个互相展示的场所,给访客多一些内容导航。这就相当于更高层次的友情链接。好比我自个的博客,内容以博客界、互联网技术为主,所以我的聚合 feed 都与这些有关,访客如果有更多的内容需求,可以通过 mass 插件导航到其他博客上 :)

  结语:我认为 mass 插件是有益于博客发展的,希望大家能更好的使用它。

HTTP 的后台任务

星期四, 六月 12th, 2008

所周知 HTTP 协议是无保持连接的,HTTP 1.1 虽然实现了保持连接的能力,但依然无法在连接上实现交互功能。浏览器服务器发送一个 GET 请求,然后等待服务器返回数据,完成一个数据交互处理。问题就是出在等待返回这点,当有一个不需要服务器返回数据,但需要服务器处理一定的操作时,就显得这个等待是没有必要的。

举个比较长见的例子:

一个使用 Javascript (或图片) 方式记录的统计程序,需要用户每次打开页面都在服务器端做记录操作,而我们不需要收取服务器端返回的任何结果,只要服务器能做计数的操作就可以了。

虽然是 Javascript 或图片的调用,但在页面在浏览器渲染并显示给用户的过程,依然会造成一定的延时。如果我们能把这个没用的等待剔除,就可以加快页面的加载速度。

  但这个应用非常特殊,正常来说根本没有这样的 web server 支持 _-!!,我在 google 查阅过一些资料,可以使用给浏览器发送 Header : Content-Length: 0 的方法来实现 ,经过测试在未经过 nginx 的情况下确实能够令到浏览器停止加载,但如果前端有 nginx 就没有任何效果了。

  如需要 100% 的效果,只能从 web server下手,在收到 GET 请求时就直接返回一个内容,但继续进入 PHP 处理接下来的数据操作。

  Yo2 的页面访问都是经由 yo2cache 处理的,so 我们很容易就实现了这项功能 :)

Yes! 是 Yo2messenger

星期一, 四月 21st, 2008

早以前,一个老伯伯就发过一个 Yo2messenger 的截图,但此老伯伯当时只做了个非常简陋的登录界面,就没有回事。并未继续开发下去。

  现在这个老伯伯终于下定决心要把它给“生”下来的 :) 并且制作了更好的界面,剩下的工作就是加入实际功能。

  程序是基于网页 AJAX 的形式进行开发,当然对于 Windows 平台就提供一个简单的框架,更方便使用。而 Linux 等其他使用 FireFox 浏览器的用户则可以在浏览器的侧栏加载此程序 :) 界面已定型,现在给大家放个图

sc.gif

发挥你的思维,没有做不到的事情

星期三, 一月 16th, 2008

新的一年,Yo2服务器压力比以前大多了。为了能够提供快度的博客访问,我们使用了多种服务软件。比如 nginxsquidlighttpd等,这些在 linux 系统上的性能都是十分棒的 :) 不过我们还在追求更快、更高效率的解决方案。

我作为一个开发员,想法又特别的多 _-!! 居然想到自己写个 web server _-!! 汗~

有了想法当然必须做出行动 :) 立刻到网上查找相关资料,首先从英文网站出发(国外的开源项目多,并且代码都很好),逛了一整天,终于找到一个国人写的 epoll 代码模型。因为只是个模型,根本没有任何业务处理能力,这些就得自己写了 :) 花费2天 时间,就在这个基础模型上实现了 web server 功能。

yo2pagengine 终于面世 :) 不到 1000 行代码,当然还有很多功能没加进去,但已经可以实现基本的 web server 服务。

我使用了 siege web 服务压力测试软件,测试了一下 yo2pagengine 的性能。在 gdb 调试进程内服务,得出的成绩是每秒处理 150 个请求。我把该结果告诉了 charles 和一个熟悉 web 系统的网友,都觉得这个成绩很棒咯。呵呵,但这个数据只是我在 debug 模式测试出来的,真正的业务处理能力在下面:

$:siege -c 300 -r 100 -f oneoo.com.url (包含350个URL)

Transactions: 30000 hits
Availability: 100.00 %
Elapsed time: 83.53 secs
Data transferred: 217.47 MB
Response time: 0.07 secs
Transaction rate: 359.15 trans/sec
Throughput: 2.60 MB/sec
Concurrency: 25.49
Successful transactions: 30000
Failed transactions: 0
Longest transaction: 13.77
Shortest transaction: 0.00

处理能力达到每秒处理 360 个请求 !哇~这个成绩是在我自己的电脑上测试的,web server 和 siege 都开在同一个电脑上,还有 linux 效率比较低的 X (在我的电脑上,Vista 运行起来比它流畅多了,很不解,怎么人人都说它性能好)如果是在真正的服务器上使用,肯定不只这个成绩 :)

下面才是本文主要部分:

其实我也不熟悉C语言,只能算入门。但还是顺利实现了自己的需要的功能 :)

这么多的编程语言,人是不可能全都熟悉的,问题是人的思维是否灵活。

不要担心前路是否平坦,只有踏出了第一步,你才真正知道这条路的好坏,遇到什么问题,尽努力逐一解决,方可实现自己的目标。但如果你连第一步都无法踏出去,你连成功的机会都没了。

yo2.cn 开始提供国际域名绑定公测

星期二, 五月 1st, 2007

公测期,所以免费的哦 :) 在2月我们已经实现了域名绑定功能,但因系统升级和完善的事情,推迟到5月才正式公开测试 ,在内测期间感谢yee等内测用户的支持,给我们提出了一定的意见,并反馈一些Bug。

现在的公测期的系统相对来说是稳定多了,并且Bug也得到大部分的修正,度过公测期就会正式开始收费服务了。年费比较低廉,RMB 50块以内。

今天晚上踏入5.1的零时我们就准时提供绑定服务了 :) 统计到2点,有几十个用户做了绑定,是个很不错的开始。我们定继续努力为大家提供更好的WordPress博客服务.

  绑定地址:http://blog.yo2.cn/domain.php

yo2messager 进入内测阶段

星期天, 四月 1st, 2007

经过几天空余时间的开发,已经初步成型,实现了登录和消息提示功能,其它功能还有待开发。

分页: 1/2 12 下一页