Nginx 简单的负载均衡配置示例[转]

www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP。

用户访问http://www.s135.com,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。

用户访问http://blog.s135.com,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。

以下为配置文件nginx.conf:

引用user www www;

worker_processes 10;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

#最大文件描述符
worker_rlimit_nofile 51200;

events
{
use epoll;

worker_connections 51200;
}

http
{
include conf/mime.types;
default_type application/octet-stream;

keepalive_timeout 120;

tcp_nodelay on;

upstream www.s135.com {
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
server 192.168.1.5:80;
}

upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}

server
{
listen 80;
server_name

location / {
proxy_pass
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

log_format www_s135_com ‘$remote_addr – $remote_user [$time_local] $request ‘
‘"$status" $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"’;
access_log /data1/logs/www.log www_s135_com;
}

server
{
listen 80;
server_name blog.s135.com;

location / {
proxy_pass
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

log_format blog_s135_com ‘$remote_addr – $remote_user [$time_local] $request ‘
‘"$status" $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"’;
access_log /data1/logs/blog.log blog_s135_com;
}
}
附:Nginx 的安装方法可参照《Nginx 0.5.31 + PHP 5.2.4(FastCGI)搭建可承受3万以上并发连接数,胜过Apache 10倍的Web服务器》文章的以下段落(仅做负载均衡,无需支持PHP的安装方法):

二、安装PHP 5.2.4(FastCGI模式)
4、创建www用户和组,以及其使用的目录:

三、安装Nginx 0.5.31
1、安装Nginx所需的pcre库:
2、安装Nginx
3、创建Nginx日志目录
5、启动Nginx

使用php-fpm来平滑变更FastCGI模式下的php设置

在使用FastCGI方式运行php的时候,如果我们改变了php.ini的设置,就得重新启动php的fastcgi守护程序。如果你的系统负载 比较大的话,这个重启过程或许会让你的系统中断服务一段时间。php-fpm就是为了解决这个问题而诞生的,它可以在php的fastcgi进程不中断的 情况下重新加载你改动过的php.ini。
而且php-fpm可以不用再依赖其它的fastcgi启动器,比如lighttpd的spawn-fcgi,对于我来说终于可以摆脱lighttpd的影子了。

还等什么,开始吧!

我的php版本是5.2.6,先到官网下载与php版本对应的php-fpm补丁:PHP-FPM

假设:php源代码目录在:/usr/local/src/php-5.2.6,php-fpm下载到了/usr/local/src

  1. cd /usr/local/src
  2. gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1

补丁打好以后,编译php的时候增加了下面几个参数:

–enable-fpm 激活fastcgi模式的fpm支持
–with-fpm-conf php-fpm的配置文件(默认是PREFIX/etc/php-fpm.conf)
–with-fpm-log php-fpm的日志文件(默认是PREFIX/logs/php-fpm.log)
–with-fpm-pid php-fpm的pid文件(默认是PREFIX/logs/php-fpm.pid)

编译的时候–enable-fpm当然是必须的,其它几项可以根据你自己的情况自行调整。
编译参数:

  1. cd /usr/local/src/php-5.2.6
  2. ./configure –enable-fastcgi –enable-fpm –prefix=/usr/local/php5 –with-config-file-path=/usr/local/php5/etc –THE-OTHERS
  3. make
  4. make install

其中–THE-OTHERS代表了其它的一些php编译参数,这里就略去了。

稍等片刻,等php编译并安装好,下面开始配置php-fpm。

  1. vi /usr/local/php5/etc/php-fpm.conf

php-fpm.conf是一个xml格式的纯文本文件,具体细节可以自己打开看看,基本上一看就明白了。在这里特别注意一下这几个配置字段:

  1. <value name="listen_address">127.0.0.1:9000</value>

这个表示php的fastcgi进程监听的ip地址以及端口

  1. <value name="user">nobody</value>
  2. <value name="group">nobody</value>

表示php的fastcgi进程以什么用户以及用户组来运行

  1. <value name="display_errors">0</value>

是否显示php错误信息

  1. <value name="max_children">5</value>

最大的子进程数目

下面运行php-fpm:

  1. /usr/local/php5/bin/php-cgi –fpm

现在php的fastcgi进程就已经在后台运行,并监听127.0.0.1的9000端口。
可以用ps和netstat来看看结果:

  1. ps aux | grep php-cgi
  1. netstat -tpl | grep php-cgi

安装好了php-fpm,那么它是怎么来达到我们最初的目的的呢?
很幸运,php-fpm自己就给我们准备了一个程序来控制fastcgi进程,这个文件在$PREFIX/sbin/php-fpm

运行一下:

  1. /usr/local/php5/sbin/php-fpm

该程序有如下参数:

start 启动php的fastcgi进程
stop 强制终止php的fastcgi进程
quit 平滑终止php的fastcgi进程
restart 重启php的fastcgi进程
reload 重新加载php的php.ini
logrotate 重新启用log文件

也就是说,在修改了php.ini之后,我们可以使用

  1. /usr/local/php5/sbin/php-fpm reload

这样,就保持了在php的fastcgi进程持续运行的状态下,又重新加载了php.ini。

后话:这个文件可以稍作修改,让它成为CentOS/Redhat的服务,减少一些管理上的开销。

Squid集群做CDN全网加速

主服务器群,然后在利用Squid逆向缓存web80端口来加速自己的网站.各大门户网站象163,sina,chinaitlab之类基本都是使用的这种技术,好处是大大的有。比如加速了网络和可以防黑客(因为他们见到的都是CDN的主机)
这是利用Squid逆向集群模式做的一种应用

网络环境:

主服务器群:源Web服务器群 位于公网ip:220.XXX.XXX.X port:80(后台才是WEB的服务器)

注: 要保证TCP80,UDP3130在防火墙上是开的(供icp_port通讯使用,多台Squid集群才会用到)

全国各地分服务器:A服务器公网IP111.xxx.xxx.x

B服务器公网ip112.xxx.xxx.x

注: 要保证TCP80,UDP3130在防火墙上是开的(供icp_port通讯使用,多台Squid集群才会用到)

……………………
需要解决的问题:

全国的所有用户,无论是电信,还是网通,都能速度很好的打开网站

实施

1、分别在主服务器群和全国各地分服务器的三台服务器安装Squid,不会安装的请直接关闭本网页。

2、分别配置Squid,这里只重点叙述Squid集群配置要点。

主服务器群Squid的配置:

http_port 220.XXX.XXX.X:80 vhost vport #让Squid监听本机ip的80端口

icp_port 3130 #多台squid通信使用

cache_peer "内网web服务器的地址" parent 80 0 no-query originserver no-digest name=cache0 #设置源Web服务器群的ip和端口

cache_peer 220.XXX.XXX.X sibling 80 3130 name=cache1 #让远程的squid连接本地Squid工作在sibling模式并指定其端口

cache_peer 111.xxx.xxx.x sibling 80 3130 name=cache2 #A服务器

cache_peer 112.xxx.xxx.x sibling 80 3130 name=cache3 #B服务器

cache_peer_domain cache0 www.php-oa.com #配置本机squid允许接受访问的域名

acl Safe_ports port 80

acl Safe_ports port 3130 #允许以上端口的代理

全国各地分服务器Squid的配置:

A服务器:

http_port 111.xxx.xxx.x:80 vhost vport

icp_port 3130

cache_peer 220.xxx.xxx.x parent 81 0 no-query originserver no-digest name=cache0 #设置主服务器群Web服务器为源服务器

cache_peer 111.xxx.xxx.x sibling 80 3130 name=cache1

cache_peer 220.xxx.xxx.x sibling 80 3130 name=cache2

cache_peer 112.xxx.xxx.x sibling 80 3130 name=cache3

cache_peer_domain cache0 www.php-oa.com

acl Safe_ports port 80

acl Safe_ports port 3130

B服务器:

http_port 112.xxx.xxx.x:80 vhost vport

icp_port 3130

cache_peer 220.xxx.xxx.x parent 80 0 no-query originserver no-digest name=cache0

cache_peer 112.xxx.xxx.x sibling 80 3130 name=cache1

cache_peer 220.xxx.xxx.x sibling 80 3130 name=cache2

cache_peer 111.xxx.xxx.x sibling 80 3130 name=cache3

cache_peer_domain cache0 www.php-oa.com

acl Safe_ports port 80

acl Safe_ports port 3130
虽然配置好了但是如何让电信和网通的用户能有选择的访问两个不同镜像呢?这个请各位自己查相关的资料,要不到https://www.dnspod.com申请双线,电信网通的转发服务

注:下面看看cache_peer的参数

通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵
列,通过其他的选项来控制选择代理伙伴的方法。Cache_peer的使用格式如下:
cache_peer hostname type http_port icp_port
共有5个选项可以配置:
1. hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示;
2. type:指明hostname的类型,是同级子代理服务器还是父代理服务器,也即parent(父) 还是 sibling(子);
3. http_port:hostname的监听端口;
4. icp_port:hostname上的ICP监听端口,对于不支持ICP协议的可指定7;
5. options:可以包含一个或多个关键字。
Options可能的关键字有:
1. proxy-only:指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的;
2. weight=n:用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peer的ICP响应时间来 决定其weight的值,然后squid向其中拥有最大weight的peer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工 指定其weight值;
3. no-query:不向该peer发送ICP请求。如果该peer不可用时,可以使用该选项;
4. Default:有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default和
no-query选项让所有请求都发送到该父代理服务器;
5.login=user:password:当你的父代理服务器要求用户认证时可以使用该选项来进行认证。

读squid权威指南笔记:squid集群(sibling模式)

认真读了几次权威指南,其中的第10章 与其他Squid会话就是指的squid集群(sibling模式)的工作.

做了一些小的总结.

配置成sibling时的工作原理.

默 认的,squid首先发送大多数的请求到邻居cache,然后再到原始服务器。当ICP查询进来时,squid通过检查内存索引,能告知它是否有更新的、 缓存的响应。squid会计算URI的MD5 hash值,并且在索引里查找它。假如没有找到,squid返回ICP_MISS消息。假如找到了,squid检查超时时间。假如目标没有刷 新,squid返回ICP_MISS。对刷新的目标,squid返回ICP_HIT。

cache选择的顺序
选择新鲜cache目标的优先级是:
local cache
parent
sibling
direct


对ICP的理解

因为ICP会更加快,所以这选择ICP.
ICP 是轻量级的目标定位协议,它作为Harvest项目的一部分而被发明。ICP客户发送查询消息到一个或多个ICP服务器,询问它们是否缓存了某个 URI(ICP查询仅包含URI,没有另外的请求头部。这让它很难精确的指示cache命中)。每个服务器响应一个ICP_HIT(ICP命 中),ICP_MISS(ICP丢失),或其他类型的ICP消息。ICP客户使用ICP响应里的信息来做转发决定。
ICP也得承受某些设计不足带来的责难:性,伸缩性,假命中,和请求方式的缺乏。该协议不包括任何安全机制。通常squid不能确认某个ICP消息是可信的;它依赖于基于地址的访问控制来过滤掉不想要的ICP消息。
ICP的伸缩性也很差。ICP消息的数量(和带宽)增长,与邻居cache的数量成正比。除非使用某种隔离机制,这实际上限制了你能使用的邻居cache的数量。我不推荐拥有超过5或6个邻居cache。
netdb主要用于ICP查询.netdb是设计来测量到原始服务器的远近

有用的命令
log_icp_queries on #是否记录指令来阻止记录icp的日志从这些查询
icp_hit_stale on
注 意.它是告诉squid对任何cache住的目标,即使它是陈旧的,都返回ICP_HIT。这在父子关系的cache中很安全,但对姐妹关系的cache 有问题。假如必须转发所有的假命中,激活icp_hit_stale就会给姐妹关系cache带来麻烦。这时ICP客户端cache_peer的 allow-miss选项就变得有用。当设置了allow-miss选项时,squid忽略它发送到姐妹cache的HTTP请求里的only-if- cached指令。
假如激活了icp_hit_stale,必须确保miss_access不会拒绝来自姐妹cache的cache(源squid)丢失请求。

Cache摘要(Cache Digest)
Cache 摘要基于由Pei Cao首先发布的一项技术,叫做摘要缓存。基本思路是用一个Bloom filter来表现cache内容。邻居cache下载其他每个cache的Bloom filter(也即摘要)。然后,通过查询摘要来决定某个URI是否在邻居的cache里。

相对于ICP,cache摘要以空间交换时间。ICP查询浪费时间(延时),cache摘要浪费空间(内存,磁盘)。在squid中,邻居的摘要完全存放在内存里。在一个典型的摘要里,每百万目标需要大约625KB的内存。

digest_generation on #开启.本指令控制squid是否产生自己的cache摘要

squid堆叠会有三个问题要注意
1.经历错误的http头,如服务不可达的中squid中的html错误.
2.假命中.
3.转发循环

转发循环的控制方法有
1.使用cache_peer_access指令来阻止这类循环。例如,假如邻居cache的IP地址是192.168.1.1,下面的行让squid不会产生转发循环:

acl FromNeighbor src 192.168.1.1
           
cache_peer_access the.neighbor.name deny FromNeighbor

2.转发循环在HTTP拦截里也能发生,特别是当拦截设备位于squid和原始服务器之间的路径上时。

Squid 通过检查Via头部里的主机名,来检测转发循环。假如2个协作cache有相同的主机名,实际上就会得到假转发循环。在该情形 下,unique_hostname指令很有用。注意,假如Via头部被过滤掉了(例如使用headers_access指令),squid就不能检测到 转发循环。

下面转一个别人对这个的笔记

1) cache_peer邻居分为parent(父邻居),sibling(子邻居).parent和sibling的区别在于父邻居能为子cache转发丢失的Cache,而子邻居不可能.(是可以的,但要设置miss_access)

