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

初尝利用HAProxy 实现负载均衡

先说一些无关的话题了!好久没有发贴了,多愿谅!最近一直忙,谢谢喜欢linuxpk,和喜欢netseek的朋友们!()。其实本人也是真真正正的菜鸟,写这些文章也主要是对自己学习的一个很好的总结,更重要的是帮助那些对新技术和喜欢的朋友,学习相关的知识起到辅助作用。虽然是菜鸟,但从学校到毕业工作一路走来,在网络上认识不少的朋友,无论是对工作和都帮助不少!收获不少!在此感谢他们!
正如还在毕业之初,白金大哥在网络上和我说,我的前辈朋友都是我的金桶那时候傻的连金桶都不知道是什么意思(PS:别笑!)。人生最宝贵的是能遇到一些志同道合的朋友,一起努力为明天奋斗!
虽然有些人很久没有和他们联系了,但是每个人的帮助我会永记在心的!再次感谢他们!
最高兴的是linuxpk推出了<<开源>>电子杂志[下载地址:http://bbs.linuxpk.com/thread-12999-1-1.html],希望学习linux的朋友多多投稿!多写一些小笔记,帮助网络上对linux感兴趣的朋友,同时希望linuxpk(linux宝库)论坛能够真真正正的成为大家一个互动讨论学习和认识好朋友的一个交流平台!好了说这么多了,希望大家一起努力!(PS:年纪大了,话就多了!)。

一,HAProxy 介绍
   反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, 会自动将该服务器摘除,故障恢复后再自动将该服务器加入。新的1.3引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend.

二,利用HAPorxy实现负载均衡
   1. 利用HAProxy实现负载均衡
192.168.169.137 (haproxy)———负载均衡———-(192.168.169.117;192.168.169.118)
安装配置HAproxy
cd /usr/local/
wgethttp://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.14.2.tar.gz
tar zxvf haproxy-1.3.14.2.tar.gz
mv   haproxy-1.3.14.2   haproxy
cd haproxy
make TARGET=linux26

2. 创建配置文件
# vi haproxy.cfg

CODE:

--------------------------------------------------------------------------------------------------------------------
global
       maxconn 5120
       chroot /usr/local/haproxy
       uid 99
       gid 99
       daemon
   quiet
       nbproc   2   #通过nbproc多设置几个haproxy并发进程,这样每个进程的task_queue相对就会短很多,性能自然就能提高不少
       #pidfile /var/run/haproxy-private.pid

defaults
       log     global
       mode http
       option   httplog
       option   dontlognull
       log 127.0.0.1 local3
       retries 3
       option redispatch
       maxconn 2000
       contimeout    5000
       clitimeout    50000
       srvtimeout    50000

listen webfarm 0.0.0.0:80
   mode http
   stats uri /haproxy-stats     #监控haproxy状态
   stats realm Haproxy statistics
   stats auth netseek:52netseek   #设置状态监控的用户名为netseek密码为52netseek
   balance roundrobin     #负载均衡算法
   cookie SERVERID insert indirect
   option httpclose #
   option forwardfor   #apache日志转发功能
   option httpchk HEAD /check.txt HTTP/1.0   #健康检测
server app_bbs1 192.168.169.117:80 cookie app1inst1 check inter 2000 rise 2 fall 5
server app_bbs2 192.168.169.118:80 cookie app1inst2 check inter 2000 rise 2 fall 5
syslog.conf里加一行
local3.*       /var/log/haproxy.log
  
# touch /var/log/haproxy.log
# chown haproxy:haproxy /var/log/haproxy.log
# chmod u+x /var/log/haproxy.log
  
# tail –f /var/log/harpoxy.log 监控日志

# ./haproxy -f haproxy.cfg 启动服务.

监控状态图示http://192.168.169.137/haproxy-stats,输入用户名密码查看状态。


harproxy.jpg

后端apache日志处理
配置httpd.conf
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b " combined
       CustomLog /var/log/httpd/access_log combined

虚拟主机不记录检测日志:
SetEnvIf Request_URI "^/check.txt$" dontlog
LogLevel warn
ErrorLog /var/log/httpd/vhost_error.log
CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog

三.相关介绍
#./haproxy –help //haproxy相关命令参数介绍.
haproxy   -f   <配置文件>   [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-s] [-l] [-dk]
   [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist…]
   -d     前台,debug模式
   -D     daemon模式启动
   -q     安静模式,不输出信息
   -V     详细模式
   -c     对配置文件进行语法检查
   -s     显示统计数据
   -l     显示详细统计数据
   -dk 不使用kqueue
   -ds 不使用speculative epoll
   -de 不使用epoll
   -dp 不使用poll
   -db 禁用后台模式,程序跑在前台
   -sf <pidlist>
   程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
   -st <pidlist>
   程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
四,更高级的应用参考相关文档
   官方参考手册:http://haproxy.1wt.eu/download/1.3/doc/haproxy-en.txt
  http://www.howtoforge.com/high-a … artbeat-debian-etch

Haproxy的安装与基本配置

Haproxy是一种负载均衡代理软件,其特点是简单高效,在一定范围内可以替代一些专门的负载均衡设备,用于中小型网站的负载均衡绰绰有余。
Haproxy 的在RH Linux安装很简单,下载应用程序的压缩包解压出来,然后进入解压出来的目录运行make就可以了,由于其匹配规则中会用到正则表达式,所以为了让正则 匹配的效率更高,我们可以使用静态的pcre库来编译haproxy(make的时候加上参数:USE_STATIC_PCRE=1 USE_POLL= ),如果编译找不到pcre库可以下载并安装pcre库后再编译。
Haproxy的配置主要有三个部分,一个是运行时候的参数,一个是配置文件中的全局配置,还有一个是配置文件里面的代理配置部分。
运行时候直接指定的参数比较少,而且其值基本可以在全局配置部分指定,可以用-h参数查看;
全 局配置以global开始一段配置,我们日常需要配置的有几个选项,包括运行haproxy的用户组和用户名,haproxy的运行模式,比如安静模式, 调试模式,守护模式等,还有haproxy运行后开启多少个进程,可以打开的文件数,全局最大连接数限制等,全局最大连接数不能设置过大,否则可能会导致 haproxy运行不稳定,同时默认的最大连接数是比较小的,所以对于大中型网站的应用应该要修改此值;
在代理配置部分是我们实现负载均衡的主要 配置部分,此部分可以选择四个模式:default,frontend,listen,backend,我们可选其中一个作为配置段的开头,四种模式的可 配置项稍微有些不同,而其中listen模式的可配置项是最多的,其他三种模式的可配置项他都有。在这个部分普通使用我们需要配置的项也不需要很多,主要 是本机监听的ip地址和端口,监听模式:TCP或HTTP,负载均衡方式,连接超时时间,访问控制列表和对应访问控制列表的后端等,下面为配置的一个例 子,现在HAPROXY有BUG,URL的匹配规则都不能匹配上,但是我们可以不使用URL的访问控制规则,用hdr_dom和加上path的方法来实 现;另外我们对path的匹配进行了一些测试,也发现了匹配方明的问题,所以估计haproxy在正则表达式匹配方面还不够完善,所以不推荐用于七层分 派。但是haproxy强大的连接处理能力用在大量连接的四层分派还是不错的。如果你需要更详细的配置说明,请阅读作者的配置文档:########conf file for haproxy#########
global
        group           haproxy
        user            haproxy
        pidfile         /usr/local/haproxy/haproxy.pid
        daemon
        nbproc          1
        maxconn         30000frontend http_proxy
        mode            http
        bind             :80
        timeout client 3s
        acl test1    hdr_dom(host) -i www.test1.com
        acl test2    hdr_dom(host) -i www.test2.com
        acl test3    hdr_dom(host) -i www.test3.com

        use_backend test1svr if test1
        use_backend test2svr if test2
        use_backend test3svr if test3        default_backend test3svr backend test1svr
        balance         roundrobin
        mode    http
        timeout server 3s
        timeout connect 3s
      option httpchk GET /httpchk.jsp HTTP/1.1rnHost: www.test1.com
        server test1svr1 192.168.10.1:8001 check fall 5
        server test1svr2 192.168.20.1:8001 check fall 5backend test2svr
        balance         roundrobin
        mode    http
        timeout server 3s
        timeout connect 3s
      option httpchk GET /httpchk.jsp HTTP/1.1rnHost: www.test2.com
        server test2svr1 192.168.10.1:8002 check fall 5
      server test2svr2 192.168.20.1:8002 check fall 5backend test3svr
        balance         roundrobin
        mode    http
        timeout server 3s
        timeout connect 3s
      option httpchk GET /httpchk.jsp HTTP/1.1rnHost: www.test3.com
        server test3svr1 192.168.10.1:8003 check fall 5
      server test3svr2 192.168.20.1:8003 check fall 5