HAProxy的安装和部署
Posted on September 2, 2010 by Eyoung

考虑公司当前服务器的并发量,最终还是选定了HAProxy来实现负载均衡,相较于其他的负载均衡系统,HAProxy的配置和使用还是比较简单的。
下面是自己安装和部署haproxy的记录,比较重要的一点是解决了haproxy + syslog-ng的日志输出问题。
PS: 这个问题费了我好大神:-|

PLATFORM: SUSE Linux Enterprise Server 11 (x86_64)
1. haproxy的编译安装

获取haproxy的源代码
官方地址:http://haproxy.1wt.eu/
目前最新的版本:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz

命令:
wget
http://
haproxy.1wt.eu/
download/
1.4
/
src/
haproxy-1.4.8.tar.gz

考虑到版本的更新,具体的安装属性可能会稍有改变,建议在安装前可以大致浏览下haproxy目录下的README和Makefile两个文件。

编译haproxy
进入解压后的haproxy的目录,用下列命令进行编译:
make
TARGET
=os ARCH
=arch
CPU
=cpu USE_xxx
=1
...

这里着重说明几个常用的选项。

TARGET
指定对目标操作系统在编译的时候进行优化,可选择如下值之一:
Generic, linux22, linux24, linux24e, linux26, solaris, freebsd, openbsd,
Cygwin, custom。
如果不确定目标系统,可以保留默认值generic。

CPU
指定对特定的CPU进行优化,可选择如下值之一:generic, i586, i686, ultrasparc, custom。默认值为generic。

ARCH
指定ARCH值可强制编译生成针对一个特定系统架构的程序。通常用于在一个系统架构的平台上生成针对另一个不同架构平台的程序,比如在一个64位架构的目标系统上编译生成一个32位的程序。

当前可选的值有:x86_64, i386, i486, i586, i686。
注:若选择上述其中的一个值,”-m32”或”-m64”会被添加到CFLAGS和LDFLAGS选
项中。

DEBUG
指定生成调试信息,可通过指定DEBUG=-DDEBUG_xxx对特定的代码部分生成调试信息。
当前定义的DEBUG宏有:DEBUG_FULL, DEBUG_MEMORY, DEBUG_FSM, DEBUG_HASH和
DEBUG_AUTH。
USE_PCRE, USE_STATIC_PCRE 选项可通过指定”USE_xxx=1”表示使用,指定”USE_xxx=”表示禁用。

指定是否使用libpcre库中的正则表达式实现来代替系统的libc库中的实现,考虑到使用libpcre库的效率要比libc高,因此推荐使用此选项。

注:
因libpcre还没有广泛普及,因此在动态链接的时候,需确保目标系统安装有libpcre的动态库。因libpcre还没有广泛普及,因此在动态链接 的时候,需确保目标系统安装有libpcre的动态库。针对上面的问题,可以使用USE_STATIC_PCRE,指定静态链接libpcre。
使用libpcre库编译时,需先确保系统已安装libpcre库。若不使用libpcre,则默认使用系统libc库中的标准正则表达式实现。强烈推荐使用static_pcre。

PREFIX
指定安装目录,默认为/usr/local,其他诸如文档之类的文件将会在PREFIX指定的相应目录下。

DESTDIR
指定安装目录,默认没有设置,如果想将haproxy安装一个沙盒中则可以指定该属性。
考虑到我们的系统为Linux,内核2.6+版本的,CPU为x86_64的,可以使用如下命令编译:
make
TARGET
=linux26 USE_STATIC_PCRE
=1

安装 HAProxy
可以直接将生成的haproxy程序拷贝到你想安装到的目录。或者执行命令安装到之前指定或默认的目录:
sudo make install
2. 配置 HAProxy

Doc/目录下提供了一些文档,具体的配置说明可以参考在configuration.txt文件。
下面主要说明下配置过程中日志输出问题和一些需要注意的配置选项。

1). 日志的输出问题。