2) cache_peer通过cache_peer_access和cache_peer_domain来控制邻居的访问.二者的区别在于前者一般需要先定义一个ACL而后者都直接匹配相应的域名就可以了.
如:
cache_peer 192.168.0.1 parent 3128 3130
acl AllowDomain dst www.abc.com
cache_peer_access AllowDomain 192.168.0.1
cache_peer_domain 192.168.0.1 parent .xyc.com

3) cache_peer通过never_direct,always_direct,hierarchy_stoplist等限制对邻居的访问.

4) squid与邻居cache的通信一般为先为never_direct,always_direct确定怎么样转发(根据相应的标识driect, never_direct标识为direct_no,always_direct标识为direct_yes即直接转发到原始服务器等等 direct_maybe详情见Squid中文权威指南10.10.1),接着Squid根据Squid的设置查看邻居的摘要是否命中(根据ICP或 HCTP的请求所发现的),若命中则立即放入转发列表中.这一切也依靠cache_peer_access,cache_peer_domain的.同时 squid检查netdb侦测的RTT是否最优,决定是否选择此邻居转发.

5)子邻居不转发任何命中丢失的请求,而父邻居可以转发,若 Squid发现父邻居到原始服务器的RTT(往返时间)小于自已到原始服务器的RTT,将此请求转发给此父邻居.(RTT时间需借助Netdb选项的检 测,对于父邻居的选择还有另外一些定义选项如:Weigh=N设置父邻居的权重来给予他更高的优先级)

