自从六年前我从ASP阵营弃暗投明转向PHP阵营之后,就不时的与Apache打交道,Apache的配置也从1.3研究到2.2版。但是有一个问题一直困扰我,而且它不定时的就冒出来打击我一下,让我很是郁闷。
这个问题是这样的:把网站设置为需要进行SSL双向认证(即通过https://的方式访问网站,还需要有客户端数字证书),如果服务端是基于Apache的话,那么客户端(也就是浏览器)每次访问一个页面,对于页面上的每一份资源(一个页面通常包含很多资源,例如被html页面引用的.js/.css文件,页面中的各个图片、flash等等),都需要做一次数字签名。奇怪的是IIS服务器就没有这种情况。
每访问一个资源就做一次数字签名,这是一件恐怖的事情。一般情况下一个html页面都会包含十几个甚至几十个资源(特别是一些装饰用的小图片和一些小图标等等,每个文件也就两三KB,但是也需要进行数字签名),早期使用数字证书的时候基本上都是将数字证书保存在计算机硬盘上,数字签名也是由CPU来进行,一次数字签名也就几个毫秒,看起来影响就不大,但是随着技术的发展,后来都是以USB Key来对数字证书进行存储和运算,为了安全,数字签名就只能USB Key内部进行。试想一下,处理器速度一般就几M,高的也就几十M的USB Key处理芯片,在做数字签名的时候效率比起计算机两三个G的运算速度低了不少,即使经过特别优化,一般的USB Key做一次数字签名也需要十多二十毫秒。这种情况下,每访问一个资源就需要做一次数字签名,在打开一个网页的时候,就会发现有明显的延时,现象就是页面文字都已经显示出来了,而USB Key的指示灯还在狂闪(USB Key上通常有一个指示灯,当USB Key正在工作的时候就会闪烁,以提醒用户),然后才能够看到页面上的图片内容一个一个的显示出来。
这几年里,对于这个问题我一直都不求甚解,当初想通过修改Apache配置来解决,也试图在PHP脚本中加入Keep-alive之类的标记,但是终不得其法,渐渐的也就有了一个错误的认识,那就是Apache无法做到SSL状态的缓存,客户端访问每个SSL资源都必须重新重新经历握手、产生会话密钥等过程,所以每访问一个资源就会做一次数字签名。
这个错误的认识一直延续了好几年,在这几年中,当有人问到我这方面的问题时,我都毫不犹豫的告诉他这是Apache的问题,是出于安全性考虑才这样做的。但是另一方面,在我内心深处,还是隐约觉得事情不应该是这样的。终于,在一次封闭开发的过程中,我弄明白了事情的真相。
阅读这篇日志的剩余部分 »
很久以前写过一篇《Apache的Rewrite模块》,但那时是Mambo内部完成的参数解析,我一直没有花时间去真正搞清楚rewrite机制是如何进行的。最近做网站需要自己来做rewrite,所以又复习了一遍。
将动态网页链接rewriting成静态链接是最保险和稳定的面向搜索引擎优化方式。如果网站想更好地被搜索引擎收录,网站设计除了面向用户友好(User Friendly)外,搜索引擎友好 (Search Engine Friendly)的设计也是非常重要的。进入搜索引擎的页面内容越多,则被用户用不同的关键词找到的几率越大。在Google的算法调查一文中提到一个站点被Google索引页面的数量其实对PageRank也是有一定影响的。由于Google突出的是整个网络中相对静态的部分(动态网页索引量比较小),链接地址相对固定的静态网页比较适合被Google索引(怪不得很多大网站的邮件列表归档和BLOG按日期归档的文档很容被搜的到),因此很多关于面向搜索引擎URL设计优化(URI Pretty)的文章中提到了很多利用一定机制将动态网页参数变成像静态网页的形式:
比如可以将:
http://www.domain.com/index.php?product=mp3&action=ls
变成:http://www.domain.com/product/mp3/action/ls.html
操作如下:
阅读这篇日志的剩余部分 »
因为种种原因,需要在公司的外网服务器上架构一个CA(证书认证中心)服务,于是乎,开始找免费开源的CA系统。找来找去,找到两个用得比较广泛的开源CA,一个是OpenCA,一个是EJBCA。前者是使用Perl开发的,后者,顾名思义,是Java开发的。
服务器是FreeBSD 7.0,先上的是OpenCA,是因为不想在服务器上装太多的东西,Perl是必装的,所以第一选择就是基于Perl的OpenCA了。使用FreeBSD的Ports方式安装,结果装的过程中发现有太多依赖的库,虽然这些依赖的库都会自动下载并安装,但是心里已经感觉不爽了。接下来的配置让人头疼不已,花了三天时间也没有搞定。
一怒之下,决定把OpenCA打入冷宫。上EJBCA吧,又是一大堆的东西要装,Java运行环境啦,tomcat啦,等等等等。让人郁闷的是要用到一些Java的加密函数库,还必须手工到sun的网站下一堆额外的东西,心里又是不爽起来。结果发现EJBCA的配置更是让人崩溃,近一个星期下来,一事无成。
我靠,装这两个东西,把我精心打造的服务器搞得乱七八糟。于是决定,自己开发一个CA。套一句话说:我是程序员我怕谁~~~
因为公司外部网服务器硬件全面升级(换了一台专门的2U机架式服务器),所以要將原来的网站和邮件服务都迁移到新的服务器上。邮件服务的迁移已经实验是没有问题了(参见从sendmail迁移到postfix),但是在迁移网站的时候出现了一个小问题。
除了迁移网站,还需要增加一些服务,这次要增加的是一个在线演示系统,用于演示利用公司的产品完成网上登录身份认证的功能,其中一段代码是这样的:
阅读这篇日志的剩余部分 »
说句老实话,已经有近两年没怎么上QQ了,“没怎么上”的意思是少于十次。但是最近家里来了几个朋友,在我的电脑上安装了QQ,顺带着装了一堆QQ相关的东东,像是超级旋风、QQ游戏、QQ音乐等等。
看她们玩QQ游戏里的“大家来找茬”,感觉蛮有意思的。于是大家一起上阵,开始找茬。这个游戏里面的图片都不是很清晰,而且多数都是大场景,要把所有的不同之处全找出来,还是有一定难度的。
不过,这怎么能难倒我呢,嘿嘿,写个程序搞定它。
首先是分析。两张并列的图片,大小是一样的,要快速标记出不同的地方,可以逐点取颜色,两个图片中位置相同但图片不同的地方,将点重新绘制成红色,而一样的地方,转换为同等亮度的灰度色,这样,就可以立刻得到不同的区域了,一旦不同的区域被标记出来,剩下的事情就是轻移鼠标,点击确认罢了。
阅读这篇日志的剩余部分 »
![Apex[有所思,有所志]](http://apex.ncksoft.com/wp-content/themes/deepwater/images/dw_site_logo.png)