根据说明,haproxy的日志输出使用了系统的日志程序,比如syslogd, syslog-ng。这两个日志系统使用上其主要的区别就是其配置文件的格式不同,考虑syslog-ng算是syslog的一个升级版,在性能和功能性 上都要优于syslogd,因此这里主要介绍的是配置syslog-ng来实现haproxy的日志输出。
我的机器环境,一如既往:SUSE Linux Enterprise Server 11 (x86_64),
日志程序默认是syslog-ng。

I. 编辑系统日志服务的配置文件/etc/sysconfig/syslog,查看SYSLOG_DAEMON的值,这个值指定了所要使用的日志服务程序,默认为空,表示自动检测,如果不确定,可以显式指定SYSLOG_DAEMON = “syslog-ng”。

II. 编辑syslog-ng的配置文件/etc/syslog-ng/syslog-ng.conf,在末尾添加如下代码:

# for supporting the logging of "HAProxy"


source my_src {

    #
    # process log messages from network:
    #
    udp(
ip(
"0.0.0.0"
)
 port(
514
)
)
;

}
;


filter f_local0 {
 facility(
local0)
; };

filter custom {
 program(
"haproxy"
)
; };


destination d_haproxy {
 file(
"/var/log/haproxy.log"
)
; };


log {
 source(
my_src)
; filter(f_local0); destination(d_haproxy); };

#log {
 source(
my_src)
; filter(custom); destination(d_haproxy); };    # OK, work too



注:这里指定了日志输出到/var/log目录下,工作正常,若指定输出到/home等其他子目录下却会失败,具体原因不详,待查。另,haproxy的日志也可通过此方法将其发送到某个日志服务器用于统一处理,具体可查看syslog-ng的相关文档。

III. 重启syslog服务,使用如下命令:
service syslog restart

IV. 编辑haproxy的配置文件,假定名为haproxy.cfg
在所需要做日志记录的模块(比如,global, default等)添加如下代码:
# 使用系统的syslog记录日志(通过udp,默认端口号为514

log 127.0.0.1 local0

注:local0 在两个配置文件中的一致。

这会查看日志基本上就OK了。
tail
-f
/
var/
log/
haproxy.log

注:其他须解决的日志相关问题
a. haproxy当前的日志全部记录在一个文件中,考虑按日期将其分段成不同文件存储;
b. 日志不能输出到除/var/log/外的其他目录

2). 一些常用配置选项的说明

如下是我使用的一个配置文件,常用的选项说明都已经注释了,需要更全面的描述请查阅configuration.txt文件。

#########################################################################
# HAProxy 配置文件
#########################################################################

global
# 使用系统的syslog记录日志(通过udp,默认端口号为514
)
log 127.0.0.1 local0 # info [
err warning info debug]


chroot /home/user/haproxy

#限制单个进程的最大连接数
maxconn 65535


# 让进程在后台运行,即作为守护进程运行,正式运行的时候开启,此处先禁止,等同于在命令行添加参数 -D
# daemon
# 指定作为守护进程运行的时候,要创建多少个进程,默认只创建一个,需要daemon开启模式
# nbproc 1


# 设置debug模式运行,与daemon模式只能互斥,等同于在命令行添加参数 -d
# debug
pidfile /home/user/haproxy/logs/haproxy.pid    # not work

defaults
# 在连接失败或断开的情况下,允许当前会话被重新分发
option redispatch
# 设置在一个服务器上链接失败后的重连次数
retries 2

# 设置服务器分配算法
balance roundrobin

# 不记录空连接
option dontlognull

# 设置等待连接到服务器成功的最大时间
timeout connect 5000ms
# 设置客户端的最大超时时间
timeout client 1800000ms
# 设置服务器端的最大超时时间
timeout server 1800000ms

# Enable the sending of TCP keepalive packets on both sides, clients and servers
# NOTE: 在服务器CPU强劲的情况下,最好不要开启保活,这样可减少资源消耗
#option tcpka



##############################统计页面配置##################################

listen admin_stat
# 监听端口
bind *:8011

# http的7
层模式
mode http
option httplog
log global
# 统计页面自动刷新时间
stats refresh 30s
# 统计页面URL
stats uri /admin?stats
# 统计页面密码框上提示文本
stats realm Haproxy\ Statistics
# 统计页面用户名和密码设置
stats auth admin:admin
# 隐藏统计页面上HAProxy的版本信息
stats hide-version