ICP/HCTP和Cache摘要以及CARP一样,都是判断请求的URI是否在邻居中被命中。ICP是发送URL请求,Squid等待着邻居的回应,的延迟也是很大的,而且在姐妹Cache中假命中又显得很突出。No-Query,禁用ICP协议! Cache摘要是在邻居中生成摘要信息,摘要往往把反应在Cache中的信息,邻居下载每个Cache中的摘要,发送URI请求时查看URL是否在某个摘要中。

squid 安装调试过程中的几个常用命令.

刚才又看了一遍置顶的 问答帖子
发现好多提问的貌似都没有仔细的看过《squid中文手册》造成在调试安装的过程中浪费了很多时间
我贴一下吧
解压,编译,make ,make install 就不说了。
从 make install 后开始。
当你的 squid.conf 配置文档按照你的想法修改完以后,启动 squid 之旅就开始了。
1,初始化你在 squid.conf 里配置的 cache 目录
#squid/sbin/squid -z
如果有错误提示,请检查你的 cache目录的权限。
2,对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。
#squid/sbin/squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。
3,在前台启动squid,并输出启动过程。
#squid/sbin/squid -N -d1
如果有到 ready to server reques,恭喜,启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动它。
4,启动squid在后台运行。
#squid/sbin/squid -s
这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。
5,停止 squid
#squid/sbin/squid -k shutdown
这个不用解释吧。
6,重引导修改过的 squid.conf
#squid/sbin/squid -k reconfigure
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让squid重新按照你的 squid.conf 来运行。
7,把squid添加到系统启动项
编辑 /etc/rc.d/rc.local
添加如下行:   /usr/local/squid/sbin/squid -s
当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。

