天天看点

Haproxy 基础详解及动静分离配置

 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器

<code>负载均衡调度器分类</code>

<code>工作在四层:</code>

<code>#  lvs</code>

<code>工作在七层:</code>

<code>#  nginx   (web,http reverse proxy,cache)</code>

<code>#  haproxy (http reverse proxy,tcp proxy)</code>

<code>#     tcp:  实现MySQL的读写中读的负载均衡</code>

<code>#  ats     (apache traffic  server)</code>

<code>#  perlbal</code>

<code>#  pound</code>

<code>#  squid</code>

<code>#  varnish</code>

<code>  </code><code>以上程序都可以实现服务的向外拓展;</code>

haproxy特性

    haproxy 当前版本为1.3  1.4,下面我们介绍1.4版本的特性

<code># 客户端侧的长连接(client-side keep-alive)</code>

<code># TCP加速(TCP speedups)</code>

<code># 响应池(response buffering)</code>

<code># RDP协议</code>

<code># 基于源的粘性(source-based stickiness)</code>

<code># 更好的统计数据接口(a much better stats interfaces)</code>

<code># 更详细的健康状态检测机制(more verbose health checks)</code>

<code># 基于流量的健康评估机制(traffic-based health)</code>

<code># 支持HTTP认证</code>

<code># 服务器管理命令行接口(server management from the CLI)</code>

<code># 基于ACL的持久性(ACL-based persistence)</code>

<code># 日志分析器</code>

官网站点:haproxy.1wt.eu

haproxy 架构图

haproxy.cfg 配置文件详解

<code> </code><code>安装  </code>

<code> </code><code># yum inistall haproxy -y</code>

<code> </code><code>配置文件路径</code>

<code> </code><code>/etc/haproxy/haproxy</code><code>.cfg</code>

<code>(1)配置由两部分组成</code>

<code> </code><code>#global settings: 对haproxy进程自身属性的设定----------全局设定段</code>

<code> </code><code>#proxies: 对代理的设定 -----------------代理设定段</code>

<code>  </code><code>defaults</code>

<code>  </code><code>frontend</code>

<code>  </code><code>backend</code>

<code>  </code><code>listen</code>

<code>  </code><code>其中defaults为proxies提供默认属性,frontend接受客户端的请求,backend连接后端的上游服务器(类似于nginx的upstream),listen是特定的frontend与backend的组合</code>

<code>(2)定义一个完整的代理的方式:</code>

<code>(3)defaults段分析</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             </code> 

<code>#  option   httpclose:使用短连接</code>

<code>#  option   redispath:使用cookie保持会话,如果后端的server宕机,则使用redispath 重定向另一个路径继续保持会话;</code>

<code>#  option   http-server-close  :当keep-alive超时时,使用该选项在服务器上关闭会话   </code>

<code>#  timeout  connect  :haproxy转发到后边upstream server 时等待的时长</code>

<code>#  timeout  client   :客户端非活动状态的超时时长</code>

<code>#  timeout  server   :  haproxy和后边的服务器段保持一个会话,当后台服务器down掉后,haproxy等待的超时时间</code>

<code>#  timeout-keep-alive:定义保持连接模式的超时时长      </code>

<code>#  timeout-check     : 建立状态检测时间的超时时间</code>

<code>#  maxconn           :每一个server最大并发连接数</code>

负载均衡调度方法

<code>格式:balance  roundrobin| static-rr| leastconn | </code><code>source</code> <code>| uri | uri_param | hdr(&lt;name&gt;) | rdp-cookie(name)</code>

<code>调度方法解析</code>

<code>#roundrobin :属于加权轮询 (动态)  支持服务器活动时修改其权重,服务器下线后重新上线时支持慢启动</code>

<code>#static-rr :  属于加权轮询(静态)不支持服务器活动时修改,需要重启服务才能生效</code>

<code>#             老服务器重新上线上时,立刻会收到大批量的请求</code>

<code>#leastconn :支持动态修改权重,慢启动</code>

<code>#source    :默认为(静态)方法,hash/ 源ip 取模算法,支持hash-type调整为动态</code>

<code>#uri       :默认为(静态)方法,hash/weight 取模算法,支持hash-type来调整</code>

<code>#url-params:默认为(静态)方法,hash/wgith 算法,支持hash-type调整</code>

<code>#hdr (&lt;name&gt;):默认为静态方法, 先对&lt;name&gt;做hash计算然后 hash/weight 计算,支持hash-type调整</code>

<code>调度方法的使用总结</code>

<code>#1、调度众多的MySQL从服务器,用什么调度方法?</code>

<code>   </code><code>leastconn</code>

<code>#2、调度web图片服务器组,用什么调度方法?</code>

<code>   </code><code>roundrobin</code>

<code>#3、调度web图片服务器组,用什么调度方法?</code>

<code>   </code><code>source</code> <code>或者 cookie</code>

<code>#4、调度web缓存服务器组,用什么调度方法?</code>

<code>   </code><code>uri</code>

<code>    </code><code>hash</code><code>-</code><code>type</code><code>:</code>