###########################TCP连接的监听配置################################

listen  tcp-in
bind *:2211

mode tcp
# 日志记录选项
option tcplog
log global

# 后台服务器
# weight  -- 调节服务器的负重
# check -- 允许对该服务器进行健康检查
# inter  -- 设置连续的两次健康检查之间的时间,单位为毫秒(
ms)
,默认值 2000
(
ms)

# rise  -- 指定多少次连续成功的健康检查后,即可认定该服务器处于可操作状态,默认值 2

# fall  -- 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3

# maxconn  -- 指定可被发送到该服务器的最大并发连接数
server localhost 0.0.0.0:2233
 weight 3
 check inter 2000
 rise 2
 fall 3

server 192.168.1.100 192.168.1.100:2233
 weight 3
 check inter 2000
 rise 2
 fall 3

server 192.168.1.101 192.168.1.101:2233
 weight 3
 check inter 2000
 rise 2
 fall 3




#########################HTTP连接的监听配置################################

listen  http-in
bind *:2212

mode http
option httplog
log global

# 设置健康检查模式
#option httpchk OPTIONS * HTTP/1.1
\r\nHost:\ www
#option smtpchk

# 后台服务器
server localhost 0.0.0.0:2234
 weight 3
 check inter 2000
 rise 2
 fall 3

server 192.168.1.100 192.168.1.100:2234
 weight 3
 check inter 2000
 rise 2
 fall 3

server 192.168.1.101 192.168.1.101:2234
 weight 3
 check inter 2000
 rise 2
 fall 3



在这个配置文件中,使用了listen块,而没有用frontend和backend。listen块定义了一个完整的代理过程,同时包含了前端的 监听套接字和后台的服务器描述,从这个层面考虑,使用frontend和backend,似乎显得条理要清楚点。不过测试发现使用listen块的时候, 输出的日志会记录下后台服务器的健康状况,而使用frontend和backend则不会。
对于健康检查,推荐开开启比较好,否则当后台服务器当掉的时候,haproxy将不会将连接重定向到下一个可用的服务器上。

根据以上配置的统计页面url,可访问:http://host_ip:2212/admin?stats 进入统计页面。注:端口号是你配置的前置http端口。

利用HAProxy实现负载均衡
一.HAProxy 介绍 HAProxy是一个特别适用于高可用性 环境 的TCP/HTTP 开源 的反向 代理 和 负载 均衡 软件 。在7层负载均衡方面的功能很强大(支持cookie track, header rewrite 等等),支持双机热备

一.HAProxy 介绍
HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件。在7层负载均衡方面的功能很强大(支持cookie track, header rewrite等等),支持双机热备,支持虚拟主机,支持健康检查(通过patch可以支持ECV),同时还提供直观的监控页面,可以清晰实时的监控服务集群的运行状况。同时支持Linux 2.6内核中System Epoll,通过简化系统调用,大幅的提高了网络I/O性能。

Haproxy包括以下一些特征:
根据静态分配的cookie 分配HTTP请求
分配负载到各个服务器,同时保证服务器通过使用HTTP Cookie实现连接保持;
当主服务器宕机时切换到备份服务器; 允许特殊端口的服务监控;
做维护时通过热配置可以保证业务的连续性,更加人性化;
添加/修改/删除HTTP Request和Response 头;
通过特定表达式Block HTTP请求;
根据应用的cookie做连接保持;
带有用户验证的详细的HTML监控报告;



新的1.3版本引入了frontend,backend配置段, frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend,通过ACL可以实现类似与F5的irules的功能。功能非常强大。目前haproxy支持以下5种负载均衡算法,同时也支持通过weight来实现负载比率的调整和通过cookie来实现连接保持。

1. 轮询 roundrobin
2. 最少连接数 Leastconn
3. 根据源IP source
4. 根据URI uri
5. 根据URL里的参数 url_param(根据请求串中的数据hush后做lb,譬如需要一个userid永远在某台服务器上,该策略是静态的)

二.HAproxy安装
HAproxy安装非常简单,下载完make即可。
wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.15.7.tar.gz
tar zxvf haproxy-1.3.15.7.tar.gz
cd haproxy-1.3.15.7
make TARGET=linux26

