注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Chun Tian (binghe)

超越自我,洞察宇宙

 
 
 

日志

 
 

回顾博客图片读接口Apache配置  

2007-03-06 00:52:15|  分类: 一般技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
系统管理员对于优化网络产品性能是可以有一定贡献的。例如:

很久以前,我们通过 Tomcat 来读取博客图片:

JkMount /photo/*.jpg space
#servlet .jpg
RewriteRule /photo/([a-zA-Z0-9_\.-]+)\.jpg$ /photo/$1.jpg [PT,L]

第一次革命性修改发生在博客正式上线之前,在 dfs 开发人员的帮助下,我们利用复杂的重写规则和 perl 脚本绕过 Tomcat 在 Apache 上直接读取博客图片,配置思想完全来自世界上配置最复杂的 UNIX 服务 - Sendmail:

RewriteMap bucket2address txt:/etc/netease/backend/bucket2address.txt
RewriteMap bucket2vol txt:/etc/netease/backend/bucket2vol.txt
# Old Time like Sendmail (binghe)
RewriteMap fid2path prg:/etc/apache2/dfs/fid2path
RewriteMap checksum prg:/etc/apache2/dfs/checksum
RewriteRule ^/photo/([0-9]+)\.jpg$ /photo/fid2path/${fid2path:$1} [N]
RewriteRule ^/photo/(.*/[0-9]+)\.jpg$ /photo/${checksum:$1} [N]
RewriteRule ^/photo/T/([0-9]+)$ /photo/fid2path/${fid2path:$1} [N]
RewriteRule ^/photo/F /style/common/default.gif [L]
RewriteRule ^/photo/-[0-9]+\.jpg$ /style/common/user_default.gif [L]
RewriteRule ^/photo/fid2path/([0-9]+)/(.*)$ http://${bucket2address:$1}/dfs/${bucket2vol:$1}/$1/$2 [P]

遗憾的是上述配置只使用了一天,因为基于perl的外部重写表效率太低了,而Debian的Apache 2.0似乎无法定义重写锁(RewriteLock),于是不得不动用C语言,博客开发者CE为我们开发了一个Apache模块来代替上述两个外部重写表,所有图片URL在重写规则处理之间就已经转化为 /fid2path 形式了,于是重写规则得以简化:

RewriteMap bucket2address txt:/etc/netease/backend/bucket2address.txt
RewriteMap bucket2vol txt:/etc/netease/backend/bucket2vol.txt
RewriteRule ^/photo/fid2path/([0-9]+)/(.*)$ http://${bucket2address:$1}/dfs/${bucket2vol:$1}/$1/$2 [P]

有一天,我跟博客开发者们说,Apache 2.2 的时代到来了。Apache 2.2 送给我基于 Berkeley DB 的重写表,于是重写表查询效率提高了:

RewriteMap bucket2address dbm=db:/etc/netease/backend/bucket2address.bdb
RewriteMap bucket2vol dbm=db:/etc/netease/backend/bucket2vol.bdb
RewriteRule ^/photo/fid2path/([0-9]+)/(.*)$ http://${bucket2address:$1}/dfs/${bucket2vol:$1}/$1/$2 [P]

网易相册走进了我的生活,在仿照博客处理相册图片读接口的过程中突然想到一种更加抽象的方法,修改 Apache Rewrite 模块代码然后独立编译成 Debian 包,在系统内置重写表的基础上加入三个我们自己的重写表,只用来完成最基本的重写规则无法处理的操作,并且利用环境变量得以参数化,这样我们只利用这一个包就能帮助 Apache 2.2 处理博客和相册两种非常不同的环境。kghost 改进了配置处理流程,将防盗链特性直接做成整个图片获取流程中的一部分,最后我还加入了当有服务器临时故障时将图片请求重写成默认图片的特性:

RewriteMap bucket2address dbm=db:/etc/netease/backend/bucket2address.bdb
RewriteMap bucket2vol dbm=db:/etc/netease/backend/bucket2vol.bdb
RewriteMap md5 int:netease_hmacmd5
RewriteMap dfs int:netease_dfs
RewriteRule ^/photo/([^/]*)/([0-9]+)(\..*)?$ /pic_warning.jpg [E=hmacmd5_key:***************,E=md5:$1,E=id:$2,E=ext:$3]
RewriteCond %{ENV:netease} =p
RewriteCond %{ENV:md5} =${md5:%{ENV:id}}
RewriteRule ^/pic_warning\.jpg$ /proxy/${dfs:%{ENV:id}}
RewriteCond ${bucket2address:$1|localhost} =localhost
RewriteRule ^/proxy/([0-9]+)/(.*)$ /pic_warning.jpg [L]
RewriteRule ^/proxy/([0-9]+)/(.*)$ http://${bucket2address:$1}/dfs/${bucket2vol:$1|x}/$1/$2 [P]

另外一个改进就是从很早开始,在我的建议下,博客开发人员把图片访问URL改成了 img.blog.163.com 的域名,然后让硬件加速器直接到磁盘阵列上去寻找图片,这样上述配置文件其实已经不在博客的主 Web 服务器上了。最后,为了兼容早先留在博客文章里的 URL,我们把它永久重定向到新的域名去:

RewriteRule ^/(photo/.*)$ http://img.blog.163.com/$1 [R=301]

以上就是博客图片读接口的发展历程,为安全需要隐去了一些包括密钥在内的关键部分,基本上只保留了纯技术部分,以供 Apache 管理员参考。
  评论这张
 
阅读(786)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017