再来点其他的。
1,修改cache 缓存目录的权限。
#chown -R squid:squid /home/cache
我的cache缓存目录是 /home/cache,squid执行用户和用户组是 squid,squid。
2,修改squid 日志目录的权限
#chown -R squid:squid /usr/local/squid/var/logs
这一步并不是适合每一个使用squid的用户.意为让squid有权限在该目录进行写操作 。
例如生成   access.log cache.log store.log
3,查看你的日志文档。
#more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_MISS
该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是现重原始服务器获取并返回给访问用户。
关于 TCP_XXXX 等参数及代表的信息,请参看《squid中文权威指南》13.2.1 章节。
当然,本例中的蓝色文字是可以修改为其他的参数,例如你的域名  www.xxxx.com ,同样可以看到access.log里关于该域名的行。

先到这里吧,想起来再补充。
人人为我,我为人人,重复一下彭勇华哥哥的话 :
窗外繁星点点,开源的世界亦如这星空般美丽,而squid是其中耀眼的一颗星。

同步发布于偶的部落窝  http://blog.274500.com
如有转载请注明出自CU.

404的http头在squid中的处理

404的网页在squid中也会被缓存,会出现TCP_NEGATIVE_HIT:NONE www.php-oa.com这样的日志,可以用
negative_ttl 的参数来控制时间,默认5分钟,有点长,建议小点