三.HAproxy配置
1.HAprxoy.conf配置

global
log /dev/log local0           #使用本机的syslog来记录log,请使用/dev/log
maxconn 65536
ulimit-n 131086             #必须是maxconn的两倍以上
#chroot /usr/share/haproxy    #适用于chroot环境
#uid 500
#gid 500
daemon
nbproc  5               #设置5个并发进程,在做debug时建议设置为1。
#debug
#quiet
defaults
source 10.0.38.217 #设置SNAT地址
option nolinger      #在连接关闭时立即清理连接,减少处于FIN_WAIT1状态的连接

#定义前端服务器,相当于F5里的VIP的概念
frontend china.example.com
bind 10.0.38.211:80-90         #设定vip的监听端口
mode http                            #工作模式,目前支持3种(tcp/http/health)
log global                            #log记录模式与global同
option httplog                      #启用http请求log
option dontlognull
option httpclose                   #启用被动的http连接关闭
monitor-uri   /site_alive      #拦截该uri为外部监控url,既VIP监控uri
acl site_dead nbsrv(www) lt 1
acl site_dead nbsrv(static) lt 1
monitor fail  if  site_dead  #定义backend少于1台服务器可用时,置monitor为失败返回503,正常为200.
monitor-net 10.0.38.0/24        #定义监控网段,不记录log
maxconn 65536
clitimeout 30000
#一般4层的ACL
acl invalid_src  src          10.0.28.0/24
acl invalid_src  src_port     0:1023
acl local_dst    hdr(host) -i localhost
block if invalid_src || local_dst
#7层ACL,类似F5的iRules,以下ACL实现动态静态内容分离。
acl url_static  path_beg         /static /page /stat /css
acl url_static  path_end         .html .css .js
acl host_www    hdr_beg(host) -i china.
acl host_static         hdr_beg(host) -i page. download. ftp. static.
use_backend static if host_static or host_www url_static
use_backend www if host_www
default_backend www
#另外一种实现通过url动静态分离的方法
reqisetbe ^[^\ ]*\ /static      static
reqisetbe ^[^\ ]*\ /www www
reqisetbe ^[^\ ]*\ /admin/stat stats
#定义一个将非IE和Mozillia的请求,丢进Tarpit,消耗客户端或者爬虫资源后返回500
reqipass          ^User-Agent:\.*(Mozilla|MSIE)
reqitarpit        ^User-Agent:
#定义后端服务器,相当于F5里的pool的概念
backend static
log global
#log 172.16.20.5:514 local0             #对于backend单独定义log处理方式
mode http
balance roundrobin
contimeout 5000
srvtimeout 5000
option redispatch
retries 2
option httpchk HEAD /star.html  #定义健康检查的url
#option httpchk HEAD /
#source 10.0.38.219                     #定义snat地址为10.0.38.219
#定义ECV健康检查,需要打patch
#option httpchk GET /http-ecv.php receive "Hello World!" HTTP/1.0
server statsrv1 172.16.5.64:80 check inter 1000   weight 100
server statsrv2 172.16.5.65:80 check inter 1000   weight 100
backend www
log global
grace 20000         #在做维护操作是等待20s后停止服务
mode http
balance roundrobin
contimeout 30000
srvtimeout 30000
option redispatch
retries 2
option httpchk HEAD /member/my.htm?ca=true
#option httpchk GET /member/my.htm?ca=true receive "example_web" HTTP/1.0
capture request header X-Forwarded-For len 15 #抓取X-Forwarded-For写到log里
cookie DYNSRV insert indirect nocache             #插入DYNSRV cookie
fullconn 4000                                                  #指定backend最大连接数
#定义Real服务器名/ip /最大连接数/cookie id/启用健康检查/至全速缓冲时间/weight
server wwwsrv1 172.22.2.10:80 maxconn 500 cookie s1 check  slowstart 10000 weight 100
server wwwsrv2 172.22.2.11:80 maxconn 500 cookie s2 check  slowstart 10000 weight 200
server wwwsrv3 172.22.2.13:80 cookie s3 check slowstart 10000 weight 100 backup
server wwwsrv4 172.22.2.14:80 cookie s4 check slowstart 10000 weight 100 backup