<code>      </code><code>map-based (默认的静态的</code><code>hash</code><code>表)</code>

<code>      </code><code>consistent(动态的一致性</code><code>hash</code><code>) ---------在后端的cache服务器上使用,否则会导致服务器的加入或者退出时 服务器群瘫痪</code>

haproxy 的工作模式 (使用mode参数)

<code>http :http协议  --------haproxy的价值体现于此</code>

<code>#      对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              </code> 

<code>tcp  :haproxy在客户端和upstream server之间建立一个全双工的连接</code>

<code>#      不会对应用层协议做任何检查</code>

<code>#      SSL 、MySQL、SSL等都应该使用此模式;</code>

<code>#      默认模式!</code>

指定haproxy日志

<code># log global : 使用全局配置中定义的日志服务器;</code>

<code># log &lt;address&gt; &lt;facility&gt; [&lt;level&gt;  [&lt;minlevel&gt;]]</code>

<code># capture request header &lt;HEADER&gt;  len &lt;LENGTH&gt;</code>

<code># capture resopense header &lt;HEADER&gt;  len &lt;LENGTH&gt;</code>

<code>实例:在frontend中定义一个日志</code>

<code>(1)编辑rsyslog.conf</code>

<code>#vim  /etc/rsyslog.conf  在日志服务器上先定义一个日志</code>

<code> </code><code>local3.*    </code><code>/var/log/hawebsrv</code><code>.log</code>

<code>#service rsyslog restart</code>

<code>(2)编辑haproxy.cfg</code>

<code> </code><code>#vim /etc/haproxy/haproxy.cfg</code>

<code>  </code><code>frontend websrv</code>

<code>  </code><code>log 127.0.0.1 local3</code>

<code>  </code><code>bind *:80</code>

<code>  </code><code>default_backend  webservers</code>

<code> </code><code>#serivce  haproxy reload</code>

<code>(3)haproxy服务器测试</code>

<code>  </code><code>#tail /var/log/hawebsrv.log</code>

haproxy中的ACL

<code>格式:acl &lt;aclname&gt;  &lt;criterion&gt; [flags] [oprator] &lt;value&gt;    </code>

<code>                                                                                                                                                                                                                                                                                                                                                                  </code> 

<code>      </code><code>value:   支持整数或者整数范围</code>

<code>                </code><code>支持字符串</code>

<code>                </code><code>支持正则表达式</code>

<code>                </code><code>支持ip地址和网络地址</code>

<code>ACL例子</code>

<code># acl url_static  path_beg  /static /images  /img /css                </code>

<code># acl url_static  path_end  .gif  .png  .jpg  .css .js</code>

<code># acl host_www    hdr_beg(host) -i  www         </code>

<code># acl  host_static  hdr_beg(host) -i  img. video. download. ftp.  </code>

<code># use_backend   static  if  host_static  or host_www or url_static</code>

<code># use_backend   www  if  host_www</code>

<code>实现访问控制     </code>

<code>http-request:7层过滤   (借助于定义好的acl实现)</code>

<code>tcp-request: 4层过滤    (借助于定义好的acl实现)</code>

haproxy 动静分离的实现

 架构图

 1、 环境配置

<code>haproxy服务器配置</code>

<code> </code><code>外网网卡</code>

<code># ifconfig eth0 172.16.13.2/16 up</code>

<code># route add default gw 172.16.0.1</code>

<code> </code><code>内网网卡</code>

<code># ifconfig eth1 192.168.20.1/24 up</code>

<code>两台上游服务器配置</code>

<code>server1 配置</code>

<code># ifconfig eth0 192.168.20.11/24</code>

<code># route add default gw 192.168.20.1</code>

<code> </code><code>提供页面</code>

<code># vim /var/www/html/index.html</code>

<code> </code><code>&lt;h1&gt;node1.linux.com&lt;</code><code>/h1</code><code>&gt;</code>

<code># service httpd start</code>

<code>server2配置</code>

<code># ifconfig eth0 192.168.20.12/24 up</code>

<code># vim  /var/www/html/index.html</code>

<code>  </code><code>&lt;h1&gt;node2.linux.com&lt;h1&gt;</code>

<code># service  httpd start</code>

2、  安装配置haproxy

<code># yum install haproxy -y   安装haproxy</code>

<code># vim /etc/haproxy/haproxy.cfg  编辑配置文件自定义一个backend和frontend,注释原有的内容</code>

<code>frontend  websrv *:80        </code>

<code>  </code><code>default_backend   webservers</code>

<code>backend   webservers</code>

<code>  </code><code>balance   roundrobin</code>

<code>  </code><code>server     node1  192.168.20.11:80  check</code>

<code>  </code><code>server     node2   192.168.20.12:80   check</code>

 3、 客户端测试

此时说明 haproxy服务器将客户的请求以roundrobin算法 反向代理给后端的服务器!

4、启用全局日志功能

<code>(一)编辑rsyslog.conf</code>

<code>#vim  /etc/rsyslog.conf  开启如下行</code>