Squid中的日志出现TCP_CLIENT_REFRESH_MISS的问题排除

今天检查Squid发现大量的日志出现TCP_CLIENT_REFRESH_MISS,见到Cacti中的流量,自己的CDN节点命令不高,查了很久的原因,最后发现,原来是exe的文件下载的原因.

花了半天的时间才解决这个问题,要解决这个问题。

range_offset_limit 和 reload_into_ims
range_offset_limit这个参数,主要是对各种流媒体和要断点续传的文件的缓存的。缺省是0,也就是说 只要client发过来的http header里包含了“Range:” ,squid会把这个请求转到后端http server,最致命的是,http server返回的内容并不会进入squid的cache store。

range_offset_limit就派上用场了,把它的值设置为-1;然后squid会把Range头去掉,而从后端http server把内容全部抓下来,放到cache store里,随后的对该cache的访问就不再转发到后端http server,可以大大提高命中率。也可以给这个参数设置一个值,会提前下载多少内容.但要注意,这个参数不要大过 maximum_object_size ,不然下载完了,maximum_object_size 这个参数不能缓存这么多,又删除这个文件.白白点用你的流量.

reload_into_ims 这个参数,要分清哦,不是refresh_pattern中的参数,他是一个单独的参数.
在flashget和迅雷之类的软件,下载时发送http header时会包含下列信息:
Cache-Control:no-cache
Pragma:no-cache
这样的话squid主机接受这http header以后会让squid服务器直接连接web server取新的数据。这样对服务器很大的压力,因为服务器的过期时间是后面的程度控制,不方便用refresh_pattern的 ignore-reload 参数强行忽略请求里的任何no-cache指令,这时只有使用reload_into_ims这个参数.

打开这个参数为on ,就行,这个参数违反 HTTP 协议,但是对大部分网站来说是可以设置为 on 的,只要后端服务器对
If-Modified-Since 头的判断正确即可。

下面是参数解释

When you enable this option, client no-cache or “reload” requests will be changed to If-Modified-Since requests.
如果客户端送过来no-cache的http头,和刷新重新载入他的浏览器时,装改变成请求变成 If-Modified-Since的请求.

如何理解Squid refresh_pattern

refresh_pattern的作用:
用于确定一个页面进入cache后,它在cache中停留的时间。

语法:
refresh_pattern [-i] regexp min percent max [options]

几个概念:
resource age =对象进入cache的时间-对象的last_modified
response age   =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)

举个例子,这里只考虑percent, 不考虑min   和 max

例如:refresh_pattern 20%

假设源服务器上www.aaa.com/index.htm   —–lastmodified 是       2007-04-10 02:00:00
squid上    proxy.aaa.com/index.htm   index.htm进入cache的时间   2007-04-10 03:00:00