backend stats
log global
mode http
stats uri /                                                                #定义stat页面的url前缀
balance roundrobin
stats enable
stats hide-version
#stats scope   .
stats realm   Haproxy\ Statistics
stats auth    admin:admin
stats refresh 5s
#如果不使用acl,可以直接使用listen配置端来写一个相对简单的支持虚拟主机vip配置,一般情况下listen用于tcp模式的配置。
listen webfarm 10.0.38.219:80-90
mode http
contimeout 30000
srvtimeout 30000
log global
balance roundrobin
option httpclose
option forwardfor
option redispatch
retries 2
option httpchk HEAD / HTTP/1.0
acl host_a    hdr_beg(host) -i a.
acl host_b    hdr_beg(host) -i b.
use_backend a.example.com if host_a
use_backend b.example.com if host_b
default_backend b.example.com
backend a.example.com
mode http
balance roundrobin
contimeout 30000
srvtimeout 30000
server webA 10.0.38.229:80 check inter 1000
backend b.example.com
mode http
balance roundrobin
contimeout 30000
srvtimeout 30000
server webB 10.0.38.230:80 check inter 1000



2.log配置及其他
syslog.conf里加一行
local0.* /var/log/haproxy.log

查看日志
# tail -f /var/log/harpoxy.log

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

监控状态url
访问http://10.0.38.211/admin/stats ,输入用户名密码admin/admin即可查看状态。如下图


后端apache 记录客户端源ip的处理
修改httpd.conf配置
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b " combined
CustomLog /var/log/httpd/access_log combined
四.其他及参考文档
1. haproxy延伸想到的
一般的健康检查可以采用HEAD方法来做,而不是才采用GET方法,用于HEAD方法没有数据返回,仅检查Response的HEAD是不是200。相对来说,更快,而且更简单;
apache不记录健康检查和监控的log
SetEnvIf Request_URI "^/checkurl\.html$" dontlog
CustomLog output/logs/cookie_logs/%w/cookie_log cookielog env=!dontlog
关于配置热部署的列子,可以考虑用在发布环境里面,里面用了3个信号SIGUSR1、SIGTTOU和SIGTTIN,来保证新老配置文件切换时服务的连续性。

#/bin/bash
# save previous state
mv /etc/haproxy/config /etc/haproxy/config.old
mv /var/run/haproxy.pid /var/run/haproxy.pid.old
mv /etc/haproxy/config.new /etc/haproxy/config
kill -TTOU $(cat /var/run/haproxy.pid.old)
if haproxy -p /var/run/haproxy.pid -f /etc/haproxy/config; then
echo "New instance successfully loaded, stopping previous one."
kill -USR1 $(cat /var/run/haproxy.pid.old)
rm -f /var/run/haproxy.pid.old
exit 1
else
echo "New instance failed to start, resuming previous one."
kill -TTIN $(cat /var/run/haproxy.pid.old)
rm -f /var/run/haproxy.pid
mv /var/run/haproxy.pid.old /var/run/haproxy.pid
mv /etc/haproxy/config /etc/haproxy/config.new
mv /etc/haproxy/config.old /etc/haproxy/config
exit 0
fi

一.HAProxy 介绍

HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件。在7层负载均衡方面的功能很强大(支持cookie track, header rewrite等等),支持双机热备,支持虚拟主机,支持健康检查(通过patch可以支持ECV),同时还提供直观的监控页面,可以清晰实时的监控服务集群的运行状况。同时支持Linux 2.6内核中System Epoll,通过简化系统调用,大幅的提高了网络I/O性能。

Haproxy包括以下一些特征:

根据静态分配的cookie 分配HTTP请求

分配负载到各个服务器,同时保证服务器通过使用HTTP Cookie实现连接保持;

当主服务器宕机时切换到备份服务器; 允许特殊端口的服务监控;

做维护时通过热配置可以保证业务的连续性,更加人性化;

添加/修改/删除HTTP Request和Response 头;

通过特定表达式Block HTTP请求;

根据应用的cookie做连接保持;