<code># Provides UDP syslog reception</code>

<code>$ModLoad imudp</code>

<code>$UDPServerRun 514</code>

<code># Provides TCP syslog reception</code>

<code>$ModLoad imtcp</code>

<code>$InputTCPServerRun 514</code>

<code>添加日志</code>

<code>local2.*           </code><code>/var/log/haproxy</code><code>.log</code>

<code>                                                                                                                                                                                                                                  </code> 

<code>#service rsyslog restart 重启服务</code>

<code>(二)编辑haproxy.cfg</code>

<code> </code><code># vim  /etc/haproxy/haproxy.cfg 开启如下行</code>

<code>  </code><code>log         127.0.0.1 local2</code>

<code> </code><code># service  haproxy restart  重启服务</code>

<code>(三)日志查看</code>

<code> </code><code>#tail -f /var/log/haproxy.log</code>

接下来让我们来拓展haproxy的功能

5 、调度算法 uri的实现

<code>1)后端服务器 server1 与 server2 同时创建多个页面</code>

<code>server1</code>

<code>#cd /var/www/html/</code>

<code># for i in {1..10}; do echo "&lt;h1&gt;node1.test$i&lt;/h1&gt;"  &gt;  test$i.html; done</code>

<code>server2 方法同 server1</code>

<code>2)更改haproxy.cfg的配置文件中的调度算法</code>

<code>  </code><code>balance uri</code>

<code>3)客户端测试</code>

<code># http://172.16.13.2/test1.html</code>

基于172.16.13.2/test1.html 该uri,haproxy服务器反向代理至后台服务器至同一台服务器server2

  6、基于cookie实现会话绑定

<code>1)编辑haproxy.cfg配置文件</code>

<code>#vim  /etc/haproxy/haproxy.cfg  内容如下</code>

<code>frontend websrv</code>

<code>   </code><code>bind *:80</code>

<code>   </code><code>default_backend  webservers</code>

<code>backend  webservers</code>

<code>   </code><code>cookie node insert nocache</code>

<code>   </code><code>balance roundrobin</code>

<code>   </code><code>server  node1  192.168.20.11:80 check  cookie node1</code>

<code>   </code><code>server  node2  192.168.20.12:80 check  cookie node2</code>

<code>2)客户端测试</code>

<code>#http://172.16.13.2/test1.html</code>

上图可见,基于cookie实现了客户端的请求与后端服务器server2的会话绑定。

7、haproxy管理界面---stats enable

<code># vim /etc/haproxy/haproxy.cfg 增加一个listen段,如下所示</code>

<code>listen statspage   </code>

<code>bind *:8009    -------侦听端口   </code>

<code>stats </code><code>enable</code>   <code>-------开启stats   </code>

<code>stats hide-version -----隐藏版本   </code>

<code>stats auth admin:admin ----登录验证信息   </code>

<code>stats admin </code><code>if</code> <code>TRUE    ----实现在管理界面上对所有backend服务器管理   </code>

<code>stats uri </code><code>/admin</code><code>?stats ----登录的uri路径</code>

8、haproxy动静分离的实现

<code>1)server2 服务器安装php</code>

<code>#yum -y install php php-mysql</code>

<code>提供php动态页面</code>

<code>#vim /var/www/html/index.php</code>

<code>&lt;h1&gt;node2.linux.com&lt;</code><code>/h1</code><code>&gt;</code>

<code>&lt;?php</code>

<code>     </code><code>phpinfo();</code>

<code>?&gt;</code>

<code>                                         </code> 

<code>2)重新配置haproxy配置文件</code>

<code>#vim  /etc/haproxy/haproxy.cfg   定义frontend  和 backend</code>

<code>frontend websrvs</code>

<code>    </code><code>bind *:80</code>

<code>    </code><code>acl url_static       path_beg       -i </code><code>/static</code> <code>/images</code> <code>/javascript</code> <code>/stylesheets</code>

<code>    </code><code>acl url_static       path_end       -i .jpg .gif .png .css .js .html</code>

<code>    </code><code>acl host_static      hdr_beg(host)  -i img. video. download. </code><code>ftp</code><code>. imags. videos.</code>

<code>    </code><code>acl url_php          path_end       -i .php</code>

<code>    </code><code>use_backend static          </code><code>if</code> <code>url_static or host_static</code>

<code>    </code><code>use_backend dynamic         </code><code>if</code> <code>url_php</code>

<code>    </code><code>default_backend             dynamic</code>

<code>         </code><code>backend static</code>

<code>    </code><code>balance     roundrobin</code>

<code>    </code><code>server      node1 192.168.20.11:80  check maxconn 30000   </code>

<code>                                                   </code> 

<code>         </code><code>backend dynamic</code>

<code>    </code><code>server  node2 192.168.20.12:80 check maxconn  1000</code>

<code># service haproxy restart</code>

<code>3) 客户端测试 动静分离</code>

 如图所示:静态页面由server1服务器显示,动态页面由server2 显示。  

本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/2050317,如需转载请自行联系原作者