加载中…
个人资料
图腾艺度
图腾艺度
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux:HAProxy安装和部署

(2011-08-24 11:19:55)
标签:

配置文件

指定

进行

日志

linux操作系统

it

分类: Linux

情景说明:

此博文内容,很多信息来自网络,这里只是进行了实验行的测试、以及功能性的测试。实验过程只是以类似“虚拟主机”形式,将所有的域名绑定统一ip,根据haproxy内部acl以及正则表达式的规则进行相应的server调用,不包含mysql + heartbeat的部分以及keepalived部分。

实验包括了以下截图,如有对文件需要的童鞋,可留言索取。

http://s2/middle/51d3553fgab37ef8bd0d1&690

软件负载均衡一般通过两种方式来实现:

基于操作系统的软负载实现

基于第三方应用的软负载实现。

LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。

HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式下,其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。HAproxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

具体详情:

可以在HAProxy官方网站(http://haproxy.1wt.eu )可以下载配置说明文档(configuration.txt)和架构文件(architecture.txt)作为参考。

与版本对应的文件在安装目录下的doc目录也存有相应文件如:

/usr/local/haproxy/doc/haproxy目录下的:

[root@haproxy haproxy]# pwd

/usr/local/haproxy/doc/haproxy

[root@haproxy haproxy]# ls

architecture.txt  configuration.txt  haproxy-en.txt  haproxy-fr.txt

[root@haproxy haproxy]#

注意:

如果说在功能上,能以haproxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。

 

获取haproxy的源码

官方地址:http://haproxy.1wt.eu/

目前最新的版本是1.5版本,但为了操作安全我们这里使用稍早一些的版本1.4.8:

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

 

操作系统:

Cetnos5.6

 

操作步骤:

1、  下载安装包

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

考虑到版本会一直更新,那么安装属性会有所发生改变,建议安装前浏览一下haproxy目录下的README和Makefile文件内容。

2、  解压缩:

tar zxvf haproxy-1.4.8.tar.gz

ls

3、  为haproxy-1.4.8/目录并增加相应权限

chmod -R 775 haproxy-1.4.8

4、进入haproxy目录

cd haproxy-1.4.8

5、编译参数说明

make TARGET=os ARCH=arch CPU=cpu USE_xxx=1 …

编译之前,首先查看一下系统内核,因为参数与系统内核有关。

[root@haproxy haproxy-1.4.8]# uname -r

2.6.18-194.el5

参数说明(在README文件中这些参数都有体现)

TARGET

指定对目标操作系统在编译的时候进行优化,可选择如下值之一:

linux22     for Linux 2.2

linux24     for Linux 2.4 and above (default)

linux24e    for Linux 2.4 with support for a working epoll (> 0.21)

linux26     for Linux 2.6 and above

solaris     for Solaris 8 or 10 (others untested)

freebsd     for FreeBSD 5 to 8.0 (others untested)

openbsd     for OpenBSD 3.1 to 4.6 (others untested)

cygwin      for Cygwin

generic     for any other OS.

custom      to manually adjust every setting

如果目标系统不确定,则保持默认值generic即可。

 

CPU

指定对特定的cpu进行优化,可以选择值如下:

i686                   for intel PentiumPro, Pentium 2 and above, AMD Athlon

i586                   for intel Pentium, AMD K6, VIA C3.

ultrasparc :     Sun UltraSparc I/II/III/IV processor

generic :          any other processor or no specific optimization. (default)

 

ARCH

指定ARCH值可强制编译成圣针对一个特定系统架构程序。

通常用于在一个系统架构的平台上生成针对另一个不同架构平台的程序。

比如:在一个64位架构的目标系统上编译生成一个32位的程序。

当前可选的值有:

x86_64

i386

i486

i586

i686

注意:如果选择上述其中的一个值“-m32”或“-m64”会被添加到CFLAGS和LDFLAG选项中。

 

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的动态库。针对上面的问题,可以使用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

以上参数值用于说明使用,重点是下面所要执行的命令:

为了简便,我们这里不加USE_STATIC_PCRE参数。

make TARGET=linux26  PREFIX=/usr/local/haproxy

 

6、安装:

make TARGET=linux26  PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

 

7、日志的输出问题。

根据说明,haproxy的日志输出使用了系统的日志程序,比如syslogd, syslog-ng。这两个日志系统使用上其主要的区别就是其配置文件的格式不同, syslog-ng算是syslog的一个升级版,在性能和功能性上都要优于syslogd。

 

下面就使用syslog-ng的方法进行一下说明。

注意:

这里因为使用到了syslog-ng,但默认的centos系统中是没有这个软件的rpm包的,所以要下载安装,当然使用tar等源码包安装也可以,但是因为需要很多包的支持,所以如果要用源码包安装就要准备好相应的包来进行提前安装,大致源码包,可以浏览一下链接中说明:

http://blog.csdn.net/wangxiaosen/article/details/3790203

这里使用下载rpm包进行安装:

下载地址:

http://code.google.com/p/syslogserver/downloads/list?can=1&q=syslog-ng

下载安装包,同时下载配置文件:

wget http://syslogserver.googlecode.com/files/syslog-ng-3.0.4-1.rhel5.i386.rpm

同时下载配置文件:

wget http://syslogserver.googlecode.com/files/syslog-ng.conf

安装:

rpm -ivh syslog-ng-3.0.4-1.rhel5.i386.rpm

启动syslog-ng服务

service syslog-ng restart

注意:

这里因为安装syslog-ng的过程中,系统日志服务和内核日志服务是关闭状态的。等下需要重新启动。

 

编辑系统日志服务的配置文件/etc/sysconfig/syslog

查看SYSLOG_DAEMON的值,这个值指定了所要使用的日志服务程序,默认为空,表示自动检测,但是这个选项默认在CenOS系统中是没有的,在Ubuntu的系统中会有,所以可以手动添加。

如果不确定,可以显式指定SYSLOG_DAEMON="syslog-ng"。

使用root账户首先修改/etc/sysconfig/syslog文件,将SYSLOGD_OPTIONS="-m 0”

修改为SYSLOGD_OPTIONS="-m 0 -r -x",支持收集远程服务器日志。

 

vim /etc/sysconfig/syslog

文件默认内容如下:

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-m 0"

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

   once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other".

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

这里syslog-ng.conf位置是/opt/syslog-ng/etc/syslog-ng.conf,Ubuntu应该在etc目录下。

# 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的相关文档。

 

编辑syslog-ng的配置文件:其实默认已有配置文件,下载的配置文件作为备份使用。

因为rpm包默认安装在/opt目录下。

所以配置文件应该在:

/opt/syslog-ng/etc/syslog-ng.conf

编辑:

vim /opt/syslog-ng/etc/syslog-ng.conf

默认文件内容如下:

@version: 3.0

#Default configuration file for syslog-ng.

#

# For a description of syslog-ng configuration file directives, please read

# the syslog-ng Administrator's guide at:

#

# http://www.balabit.com/dl/html/syslog-ng-admin-guide_en.html/bk01-toc.html

#

 

options {

};

 

######

# sources

source s_local {

# message generated by Syslog-NG

internal();

# standard Linux log source (this is the default place for the syslog()

# function to send logs to)

unix-stream("/dev/log");

# messages from the kernel

file("/proc/kmsg" program_override("kernel: "));

};

 

######

# destinations

destination d_messages { file("/var/log/messages"); };

log {

source(s_local);

destination(d_messages);

};

 

这时候将上面的那部分代码加入此文件尾部,并执行服务的重启。

service syslog-ng restart

说明加载代码成功。

以上添加的代码中需要注意的是:local0的指定。这个下面会说明。

 

注意:这时候还需要重新启动以下同日志服务。

service syslog restart

 

8、编辑好这些内容后那么就要编辑haproxy的配置文件:

假定名为haproxy.cfg,在其所需要记录日志的模块,比如(global,default等)添加如下代码。

但首先,似乎haproxy安装后内部还没有配置文件,那么就需要将原安装包内的haproxy.cfg拷贝到安装目录下:

建立配置文件目录:

mkdir -p /usr/local/haproxy/conf/

建立pid文件目录:

mkdir -p /usr/local/haproxy/run/

拷贝配置文件:

cp /root/haproxy-1.4.8/examples/haproxy.cfg  /usr/local/haproxy/conf

默认文件内容如下:

# this config needs haproxy-1.1.28 or haproxy-1.2.1

 

global

        log 127.0.0.1   local0

        log 127.0.0.1   local1 notice

        #log loghost    local0 info

        maxconn 4096

        chroot /usr/share/haproxy

        uid 99

        gid 99

        daemon

        #debug

        #quiet

 

defaults

        log     global

        mode    http

        option  httplog

        option  dontlognull

        retries 3

        redispatch

        maxconn 2000

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

 

listen  appli1-rewrite 0.0.0.0:10001

        cookie  SERVERID rewrite

        balance roundrobin

        server  app1_1 192.168.34.23:8080 cookie app1inst1 check inter 2000 rise 2 fall 5

        server  app1_2 192.168.34.32:8080 cookie app1inst2 check inter 2000 rise 2 fall 5

        server  app1_3 192.168.34.27:8080 cookie app1inst3 check inter 2000 rise 2 fall 5

        server  app1_4 192.168.34.42:8080 cookie app1inst4 check inter 2000 rise 2 fall 5

 

listen  appli2-insert 0.0.0.0:10002

        option  httpchk

        balance roundrobin

        cookie  SERVERID insert indirect nocache

        server  inst1 192.168.114.56:80 cookie server01 check inter 2000 fall 3

        server  inst2 192.168.114.56:81 cookie server02 check inter 2000 fall 3

        capture cookie vgnvisitor= len 32

 

        option  httpclose               # disable keep-alive

        rspidel ^Set-cookie:\ IP=       # do not let this cookie tell our internal IP address

 

listen  appli3-relais 0.0.0.0:10003

        dispatch 192.168.135.17:80

 

listen  appli4-backup 0.0.0.0:10004

        option  httpchk /index.html

        option  persist

        balance roundrobin

        server  inst1 192.168.114.56:80 check inter 2000 fall 3

        server  inst2 192.168.114.56:81 check inter 2000 fall 3 backup

 

listen  ssl-relay 0.0.0.0:8443

        option  ssl-hello-chk

        balance source

        server  inst1 192.168.110.56:443 check inter 2000 fall 3

        server  inst2 192.168.110.57:443 check inter 2000 fall 3

        server  back1 192.168.120.58:443 backup

 

listen  appli5-backup 0.0.0.0:10005

        option  httpchk *

        balance roundrobin

        cookie  SERVERID insert indirect nocache

        server  inst1 192.168.114.56:80 cookie server01 check inter 2000 fall 3

        server  inst2 192.168.114.56:81 cookie server02 check inter 2000 fall 3

        server  inst3 192.168.114.57:80 backup check inter 2000 fall 3

        capture cookie ASPSESSION len 32

        srvtimeout      20000

 

        option  httpclose               # disable keep-alive

        option  checkcache              # block response if set-cookie & cacheable

 

        rspidel ^Set-cookie:\ IP=       # do not let this cookie tell our internal IP address

 

        errorloc        502     http://192.168.114.58/error502.html

        errorfile       503     /etc/haproxy/errors/503.http

 

文件内容为默认例子标配信息,但这个文件内内容可能跟我们实际安装文件目录是有出入的所以要将里面内容改为:

global

        maxconn 5120

        chroot /usr/local/haproxy

        uid 99

        gid 99

        daemon

        quiet

        nbproc  2

        pidfile /usr/local/haproxy/run/haproxy.pid

defaults

        log     global

        mode    http

        option  httplog

        option  dontlognull

        log 127.0.0.1 local0

        retries 3

        option redispatch

        maxconn 2000

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

 

listen http_80_in :80

       mode http

       balance roundrobin

       option httpclose

       option forwardfor

server idaphne_server-1 192.168.58.191:80 check weight 1 minconn 1 maxconn 3 check inter 40000

server idaphne_server-2 192.168.58.193:80 check weight 1 minconn 1 maxconn 3 check inter 40000

 

 

listen stats :1080

       mode http

       transparent

       stats uri / haproxy-admin

       stats realm Haproxy \ statistic

       stats auth guanchunguang:123456

说明:

当页面访问的时候,需要用户名和密码:

stats auth guanchunguang:123456

上面这一条指定的就是用户名和密码。

其中ip部分,根据自己的实际情况添加即可。

 

9、启动haproxy

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

也可以用:

/usr/local/haproxy/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

来启动。

查看进程:

10、使用系统的syslog记录日志(通过udp,默认端口是514)

这时候就要注意haproxy.cfg文件中的local0字段了,local0标记要与/etc/syslog.conf文件中的标记一样。也要与/opt/syslog-ng/etc/syslog-ng.conf中的local0标记相同。

 

另外,因为syslog配置文件中可能还没指定文件生成,所以要手动编辑一下:

/etc/syslog.conf文件,添加如下图中的内容:

local0.*                                                /var/log/haproxy.log

/opt/syslog-ng/etc/syslog-ng.conf中的local0部分:

编辑好以上内容,重新启动日志服务,同时重启haproxy进程。

这时候查看日志。就基本ok了。

查看日志:tail -f /var/log/haproxy.log

注意:

这时候,回头看,不知道是不是syslogng使其日志进行生成的。这个就这样了,有待高手处理。

 

11、接下来的就是进行压力测试了。

/usr/local/bin/webbench -c 100 -t 30 http://localhost:1080/phpinfo.php

Webbench - Simple Web Benchmark 1.5

Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

 

Benchmarking: GET http://localhost:1080/phpinfo.php

100 clients, running 30 sec.

 

Speed=1514 pages/min, 10084 bytes/sec.

Requests: 757 susceed, 0 failed.

[root@haproxy ~]#

 

说明:

配置文件中的server部分一共设置了两个ip:

191指定了idaphne.com的程序。193指定的是b2b.idaphne.com的程序,现在就可以访问:

http://192.168.61.130 来测试了。由于使用的是balance roundrobin轮叫模式,所以按一次F5就会在b2c和b2b两个网站间切换,这是最简配置。

但有一点说明,因为haproxy我安装在了192.168.61.130这台机器上,而且这个轮换监听我使用了80端口,那么原有的httpd的80端口(在httpd.conf文件的Listen 80位置)

就要更改其他端口才可以使用不然会报错,报错信息如下:

Restarting HAProxy daemon: haproxy[ALERT] 234/140915 (24975) : Starting frontend http_80_in: cannot bind socket

 

haproxy监听的端口是1080,代理192.168.61.130

统计监听的是1080端口 http://192.168.61.130:1080/haproxy-admin

这时候会生成监测图像:

 

12、建立启动脚本:

#! /bin/sh

#chkconfig: 2345 80 90

#description:haproxy

set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin

PROGDIR=/usr/local/haproxy

PROGNAME=haproxy

DAEMON=$PROGDIR/sbin/$PROGNAME

CONFIG=$PROGDIR/conf/$PROGNAME.cfg

PIDFILE=$PROGDIR/run/$PROGNAME.pid

DESC="HAProxy daemon"

SCRIPTNAME=/etc/init.d/$PROGNAME

 

# Gracefully exit if the package has been removed.

test -x $DAEMON || exit 0

 

start()

{

        echo -n "Starting $DESC: $PROGNAME"

        $DAEMON -f $CONFIG

        echo "."

}

 

stop()

{

        echo -n "Stopping $DESC: $PROGNAME"

        haproxy_pid=cat $PIDFILE

        kill $haproxy_pid

        echo "."

}

 

restart()

{

        echo -n "Restarting $DESC: $PROGNAME"

        $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)

        echo "."

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  *)

        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2

        exit 1

        ;;

esac

exit 0

保存后,增加执行权限。

chmod +x /etc/rc.d/init.d/haproxy

就可以使用 service haproxy start|stop|restart 来控制服务的启动停止跟重启。

 

13、haproxy配置文件haproxy.cfg字段参数说明:

这段部分可参阅“高可用配置文件”中的haproxy.cfg,里面已经对字段等信息进行了解读。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有