带有用户验证的详细的HTML监控报告;

新的1.3版本引入了frontend,backend配置段, frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend,通过ACL可以实现类似与F5的irules的功能。功能非常强大。目前haproxy支持以下5种负载均衡算法,同时也支持通过weight来实现负载比率的调整和通过cookie来实现连接保持。

1. 轮询 roundrobin

2. 最少连接数 Leastconn

3. 根据源IP source

4. 根据URI uri

5. 根据URL里的参数 url_param(根据请求串中的数据hush后做lb,譬如需要一个userid永远在某台服务器上,该策略是静态的)

二.HAproxy安装

HAproxy安装非常简单,下载完make即可。

wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.15.7.tar.gz

    tar zxvf haproxy-1.3.15.7.tar.gz

    cd haproxy-1.3.15.7

    make TARGET=linux26



三.HAproxy配置

1.HAprxoy.conf配置

global    log /dev/log local0           #使用本机的syslog来记录log,请使用/dev/log    maxconn 65536    ulimit-n 131086             #必须是maxconn的两倍以上    #chroot /usr/share/haproxy    #适用于chroot环境    #uid 500    #gid 500    daemon    nbproc  5               #设置5个并发进程,在做debug时建议设置为1。    #debug    #quiet    defaults    source 10.0.38.217 #设置SNAT地址    option nolinger      #在连接关闭时立即清理连接,减少处于FIN_WAIT1状态的连接    #定义前端服务器,相当于F5里的VIP的概念    frontend china.example.com    bind 10.0.38.211:80-90         #设定vip的**端口    mode http                            #工作模式,目前支持3种(tcp/http/health)    log global                            #log记录模式与global同    option httplog                      #启用http请求log    option dontlognull    option httpclose                   #启用被动的http连接关闭    monitor-uri   /site_alive      #拦截该uri为外部监控url,既VIP监控uri    acl site_dead nbsrv(www) lt 1    acl site_dead nbsrv(static) lt 1    monitor fail  if  site_dead  #定义backend少于1台服务器可用时,置monitor为失败返回503,正常为200.    monitor-net 10.0.38.0/24        #定义监控网段,不记录log    maxconn 65536    clitimeout 30000    #一般4层的ACL    acl invalid_src  src          10.0.28.0/24    acl invalid_src  src_port     0:1023    acl local_dst    hdr(host) -i localhost    block if invalid_src || local_dst    #7层ACL,类似F5的iRules,以下ACL实现动态静态内容分离。    acl url_static  path_beg         /static /page /stat /css    acl url_static  path_end         .html .css .js    acl host_www    hdr_beg(host) -i china.    acl host_static         hdr_beg(host) -i page. download. ftp. static.    use_backend static if host_static or host_www url_static    use_backend www if host_www    default_backend www    #另外一种实现通过url动静态分离的方法    reqisetbe ^[^\ ]*\ /static      static    reqisetbe ^[^\ ]*\ /www www    reqisetbe ^[^\ ]*\ /admin/stat stats    #定义一个将非IE和Mozillia的请求,丢进Tarpit,消耗客户端或者爬虫资源后返回500    reqipass          ^User-Agent:\.*(Mozilla|MSIE)    reqitarpit        ^User-Agent:    #定义后端服务器,相当于F5里的pool的概念    backend static    log global    #log 172.16.20.5:514 local0             #对于backend单独定义log处理方式    mode http    balance roundrobin    contimeout 5000    srvtimeout 5000    option redispatch    retries 2    option httpchk HEAD /star.html  #定义健康检查的url    #option httpchk HEAD /    #source 10.0.38.219                     #定义snat地址为10.0.38.219    #定义ECV健康检查,需要打patch    #option httpchk GET /http-ecv.php receive "Hello World!" HTTP/1.0    server statsrv1 172.16.5.64:80 check inter 1000   weight 100    server statsrv2 172.16.5.65:80 check inter 1000   weight 100    backend www    log global    grace 20000         #在做维护操作是等待20s后停止服务    mode http    balance roundrobin    contimeout 30000    srvtimeout 30000    option redispatch    retries 2    option httpchk HEAD /member/my.htm?ca=true    #option httpchk GET /member/my.htm?ca=true receive "example_web" HTTP/1.0    capture request header X-Forwarded-For len 15 #抓取X-Forwarded-For写到log里    cookie DYNSRV insert indirect nocache             #插入DYNSRV cookie    fullconn 4000                                                  #指定backend最大连接数    #定义Real服务器名/ip /最大连接数/cookie id/启用健康检查/至全速缓冲时间/weight    server wwwsrv1 172.22.2.10:80 maxconn 500 cookie s1 check  slowstart 10000 weight 100    server wwwsrv2 172.22.2.11:80 maxconn 500 cookie s2 check  slowstart 10000 weight 200    server wwwsrv3 172.22.2.13:80 cookie s3 check slowstart 10000 weight 100 backup    server wwwsrv4 172.22.2.14:80 cookie s4 check slowstart 10000 weight 100 backup    backend stats    log global    mode http    stats uri /                                                                #定义stat页面的url前缀    balance roundrobin    stats enable    stats hide-version    #stats scope   .    stats realm   Haproxy\ Statistics    stats auth    admin:admin    stats refresh 5s    #如果不使用acl,可以直接使用listen配置端来写一个相对简单的支持虚拟主机vip配置,一般情况下listen用于tcp模式的配置。    listen webfarm 10.0.38.219:80-90    mode http    contimeout 30000    srvtimeout 30000    log global    balance roundrobin    option httpclose    option forwardfor    option redispatch    retries 2    option httpchk HEAD / HTTP/1.0    acl host_a    hdr_beg(host) -i a.    acl host_b    hdr_beg(host) -i b.    use_backend a.example.com if host_a    use_backend b.example.com if host_b    default_backend b.example.com    backend a.example.com    mode http    balance roundrobin    contimeout 30000    srvtimeout 30000    server webA 10.0.38.229:80 check inter 1000    backend b.example.com    mode http    balance roundrobin    contimeout 30000    srvtimeout 30000    server webB 10.0.38.230:80 check inter 1000