1)如果当前时间 2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。

2)如果当前时间   2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%

一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过 期,squid会向源服务器发一个index.htm是否有改变的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直 接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。

如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算resource age,进一步计算出存活时间。

实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。

理解了百分比后,min max就好理解了

squid收到一个页面请求时:
1、计算出response age,
2、如果response age<min 则 fresh   如果response age>max 则 stale
3、如果response age在之间,如果response时间<存活时间,fresh,否则stale

SQUID refresh_pattern详解

SQUID refresh_pattern详解refresh_pattern 大概是 squid 最有意思但最不好懂的配置参数了,经过看书,大概明白如何使用,写出来贡献。

记住refresh_pattern 只对后端没设置Expires过期时间的页面起作用,比如论坛页面;而对类似apache mod_expires 设置过的页面不起作用。

说明之前,先将个概念LM,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。

refresh_pattern 的语法是

Code:
refresh_pattern [-i] regexp min percent max [options]

regexp 就不讲了,大家都明白的;)
min, max的单位是分钟,percent就是百分比。

refresh_pattern 的算法如下:(当前时间定义为CURRENT_DATE)
1) If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的
2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的
3) else cache是过期的
cache过期就需要从后面server取新鲜内容。
<img src="http://blog.cnlinux.net/image/default/ad.gif">
如果希望页面一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项
一般情况可以使用 reload-into-ims。
举例:

Code:
refresh_pattern -i .gif$ 1440 50% 2880 ignore-reload
refresh_pattern -i .jpg$ 1440 50% 2880 ignore-reload
refresh_pattern -i .png$ 1440 50% 2880 ignore-reload
refresh_pattern -i .mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i .wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i .rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i .swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i .mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i .wma$ 1440 50% 2880 ignore-reload
refresh_pattern -i .css$ 10 50% 60 reload-into-ims
refresh_pattern -i .js$ 10 50% 60 reload-into-ims
refresh_pattern -i .xml$ 10 50% 30 reload-into-ims

Nginx+Haproxy+Thin

Nginx和Thin以前都介绍过,这里主要介绍下Haproxy的安装以及配合使用。

1、下载
wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.15.3.tar.gz

2、编译安装
sudo aptitude install libpcre++-dev
tar -zxvf haproxy-1.3.15.3.tar.gz
cd haproxy-1.3.15.3
sudo make TARGET=linux26 CPU=i386 USE_STATIC_PCRE=2
sudo make install
install -d /usr/local/sbin
install haproxy /usr/local/sbin
install -d /usr/local/man/man1
install -m 644 doc/haproxy.1 /usr/local/man/man1
install -d /usr/local/doc/haproxy
for x in configuration architecture haproxy-en haproxy-fr; do
        install -m 644 doc/$x.txt /usr/local/doc/haproxy ;
    done

3、配置文件
1)Haproxy配置(/opt/devroot/itechtag/haproxy.conf)

Haproxy配置

  1. global  
  2.    daemon  
  3.    maxconn        4096       # total max connections (dependent on ulimit)  
  4.    nbproc         2          # number of processing cores  
  5.    
  6. defaults  
  7.    mode               http  
  8.    clitimeout         60000        # maximum inactivity time on the client side  
  9.    srvtimeout         30000        # maximum inactivity time on the server side  
  10.    timeout connect    4000         # maximum time to wait for a connection attempt to a server to succeed  
  11.    
  12.    option             httpclose      # disable keepalive (HAProxy does not yet support the HTTP keep-alive mode)  
  13.    option             abortonclose   # enable early dropping of aborted requests from pending queue  
  14.    option             httpchk        # enable HTTP protocol to check on servers health  
  15.    option             forwardfor     # enable insert of X-Forwarded-For headers  
  16.    
  17.    
  18.    balance roundrobin             # each server is used in turns, according to assigned weight  
  19.    
  20.    stats enable                   # enable web-stats at /haproxy?stats  
  21.    stats auth         admin:pass   # force HTTP Auth to view stats  
  22.    stats refresh      5s         # refresh rate of stats page  
  23.    
  24. listen rails_proxy 127.0.0.1:8100  
  25.    # – equal weights on all servers  
  26.    # – maxconn will queue requests at HAProxy if limit is reached  
  27.    # – minconn dynamically scales the connection concurrency (bound my maxconn) depending on size of HAProxy queue  
  28.    # – check health every 20000 microseconds  
  29.    
  30.    server web1 127.0.0.1:8000 weight 1 minconn 3 maxconn 6 check inter 20000  
  31.    
  32. listen slow_proxy 127.0.0.1:8200  
  33.    # cluster for slow requests, lower the queues, check less frequently  
  34.    server web1 127.0.0.1:8000 weight 3 minconn 30 maxconn 300 check inter 20000  
  35.    server slow1 127.0.0.1:8001 weight 1 minconn 10 maxconn 300 check inter 40000  
  36.    server slow2 127.0.0.1:8002 weight 1 minconn 1 maxconn 300 check inter 40000  
  37.    server slow3 127.0.0.1:8003 weight 1 minconn 1 maxconn 300 check inter 40000  

