Submitted by admin on 2011, June 29, 10:29 AM
曾经写过是否要放弃使用varnish/squid, 经过几天的实验,终于找到一种比较理想的解决方案:
直接使用proxy模块的proxy_store来实现分布mirror.
首先说说我的需求:
1. 我需要将一些静态文件从应用服务器剥离, 负载到其他的节点.
2. 这些文件主要是静态Html和图片,包括缩略图. 这些文件一旦创建,更新的频率很少.
3. 在某些时候需要手动立即从各个分布节点删除或更新某些文件
4. 尽可能减少应用服务器的请求, 进而减少内网的流量
之前,我分别使用了squid和varnish.
最初用的squid,还凑合.不过,squid在高负载下会出现停滞甚至crash或者是空白页.
于是换成varnish.
varnish也是老毛病,偶尔也会crash.
二者的共同点,就是当cache快满的时候,效率会急剧下降, 同时,对主服务器的请求甚至都
阻塞了整个内网.
要解决这个情况,varnish需要手动重启, squid则需要清除整个缓存目录.
对于varnish, 由于是纯内存的加速,因此,无法将cache设置太大,否则用上swap, 基本上是几倍的速度下降,
而且很容易就段违例了. 于是,当bots访问网站的时段, 就是噩梦产生的时候, 由于爬虫遍历太多的文件,
造成缓存很快溢出,于是频繁的invalid,此时,内网的带宽占用能达到100m以上….
可能有人说,为什么不用NFS. NFS的问题主要是锁的问题. 很容易造成死锁, 只有硬件重启才能解决.
为了脱离这个噩梦,我决定试验nginx的proxy_store. 如果使用Lighty,倒是非常简单,因为有mod_cache,配合lua,
会很灵活. 不过nginx的proxy_store并非是一个cache,因为它不具备expires, 新的cache模块仍在开发中.
不过经过仔细考量, 我惊喜的发现,其实这正是我想要的, 因为在我的需求中,绝大多数的文件都是不过期的,因而也无必要
去和后端服务器验证是否过期.
配置其实并不太复杂,但是过程有些曲折, 基本的思路是:
nginx首先检查本地是否有请求的文件,如果有直接送出,没有则从后端请求,并将结果存储在本地.
第一个方案,是基于error_page来实现的:
upstream backend{
server 192.168.8.10:80;
}
server {
listen 80;
access_log /logs/cache.log main;
server_name blog.night9.cn www.night9.cn night9.cn;
proxy_temp_path /cache/temp;
root /cache/$host;
location / {
index index.shtml;
error_page 404 = /fetch$uri;
}
ssi on;
location /fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via "s9/nginx";
alias /cache/$host;
}
#对于请求目录的情况下要特殊对待
location ~ /$ {
index index.shtml;
error_page 403 404 = @fetch;
}
location @fetch {
internal;
proxy_pass http://backend;
proxy_store /cache/$host${uri}index.shtml;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header Via "s9/nginx";
proxy_set_header X-Real-IP $remote_addr;
}
}
这个方案对于普通的情况下,基本满足.
缓存是做到了,但是如何实现更新呢?
其实很简单,只要将指定url的从本地cache目录删除即可.
因为proxy_store会按照实际请求的url地址建立相应的目录结构.
于是,我写了一个fastcgi, 只要将需要清楚的url传递给它,从cache目录中删除.
其实可以用perl_module实现,但是考虑到独立fastcgi服务更为稳定,还是和以前的统计一样,
用perl的CGI::Fast模块实现, 替换了10几行代码就搞定了.
事情本来就该告一段,不过,由于主服务器上使用了SSI, 新的问题就来了:
我们希望SSI的解析是在子节点上进行,而不是在主服务器上进行, 这样我们可以独立更新相应
区块的文件即可, 否则就需要清除所有的shtml文件,这是比较可怕的.
但是,Nginx对于SSI的subrequest无法使用error_page来重定向.(不确定是否是bug,不过如果允许
的确容易造成死循环).
于是,一个更为简单的方案就诞生了:
set $index 'index.shtml';
set $store_file $request_filename;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
rewrite (.*) $1index.shtml last;
}
location / {
index index.shtml;
proxy_store on;
proxy_temp_path /cache/temp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via "s9/nginx";
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass http://backend;
}
}
Wow! 更为简单.
应该感谢Nginx的Rewrite模块, 这点也是我用Nginx替换Lighttpd的一个主要原因.
好了,我可以忘掉varnish,squid了.
如果有兴趣的人想使用, 请一定注意:
这个方案对静态文件更为有效,如果要加速动态请求,还是要用varnish
说道加速, 利用Memcached和nginx配合可以迅速提升访问动态页面的速度,
有时间再说.
转
nginx | 评论:0
| Trackbacks:0
| 阅读:811
Submitted by admin on 2011, June 29, 10:28 AM
expires浏览器本地缓存设置
expires
语法:expires [time|epoch|max|off]
默认值:expires off
使用字段:http, server, location
在应答头中是否开启对“Expires”和“Cache-Control”的增加和修改操作。
可以指定一个正或负的时间值,Expires头中的时间根据目前时间和指令中指定的时间的和来获
得。
epoch表示自1970年一月一日00:00:01 GMT的绝对时间,max指定Expires的值为2037年12月31日
23:59:59,Cache-Control的值为10 years。
Cache-Control头的内容随预设的时间标识指定:
·设置为负数的时间值:Cache-Control: no-cache。
·设置为正数或0的时间值:Cache-Control: max-age = #,这里#的单位为秒,在指令中指定。
参数off禁止修改应答头中的"Expires"和"Cache-Control"。
注意:expires仅仅适用于200, 204, 301, 302,和304应答
//对图片,flash文件在浏览器本地缓存30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
//对js,css文件在浏览器本地缓存1小时
location ~ .*\.(js|css)$
{
expires 1h;
}
nginx | 评论:0
| Trackbacks:0
| 阅读:1144
Submitted by admin on 2011, June 28, 4:49 PM
页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。
301重定向可促进搜索引擎优化效果
从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法。当网站的域名发生变更后,搜索引擎只对新网址进行索引,同时又会把旧地址下原有的外部链接如数转移到新地址下,从而不会让网站的排名因为网址变更而收到丝毫影响。同样,在使用301永久性重定向命令让多个域名指向网站主域时,亦不会对网站的排名产生任何负面影响。
302重定向可影响搜索引擎优化效果
迄今为止,能够对302重定向具备优异处理能力的只有Google。也就是说,在网站使用302重定向命令将其它域名指向主域时,只有Google会把其它域名的链接成绩计入主域,而其它搜索引擎只会把链接成绩向多个域名分摊,从而削弱主站的链接总量。既然作为网站排名关键因素之一的外链数量受到了影响,网站排名降低也是很自然的事情了。
综上所述,在众多重定向技术中,301永久性重定向是最为安全的一种途径,也是极为理想的一款解决方案。
对于正确实施301重定向,有这样几个方法可供大家参考:
1.在.htaccess文件中增加301重定向指令
采用“mod_rewrite”技术,形如:
RewriteEngine on
RewriteRule ^(.*)$ http://www.localhost/$1 [R=301,L]
2.适用于使用Unix网络服务器的用户
通过此指令通知搜索引擎的spider你的站点文件不在此地址下。这是较为常用的办法。
形如:Redirect 301 / http://www.localhost/
3.在服务器软件的系统管理员配置区完成301重定向
适用于使用Window网络服务器的用户
4.绑定/本地DNS
如果具有对本地DNS记录进行编辑修改的权限,则只要添加一个记录就可以解决此问题。若无此权限,则可要求网站托管服务商对DNS服务器进行相应设置。
DNS服务器的设置
若要将blog.localhost指向www.localhost,则只需在DNS服务中应增加一个别名记录,可写成:blog IN CNAME www.localhost。
如需配置大量的虚拟域名,则可写成:* IN CNAME www.localhost.
这样就可将所有未设置的以localhost结尾的记录全部重定向到www.localhost上。
5.用ASP/PHP实现301重定向:
ASP:
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.localhost/"
Response.End
PHP:
header("HTTP/1.1 301 Moved Permanently");
header("Location:http://www.localhost/");
exit();
apache/web | 评论:0
| Trackbacks:0
| 阅读:952
Submitted by admin on 2011, June 28, 4:48 PM
两种实现方法,第一种方法是判断nginx核心变量host(老版本是http_host):
server {
server_name www.test.com test.com ;
if ($host != 'www.test.com' ) {
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
...
}
第二种方法:
server {
server_name test.com;
rewrite ^/(.*) http://www.test.com/$1 permanent;
}
我用的是第一种方法,这两种方法中, permanent是关键,详细说明见nginx重定向规则说明。
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
转
nginx | 评论:0
| Trackbacks:0
| 阅读:817
Submitted by admin on 2011, June 28, 4:44 PM
Nginx的重定向用到了Nginx的HttpRewriteModule,下面简单解释以下如何使用的方法:
rewrite命令
nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下:
rewrite 正则表达式 替换目标 flag标记
flag标记可以用以下几种格式:
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:
location /download/ {
rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;
}
nginx重定向的IF条件判断
在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种:
正则表达式
如:
匹配判断
~ 为区分大小写匹配; !~为区分大小写不匹配
~* 为不区分大小写匹配;!~为不区分大小写不匹配
例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
文件和目录判断
-f和!-f判断是否存在文件
-d和!-d判断是否存在目录
-e和!-e判断是否存在文件或目录
-x和!-x判断文件是否可执行
例如下面设定nginx在文件和目录不存在的时候重定向:
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
return
返回http代码,例如设置nginx防盗链:
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.localhost;
if ($invalid_referer) {
return 404;
}
}
set
设置nginx变量
nginx | 评论:0
| Trackbacks:0
| 阅读:789
Submitted by admin on 2011, June 28, 4:43 PM
防止盗链不仅能保护版权,又节约了不少流量。最近和bsdmap交流了下,听说他们通过防盗链节约了近1/3的图片流量。nginx的防盗链设置还是比较简单的,可以分为普通防盗链和ip/cookie based防盗链。其中ip based防盗链需要安装nginx的module,所以相对麻烦一些。
nginx最简单的防盗链设置如下
location ~* .(gif|jpg|png|swf|flv)$ {
valid_referers none blocked localhost;
if ($invalid_referer) {
return 403;
}
}
通过nginx的重定向方式返回403错误。
NginxHttpAccessKeyModule实现防盗链
需要先安装nginx的NginxHttpAccessKeyModule模块。其运行方式是:如我的nginx目录下有一个file.gz 的文件。对应的URI 是http://localhost/nginx/file.gz
若用ngx_http_accesskey_module 后则根据用户的IP生成一个key值,如下的链接来访问http://localhost/download/file.zip?key=23497sdf897. 只有给定的key值正确了,才能够下载nginx目录下的file.gz,这样就可以避免被盗链了。
转
nginx | 评论:0
| Trackbacks:0
| 阅读:753
Submitted by admin on 2011, June 27, 7:14 PM
对于经常刷机的Android机友来说,难免会运气不好碰到刷机失败损坏recovery程序导致手机无法启动的情况,也就是传说中的手机变砖块了。不过刷机失败手机变砖并不是世界末日,略施小计就可以让你的Android手机重新复活。
·首先要在电脑上安装配置AndroidSDK
刷机失败后手机变砖无法在手机上完成操作,此时就需要借助AndroidSDK工具,所以你必须在操作的电脑上下载并安装AndroidSDK程序。
程序的下载地址和具体的安装配置方法请参照下面的地址:http://digi.tech.qq.com/a/20101203/000896.htm
·然后我们需要安装Android手机USB驱动程
安装完AndroidSDK后就可以把手机通过USB线缆连接至电脑,开启手机电源后电脑会提示安装设备驱动程序,不要让系统自动查找驱动程序安装,选择自定义驱动程序位置,因为已经安装了AndroidSDK,驱动程序的位置默认为AndroidSDK的安装目录下的usb_driver子目录,选择从这个目录安装驱动程序。如果之前安装过了驱动,手机可以和电脑连接的,就跳过这步吧。
·接着下载一个对应你的机型可用的ecovery程序
变砖以后的Android手机能否复活的关键就是Recovery程序,因为只要还能进入recovery恢复模式,就意味着你可以再次通过recovery刷写新的ROM,也就相当于是给电脑重新安装操作系统,这样就能重新进入系统了,也就以为着我们可以再次进入手机操作界面了。Android平台有很多可用的recovery程序,不同的机型也都使用着不同的recovery,大家一定要根据自己的手机型号来寻找,针对不同手机型号有不同版本的程序,下载时注意和手机型号匹配这样才能保证安全可靠。把下载的recovery程序放在某一目录备用,例如:c:ecovery.img
·下面要重新给变砖的手机安装recovery程序(重要步骤)
在电脑上打开命令提示符(在Windows系统中选择──开始──运行──输入cmd,然后按回车)
输入#adbdevices回车,如果会显示出一串序列号说明手机已经正常连接电脑了。在命令提示符使用cd命令切换到recovery程序所在的目录。然后输入下面的命令:
#adbrebootbootloader
回车后手机应该会进入fastboot模式,然后再输入执行下面的命令把recovery程序安装到手机上
#fastbootflashrecovery.img
回车后如果看到命令行中有下面的提示就说明recovery程序已经成功安装。
fastbootflashrecoveryrecovery.img
sending‘recovery’(4612KB)…OKAY
writing‘recovery’…OKAY
完成后拔掉手机USB连接线,关机,重新按进入recovery模式的组合键,看看是否可以重新进入recovery模式了,如果可以进入recovery了,这就说明你的手机已经成功复活了,现在可以重新刷机,给手机再安装一个操作系统了。安装完成就能重新进入手机系统正常使用了。
不过上面的这个方法只适用与普通变砖的手机,手机刷机变砖的情况也有很多,不同的情况也会导致不同的结果,如果经过多次测试,上面的办法都无法修复,那就只好找专业人士帮忙检修了。虽然刷机的风险很小,但还是建议大家刷机有风险,操作需谨慎。其实选择一个合适的,稳定的,好用的系统一般就不用折腾了,只要官方没说有升级,自己就无需过多的去刷写其他系统。
android | 评论:0
| Trackbacks:0
| 阅读:869
Submitted by admin on 2011, June 27, 3:11 PM
最近入了一部Desire HD,终于花了一个晚上破解了一下,大部分都是参考网上的帖子:
ROOT+S-OFFhttp://www.hiapk.com/thread-648023-1-1.html
使用USB共享有线网络 http://android.sj.91.com/content/2010-12-09/20101209001826049,1.shtml
关于root
1、何为“root”?
“Root”就是指用户可以完全权限访问Linux内核:“Root用户”可以编辑修改系统 内的任何东西。出于安全考虑,“普通用户”没有该完全访问权限。
root你的手机 之后,你就可以读写未root时你无法访问的手机内部核心区块。
当然,是否root完全取决你自己。普通手机用户不root也可以很好的使用自己的手机。
2、为何要“root”我的手机?
大多数情况下,root仅对手机开发者有用。除非你想要运行一些需要root的软件 ,或者刷机。
root后,你可以做的事:
a)运行更多的Linux命令(android ADB)和超级用户权限。
b)可以使用许多需要root权限的软件(例如,钛备份,Root Explorer等)。
c)更改某些重要的核心系统设置 。比如,关闭官方 Rom的安全校验以使我们可以刷写第三方固件,或者运行某些有趣的调节程序 比如说超频,再或者还可以让我们安装核心recovery程序。
3、root安全吗?
是的。如果你胆大心细,按照教程 来做,不会发生什么蛋疼的事。
4、root后会删除 我的个人资料吗?
不会。root仅仅是改变系统权限而已。
5、root会使我的保修失效吗?
嗯,这是个好问题。退一万步说,你可以unroot你的手机并恢复出厂设置,来假装什么事也没发生过。
话说回来,现在大多数人都是用的水货,保修神马的都是浮云。
6、root后我可以把VISIONary这个软件删掉吗?
可以。卸载VISIONary这个软件并不会unroot你的手机,仅仅是卸载了root手机的工具而已。
但是root后多出来的那个“超级用户”/“授权管理”软件不能删。
7、root过程是可逆的吗?
是的。只要你愿意完全可以unroot你的手机。
8、如何unroot我的手机?
打开VISIONary,点击“Unroot Now!”,就这么简单。
9、root后我可以刷自制rom 了吗?
不行。刷自制rom(非官方的,或是未签名的),需要手机S-OFF。
关于S-OFF和刷机
1、“S-OFF”是什么?我为何需要“S-OFF”?
每一部手机缺省状态下都是“S-ON”。为了获取完全的写入权限(例如刷自制固件,装自制recovery工具),需要转换为“S-OFF”。
S-ON 意为:security on,S-OFF 意为:security off。
S-OFF不同于root:S-OFF可以让你通过Bootloader里的Fastboot或者自制recovery(多数人用的都是clockwork)刷写自制固件。
2、如何“S-OFF”?
目前有两种S-OFF的方法:
a)通过安装工程模式 的hBoot来S-OFF。即所谓的软解。
b)通过某些设备,例如白卡来S-OFF。即所谓白卡解锁。
软解的手机进入Bootloader后第一行的末尾显示的是:ENG S-OFF,白卡解的手机则是:SHIP S-OFF。ENG意为engineering即工程模式,SHIP即意为原厂发布的。
3、如何改回“S-ON”?
因某些原因(送去保修等)想要恢复S-ON的话,需要下载 对应你手机版本的HTC 官方刷写程序RUU刷回原厂固件。这样S-ON就回来了。
4、“RUU”是什么?
RUU意为Rom Update Utility。是一个PC端的刷机工具。大多数RUU都是HTC官方发布的,其包含了刷机工具和官方固件,并打包为一个单独文件 。
5、什么是“Rom”?
Rom意为Read Only Memory,他指手机的不可访问的只读的内部存储单元。他包含了android操作系统和所有原厂预装应用软件工具。
通常一个完整的ROM(或者说固件)包含了:一个recovery镜像,一个boot镜像(包含了核心(Kernel)和ramdisk),一个系统镜像(操作系统,或者简称“OS”),和一个Radio镜像。
我们也经常把可刷入手机内存 的镜像统称为ROM或固件。
6、什么是“Radio”?我们为何要刷Radio?
一个合适的Radio可以改善我们手机的信号 、蓝牙、WiFi和GPS 。也许也可以提高手 机电池 的寿命。
7、什么是“刷机”?
刷机就是把一个新的固件镜像刷入手机的内存里。
你可以刷入一个recovery,或是一个boot,或系统,或Radio,或者是包含以上所有东西的完整Rom。
8、我为什么要刷机?
刷机后:
a)把你的手机更新到最新的官方固件(因为是官方的,所以无需root也无需S-OFF,也不会使保修失效)。
b)把你的手机去除品牌定制化,变成通用的官方固件。
c)刷入了自制固件,其:包含/去除HTC sense,其他android版本,等等。
d)安装了更好用的recovery工具,比如clockwork。
e)更合适的Radio。
9、刷机会删除我的个人资料吗?
如果你仅仅是刷boot或者recovery的话,不会。
但是如果你刷的是系统或者完整的Rom的话,会的。你个人的所有资料都会被清理掉,所以在刷机前请备份个人资料。
在菜市场里有很多备份软件。(例如钛备份)
你也可以备份NANDroid 。
10、刷机会使保修失效吗?
嗯,又是个好问题。同样的退一万步讲,如果你备份后原厂固件或是下载了对应你手机版本的固件的话,可以随时刷回去。
同样,对于大多数的水货手机来说,一切保修都是浮云。
关于Bootloader和Recovery
1、何为“Bootloader”?
Bootloader是一个Rom里的固件管理工具。使用它可以让你恢复出厂设置,用Fastboot刷机,加载Recovery工具。
在Bootloader里你也可以查看S-ON/S-OFF的状态,固件和Radio的版本等等。
进入Bootloader无需root或S-OFF。在每台HTC出厂的手机里都有。
2、如何进入Bootloader?
关机,然后按住音量-和电源键。(需要把“快速开机 ”关闭,在“设置”》“应用程序”里改。或者拔掉电池,让手机真正的关机。)
你可以直接拔电池来退出Bootloader。
如果你装了自制recovery的话,可以进入recovery,然后重启手机。
3、如何备份我的当前ROM(固件)?
在自制recovery里备份。
4、自制recovery是什么?
自制recovery(比如clockwork)是一个增强的recovery版本,其替换了固件里原来的recovery。
自制recovery比原厂的recovery要好,因为他可以让你可以安全的刷写未签名的自制rom,也可以备份你手机内存里的整个固件镜像(NANDroid备份)。
5、如何安装ClokworkMod (CWM)Recovery?
你必须先root和S-OFF。然后用“Rom Manager”安装,或者单独下载clockwork recovery在ADB环境下手动刷写。
6、什么是NANDroid备份?
一个完整的体统镜像可以被重新刷回手机。其不仅仅是简单备份,因为他包含了当前在你手机内存里的所有内容:Boot、Recovery、系统、数据、缓存,等。他是你手机整个ROM的快照。
执行NANDroid备份的方法:进入clockwork recovery,进到“Backup and Restore”选项中执行。NANDroid备份将会被保存在sd卡ClockworkMod文件夹内。
7、如何加载NANDroid备份?
如果你可以进入clockwork recovery的话,只需简单的从他的菜单里加载NANDroid。
如果你的手机变砖从而无法进入clockwork recovery的话,也有最后一个方法:单独下载clockwork recovery至PC里,然后打开cmd控制台,进入存有clockwork recovery的目录,使用以下ADB命令刷写:“fastboot flash recovery recovery-clockwork-2.5.1.2-vision.img”。(前提是你的PC上有ADB环境,不过好像这招对白卡解锁的机器 无用)
8、什么是ADB?
ADB意为Android Debug Bridge。其使用Linux命令对手机发出指令。你可以在MS-DOS环境下直接使用ADB命令,或者进入ADB shell使用Linux命令。通过ADB,你可以安装软件,卸载软件,刷写镜像,改变手机设置等。
android | 评论:0
| Trackbacks:0
| 阅读:927