在Sina App Engine上架设图片CDN
07/25/2012
IMUNC 2012的新闻中心使用Linode日本的线路,网络ping不稳定,有时候能到800ms,由于参会代表很多,线路负载很大。于是考虑采用国内的CDN,由于IMUNC.com并没有备案,所以只能自己想办法了。
于是考虑了在SAE上架设一个分发点,自己写了个脚本,功能比较简单,仅支持静态内容缓存。脚本的原理便是利用SAE的Storage储存图片,在收到请求时判断图片是否已经存在了Storage中,如果不存在则跳转会主服务器下载图片,功能类似于CDN。
建立CDN首先要在SAE应用后台开启Storage,并且设置缓存过期时间。
在版本目录下建立index.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php define( 'DOMAIN', 'Storage域名'); //应用Storage的域名(储存域) define( 'CDNSITE', '应用名-域名.stor.sinaapp.com'); //访问此Storage的网址 define( 'SITE', 'static.yoursite.com'); //主服务器 $url = $_SERVER[ 'SCRIPT_URL' ]; $s = new SaeStorage(); if( $s->fileExists( DOMAIN, $url ) ) { header( 'location: http://'. CDNSITE . $url); exit(); } header( 'location: http://'. SITE . $url); $f = new SaeFetchurl(); $content = $f->fetch( 'http://'. SITE . $url ); if($f->errno() == 0) { $s->write( DOMAIN, $url, $content ); } ?> |
部署完脚本后需要将AppConfig更改为如下内容以设置REWRITE:
1 2 3 |
handle: - rewrite: if( !is_file() && !is_dir()) goto "index.php?%{QUERY_STRING}" |
访问这样架设的CDN时会额外增加一次跳转,但相比其之前的网速,新浪的速度在国内时很快的。
您好,谢谢你的代码。但我测试的时候不行啊。当图片不存在于storage时,直接从主域名加载图片,而不是将图片下载到storage中。请问应该怎么办?
当Storage中不存在图片时,程序会先向用户发出重定向到主域名,然后才会从主域名上下载图片并保存到Storage,因此第一个用户访问时会被跳转主域名,之后的用户才会跳转到Storage。
如果第一个用户访问后Storage中仍然没有图片出现,可能是由于你的主域名设置了防盗链,因此SaeFetchurl()的fetch方法抓取图片失败,如果是这种情况可以换用CURL,这个SAE也是支持的。
没有设置防盗链,可是还是不行,郁闷!!!
可以把代码第15行的header注释掉,后面开始第19行开始换成
调试一下问题啦,我觉得可能是有地方设置不一样吧
可能是我填写信息错误吧,刚刚接触SAE,也不懂。“应用Storage的域名”指的是应用的域名还是storage的域名?
Storage的域名(就是储存域)。。不好意思没写清楚