2)Nginx配置

Nginx配置

  1. # File generated on 25 May 08  
  2.   
  3. #upstream name has to be unique so add on the port number  
  4. #generate multiple mongrels  
  5. upstream thin_9000{  
  6.      server 127.0.0.1:8200;  
  7.      }  
  8.   
  9. server {  
  10.              listen    80;  
  11.              server_name localhost;  
  12.   
  13.              access_log /opt/devroot/itechtag/log/access.log;  
  14.              error_log   /opt/devroot/itechtag/log/error.log;  
  15.   
  16.              root    /opt/devroot/itechtag/public/;  
  17.              index   index.html;  
  18.              
  19.              location / {  
  20.                     proxy_set_header   X-Real-IP   $remote_addr;  
  21.                     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
  22.                     proxy_set_header Host $http_host;  
  23.                     proxy_redirect false;  
  24.   
  25.                     if (-f $request_filename/index.html) {  
  26.                                             rewrite (.*) $1/index.html break;  
  27.                            }  
  28.                            if (-f $request_filename.html) {  
  29.                                             rewrite (.*) $1.html break;  
  30.                            }  
  31.   
  32.                            if (!-f $request_filename) {  
  33.                                             proxy_pass http://thin_9000;  
  34.                                             break;  
  35.                            }  
  36.              }  
  37.   
  38. }  

3)thin配置

thin配置

  1. —  
  2. pid: tmp/pids/thin.pid  
  3. log: log/thin.log  
  4. port: 8000  
  5. max_conns: 1024  
  6. timeout: 30  
  7. chdir: /opt/devroot/itechtag  
  8. max_persistent_conns: 512  
  9. environment: production  
  10. address: 0.0.0.0  
  11. servers: 4  
  12. daemonize: true  

4、启动
sudo haproxy -f /opt/devroot/itechtag/haproxy.conf -p pidfils.oid

5、停止
kill $(cat /home/source/haproxy-1.3.15.3/examples/pidfils.oid)

6、刷新
sudo haproxy -f /opt/devroot/itechtag/haproxy.conf -sf $(cat /opt/devroot/itechtag/pidfils.oid)

7、监控
http://127.0.0.1:8200/haproxy?stats

8、测试
ab -n 2000 -c 200 http://127.0.0.1/

附录:Haproxy帮助信息
iceskysl@IceskYsl:/home/source/haproxy-1.3.15.3$ haproxy
HA-Proxy version 1.3.15.3 2008/09/02
Copyright 2000-2008 Willy Tarreau <w@1wt.eu>

Usage : haproxy -f <cfgfile> [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]
        [ -p <pidfile> ] [ -m <max megs> ]
        -v displays version ; -vv shows known build options.
        -d enters debug mode ; -db only disables background mode.
        -V enters verbose mode (disables quiet mode)
        -D goes daemon ; implies -q
        -q quiet mode : don’t display messages
        -c check mode : only check config file and exit
        -n sets the maximum total # of connections (2000)
        -m limits the usable amount of memory (in MB)
        -N sets the default, per-proxy maximum # of connections (2000)
        -p writes pids of all children to this file
        -de disables epoll() usage even when available
        -ds disables speculative epoll() usage even when available
        -dp disables poll() usage even when available
        -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.

参考资料:
http://codesnippets.joyent.com/tag/ubuntu