Linux:HAProxy安装和部署
标签:
配置文件指定进行日志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
[root@haproxy haproxy]#
注意:
如果说在功能上,能以haproxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。
获取haproxy的源码
目前最新的版本是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、
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
linux24
linux24e
linux26
solaris
freebsd
openbsd
cygwin
generic
custom
如果目标系统不确定,则保持默认值generic即可。
CPU:
指定对特定的cpu进行优化,可以选择值如下:
i686
i586
ultrasparc :
generic :
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
6、安装:
make TARGET=linux26
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",支持收集远程服务器日志。
文件默认内容如下:
# 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
#
# -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 {
};
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);
};
注意:
这里指定了日志输出到/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
默认文件内容如下:
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
defaults
listen
listen
listen
listen
listen
listen
文件内容为默认例子标配信息,但这个文件内内容可能跟我们实际安装文件目录是有出入的所以要将里面内容改为:
global
defaults
listen http_80_in :80
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
说明:
当页面访问的时候,需要用户名和密码:
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.*
/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()
{
}
stop()
{
}
restart()
{
}
case "$1" in
esac
exit 0
保存后,增加执行权限。
chmod +x /etc/rc.d/init.d/haproxy
就可以使用 service haproxy start|stop|restart 来控制服务的启动停止跟重启。
13、haproxy配置文件haproxy.cfg字段参数说明:
这段部分可参阅“高可用配置文件”中的haproxy.cfg,里面已经对字段等信息进行了解读。

加载中…