一、Haproxy的简介
Haproxy的官网站点:http://haproxy.com/
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
二、Haproxy的工作模式
大致的意思就是:可以分为两部分,
第一部分是互联网,包括互联网上众多的路由设备、Firewall等;
第二部分是本地的网络架构,包括Firewall,proxy、Web server,Database等
Haproxy的注释Local balanceer in proxy mode -- 工作在代理模下是一个负载均衡的功能
通过Haproxy代理后端的Web server群集,如果需要与数据库交互,有Web server与Database建立连接。
三、Haproxy的安装和配置说明
CentOS 6.5系统中yum源提供的Haproxy的版本为1.5.18,在这里我们直接用yum安装
1、安装haproxy
<code>yum </code><code>install</code> <code>haproxy -y</code>
<code>rpm -ql haproxy </code><code>#可以查看yum安装Haproxy生成了哪些文件</code>
<code>/etc/haproxy</code>
<code>/etc/haproxy/haproxy</code><code>.cfg </code><code>#haproxy的配置文件</code>
<code>/etc/logrotate</code><code>.d</code><code>/haproxy</code>
<code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/haproxy</code> <code>#haproxy的服务脚本文件</code>
<code>/etc/sysconfig/haproxy</code>
<code>/usr/bin/halog</code>
<code>/usr/bin/iprange</code>
<code>/usr/sbin/haproxy</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/CHANGELOG</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/LICENSE</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/README</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/acl-content-sw</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/acl</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/architecture</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/close-options</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/coding-style</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/configuration</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/content-sw-sample</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/cookie-options</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/cttproxy-src</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/backends-v0</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/backends</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/be-fe-changes</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/binding-possibilities</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/buffer-redesign</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/buffers</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/config-language</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/connection-reuse</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/cttproxy-changes</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/entities-v2</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/how-it-works</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/http_load_time</code><code>.url</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/rate-shaping</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/design-thoughts/sess_par_sec</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/gpl</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/haproxy-en</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/haproxy-fr</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/haproxy</code><code>.1</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/haproxy</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/acl</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/body-parsing</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/buffer-operations</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/buffer-ops</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/connect-status</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/connection-header</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/connection-scale</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/entities</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/entities</code><code>.pdf</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/entities</code><code>.svg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/entities</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/hashing</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/header-parser-speed</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/header-tree</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/http-cookies</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/http-docs</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/http-parsing</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/naming</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/pattern</code><code>.dia</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/pattern</code><code>.pdf</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/polling-states</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/repartition-be-fe-fi</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/sequence</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/stats-v2</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/stream-sock-states</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/internals/todo</code><code>.cttproxy</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/lgpl</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/proxy-protocol</code><code>.txt</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/queuing</code><code>.fig</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/tarpit</code><code>.cfg</code>
<code>/usr/share/doc/haproxy-1</code><code>.5.18</code><code>/url-switching</code><code>.cfg</code>
<code>/usr/share/haproxy</code>
<code>/usr/share/haproxy/400</code><code>.http </code><code>#400错误的状态码页面</code>
<code>/usr/share/haproxy/403</code><code>.http </code><code>#403错误的状态码页面</code>
<code>/usr/share/haproxy/408</code><code>.http </code><code>#408错误的状态码页面</code>
<code>/usr/share/haproxy/500</code><code>.http </code><code>#500错误的状态码页面</code>
<code>/usr/share/haproxy/502</code><code>.http </code><code>#502错误的状态码页面</code>
<code>/usr/share/haproxy/503</code><code>.http </code><code>#503错误的状态码页面</code>
<code>/usr/share/haproxy/504</code><code>.http </code><code>#504错误的状态码页面</code>
<code>/usr/share/haproxy/README</code>
<code>/usr/share/man/man1/halog</code><code>.1.gz </code><code>#可以直接使用man halog查看命令的使用语法</code>
<code>/usr/share/man/man1/haproxy</code><code>.1.gz </code><code>#可以直接使用man haproxy查看命令的使用语法</code>
<code>/var/lib/haproxy</code>
2、haproxy的配置文件说明
<code># cd /etc/haproxy/</code>
<code># cp haproxy.cfg haproxy.cfg.bak</code>
<code># vim haproxy.cfg</code>
<code>**********************************************************************</code>
<code>#---------------------------------------------------------------------</code>
<code># Example configuration for a possible web application. See the</code>
<code># full configuration options online.</code>
<code>#</code>
<code># http://haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>
<code> </code>
<code># Global settings </code>
<code>global </code><code>#全局配置文件</code>
<code> </code><code># to have these messages end up in /var/log/haproxy.log you will</code>
<code> </code><code># need to: #配置日志</code>
<code> </code><code>#</code>
<code> </code><code># 1) configure syslog to accept network log events. This is done</code>
<code> </code><code># by adding the '-r' option to the SYSLOGD_OPTIONS in</code>
<code> </code><code># /etc/sysconfig/syslog #修改syslog配置文件</code>
<code> </code><code># 2) configure local2 events to go to the /var/log/haproxy.log</code>
<code> </code><code># file. A line like the following can be added to</code>
<code> </code><code># /etc/sysconfig/syslog #定义日志设备</code>
<code> </code><code># local2.* /var/log/haproxy.log</code>
<code> </code><code>log 127.0.0.1 local2 </code><code>#日志配置,所有的日志都记录本地,通过local2输出</code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code> <code>#改变haproxy的工作目录</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid </code><code>#指定pid文件的路径</code>
<code> </code><code>maxconn 4000 </code><code>#最大连接数的设定</code>
<code> </code><code>user haproxy </code><code>#指定运行服务的用户</code>
<code> </code><code>group haproxy </code><code>#指定运行服务的用户组</code>
<code> </code><code>daemon</code>
<code> </code><code># turn on stats unix socket</code>
<code> </code><code>stats socket </code><code>/var/lib/haproxy/stats</code>
<code># common defaults that all the 'listen' and 'backend' sections will</code>
<code># use if not designated in their block</code>
<code>defaults</code>
<code> </code>
<code> </code><code>mode http </code><code>#默认使用协议,可以为{http|tcp|health} http:是七层协议 tcp:是四层 health:只返回OK</code>
<code> </code><code>log global </code><code>#全局日志记录</code>
<code> </code><code>option httplog </code><code>#详细记录http日志</code>
<code> </code><code>option dontlognull </code><code>#不记录空日志</code>
<code> </code><code>option http-server-close </code><code>#启用http-server-close</code>
<code> </code><code>option forwardfor except 127.0.0.0</code><code>/8</code> <code>#来自这些信息的都不forwardfor</code>
<code> </code><code>option redispatch </code><code>#重新分发,ServerID对应的服务器宕机后,强制定向到其他运行正常的服务器</code>
<code> </code><code>retries 3 </code><code>#3次连接失败则认为服务不可用</code>
<code> </code><code>timeout http-request 10s </code><code>#默认http请求超时时间</code>
<code> </code><code>timeout queue 1m </code><code>#默认队列超时时间</code>
<code> </code><code>timeout connect 10s </code><code>#默认连接超时时间</code>
<code> </code><code>timeout client 1m </code><code>#默认客户端超时时间</code>
<code> </code><code>timeout server 1m </code><code>#默认服务器超时时间</code>
<code> </code><code>timeout http-keep-alive 10s </code><code>#默认持久连接超时时间</code>
<code> </code><code>timeout check 10s </code><code>#默认检查时间间隔</code>
<code> </code><code>maxconn 3000 </code><code>#最大连接数</code>
<code># main frontend which proxys to the backends</code>
<code>frontend main *:5000</code>
<code> </code><code>#定义ACL规则以如".html"结尾的文件;-i:忽略大小写</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</code>
<code> </code><code>use_backend static </code><code>if</code> <code>url_static </code><code>#调用后端服务器并检查ACL规则是否被匹配</code>
<code> </code><code>default_backend app </code><code>#客户端访问时默认调用后端服务器地址池</code>
<code># static backend for serving up images, stylesheets and such</code>
<code>backend static </code><code>#定义后端服务器</code>
<code> </code><code>balance roundrobin </code><code>#定义算法;基于权重进行轮询</code>
<code> </code><code>server static 127.0.0.1:4331 check check:启动对后端server的健康状态检测</code>
<code># round robin balancing between the various backends</code>
<code>backend app</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server app1 127.0.0.1:5001 check</code>
<code> </code><code>server app2 127.0.0.1:5002 check</code>
<code> </code><code>server app3 127.0.0.1:5003 check</code>
<code> </code><code>server app4 127.0.0.1:5004 check</code>
3、haproxy的命令详解
<code># haproxy -h</code>
<code>HA-Proxy version 1.5.18 2016</code><code>/05/10</code>
<code>Copyright 2000-2016 Willy Tarreau <[email protected]></code>
<code>Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]</code>
<code> </code><code>[ -p <pidfile> ] [ -m <max megs> ] [ -C <</code><code>dir</code><code>> ]</code>
<code> </code><code>-</code><code>v</code> <code>displays version ; -vv shows known build options.</code>
<code> </code><code>-d enters debug mode ; -db only disables background mode.</code>
<code> </code><code>-dM[<byte>] poisons memory with <byte> (defaults to 0x50)</code>
<code> </code><code>-V enters verbose mode (disables quiet mode)</code>
<code> </code><code>-D goes daemon ; -C changes to <</code><code>dir</code><code>> before loading files.</code>
<code> </code><code>-q quiet mode : don't display messages</code>
<code> </code><code>-c check mode : only check config files and </code><code>exit</code>
<code> </code><code>-n sets the maximum total </code><code># of connections (2000)</code>
<code> </code><code>-m limits the usable amount of memory (</code><code>in</code> <code>MB)</code>
<code> </code><code>-N sets the default, per-proxy maximum </code><code># of connections (2000)</code>
<code> </code><code>-L </code><code>set</code> <code>local</code> <code>peer name (default to </code><code>hostname</code><code>)</code>
<code> </code><code>-p writes pids of all children to this </code><code>file</code>
<code> </code><code>-de disables epoll() usage even when available</code>
<code> </code><code>-dp disables poll() usage even when available</code>
<code> </code><code>-dS disables splice usage (broken on old kernels)</code>
<code> </code><code>-dV disables SSL verify on servers side</code>
<code> </code><code>-sf</code><code>/-st</code> <code>[pid ]* finishes</code><code>/terminates</code> <code>old pids. Must be last arguments.</code>
4、配置Haproxy的日志
<code>默认情况下,Haproxy没有启用日志文件,但是我们可以根据haproxy的配置文件做修改。</code>
<code>(1)修改系统日志的配置文件</code>
<code># vim /etc/sysconfig/rsyslog</code>
<code>SYSLOGD_OPTIONS=</code><code>"-c 2 -r"</code>
<code>(2)增加日志设备</code>
<code># vim /etc/rsyslog.conf </code>
<code>local2.* </code><code>/var/log/haproxy</code><code>.log</code>
<code>(3)重启一下日志服务</code>
<code># /etc/init.d/rsyslog restart</code>
<code>关闭系统日志记录器: [确定]</code>
<code>启动系统日志记录器: [确定]</code>
<code>(4)查看日志记录信息</code>
<code># tail -f /var/log/haproxy.log</code>
四、Haproxy负载均衡web
1、一个配置示例:
Haproxy-Server:10.10.172.195
Apache1-Client:10.10.172.196
Apache2-Client:10.10.172.197
<code># Global settings</code>
<code>global</code>
<code> </code><code># need to:</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code>log 127.0.0.1 local2</code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid</code>
<code> </code><code>maxconn 4000</code>
<code> </code><code>user haproxy</code>
<code> </code><code>group haproxy</code>
<code> </code><code>mode http</code>
<code> </code><code>log global</code>
<code> </code><code>option httplog</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>option http-server-close</code>
<code> </code><code>option forwardfor except 127.0.0.0</code><code>/8</code>
<code> </code><code>option redispatch</code>
<code> </code><code>retries 3</code>
<code> </code><code>timeout http-request 10s</code>
<code> </code><code>timeout queue 1m</code>
<code> </code><code>timeout connect 10s</code>
<code> </code><code>timeout client 1m</code>
<code> </code><code>timeout server 1m</code>
<code> </code><code>timeout http-keep-alive 10s</code>
<code> </code><code>timeout check 10s</code>
<code> </code><code>maxconn 30000</code>
<code>listen stats</code>
<code> </code><code>mode http</code>
<code> </code><code>bind 0.0.0.0:8080</code>
<code> </code><code>stats </code><code>enable</code>
<code> </code><code>stats hide-version</code>
<code> </code><code>stats uri </code><code>/haproxyadmin</code><code>?stats</code>
<code> </code><code>stats realm Haproxy\ Statistics</code>
<code> </code><code>stats auth admin:123456</code>
<code> </code><code>stats admin </code><code>if</code> <code>TRUE</code>
<code>frontend http-</code><code>in</code>
<code> </code><code>bind *:80</code>
<code> </code><code>log global</code>
<code> </code><code>option httpclose</code>
<code> </code><code>option logasap</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>capture request header Host len 20</code>
<code> </code><code>capture request header Referer len 60</code>
<code> </code><code>default_backend servers</code>
<code>frontend healthcheck</code>
<code> </code><code>bind :1099</code>
<code> </code><code>option forwardfor</code>
<code>backend servers</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server websrv1 10.10.172.196:80 check maxconn 2000</code>
<code> </code><code>server websrv2 10.10.172.197:80 check maxconn 2000</code>
2、启动Haproxy服务
<code># service haproxy start</code>
<code>Starting haproxy: [ OK ]</code>
<code># chkconfig haproxy on</code>
3、浏览器访问
单独访问Apache1:10.10.172.196
单独访问Apache2:10.10.172.197
多次刷新访问Haproxy:10.10.172.195
多次刷新Haproxy的website,会切换到后端不同的webserver主机上。
五、Haproxy的状态监控
1、Haproxy的监控页面
<code>listen stats </code><code>#关联前端和后端定义一个完整的代理</code>
<code> </code><code>mode http </code><code>#设置代理协议</code>
<code> </code><code>bind 0.0.0.0:8080 </code><code>#绑定相应的端口</code>
<code> </code><code>stats </code><code>enable</code> <code>#开启Haproxy统计状态</code>
<code> </code><code>stats refresh 3s </code><code>#统计页面自动刷新时间间隔</code>
<code> </code><code>stats hide-version </code><code>#隐藏代理服务器版本</code>
<code> </code><code>stats uri </code><code>/haproxyadmin</code><code>?stats </code><code>#访问的url</code>
<code> </code><code>stats realm Haproxy\ Statistics </code><code>#统计页面认证时提示内容信息</code>
<code> </code><code>stats auth admin:123456 </code><code>#设置登录用户和密码 </code>
<code> </code><code>stats admin </code><code>if</code> <code>TRUE </code><code>#如果认证通过,则就可以打开stats</code>
2、访问监控页面
(1)登陆监控页面
admin/123456
(2)查看监控页面
(3)模拟一下故障
<code># service httpd stop</code>
<code>Stopping httpd: [ OK ]</code>
(4)在次查看监控页面
六、Haproxy的动静分离
haproxy动静分离的配置
<code> </code><code>bind 0.0.0.0:1080</code>
<code> </code><code>acl url_static path_end -i .html .jpg .gif</code>
<code> </code><code>acl url_dynamic path_end -i .php</code>
<code> </code><code>use_backend lnmmp </code><code>if</code> <code>url_dynamic</code>
<code> </code><code>server websrv1 10.10.172.196:80 check rise 2 fall 1 weight 2 maxconn 2000</code>
<code> </code><code>server websrv2 10.10.172.197:80 check rise 2 fall 1 weight 2 maxconn 2000</code>
<code>backend lnmmp</code>
<code> </code><code>balance </code><code>source</code>
<code> </code><code>server websrv3 10.10.172.198:80 check rise 2 fall 1 maxconn 2000</code>
动静分离实现的需求:
访问index.html页面,由Apache1,、Apache2轮询显示;访问index.php页面,有LNMP或者LAMP服务器显示,
本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/2050231,如需转载请自行联系原作者