2.log配置及其他

syslog.conf里加一行

    local0.*  /var/log/haproxy.log

    查看日志

    # tail  -f /var/log/harpoxy.log

    启动服务

    # ./haproxy -f haproxy.cfg

    监控状态url

    访问http://10.0.38.211/admin/stats ,输入用户名密码admin/admin即可查看状态。如下图

    后端apache 记录客户端源ip的处理

    修改httpd.conf配置

    LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b " combined

    CustomLog /var/log/httpd/access_log combined



四.其他及参考文档

1. haproxy延伸想到的

一般的健康检查可以采用HEAD方法来做,而不是才采用GET方法,用于HEAD方法没有数据返回,仅检查Response的HEAD是不是200。相对来说,更快,而且更简单;

apache不记录健康检查和监控的log

SetEnvIf Request_URI "^/checkurl\.html$" dontlog

    CustomLog output/logs/cookie_logs/%w/cookie_log cookielog env=!dontlog



关于配置热部署的列子,可以考虑用在发布环境里面,里面用了3个信号SIGUSR1、SIGTTOU和SIGTTIN,来保证新老配置文件切换时服务的连续性。

#/bin/bash

    # save previous state

    mv /etc/haproxy/con** /etc/haproxy/con**.old

    mv /var/run/haproxy.pid /var/run/haproxy.pid.old

    mv /etc/haproxy/con**.new /etc/haproxy/con**

    kill -TTOU $(cat /var/run/haproxy.pid.old)

    if haproxy -p /var/run/haproxy.pid -f /etc/haproxy/con**; then

    echo "New instance successfully loaded, stopping previous one."

    kill -USR1 $(cat /var/run/haproxy.pid.old)

    rm -f /var/run/haproxy.pid.old

    exit 1

    else

    echo "New instance failed to start, resuming previous one."

    kill -TTIN $(cat /var/run/haproxy.pid.old)

    rm -f /var/run/haproxy.pid

    mv /var/run/haproxy.pid.old /var/run/haproxy.pid

    mv /etc/haproxy/con** /etc/haproxy/con**.new

    mv /etc/haproxy/con**.old /etc/haproxy/con**

    exit 0

    fi