89711530 2017-03-08
CentOS-7-x86_64-Everything-1511
haproxy-1.7.2.tar.gz
# tar zxvf haproxy-1.7.2.tar.gz# cd haproxy-1.7.2# make PREFIX=/root/haproxy TARGET=linux2628# make install PREFIX=/root/haproxy
本文的操作系统内核版本为3.10.0,TARGET指定为 linux2628。
# cd haproxy # mkdir conf # touch haproxy.cfg
配置文件内容如下:
global #全局属性 daemon #以daemon方式在后台运行 maxconn 256 #最大同时256连接 pidfile /root/haproxy/conf/haproxy.pid #指定保存HAProxy进程号的文件 defaults #默认参数 mode http #http模式 timeout connect 5000ms #连接server端超时5s timeout client 50000ms #客户端响应超时50s timeout server 50000ms #server端响应超时50s frontend http-in #前端服务http-in bind 192.168.6.128:9090 #监听9090端口 default_backend servers #请求转发至名为"servers"的后端服务 backend servers #后端服务servers balance roundrobin #使用RR负载均衡算法 server server1 192.168.6.128:8080 maxconn 32 #backend servers中只有一个后端服务,名字叫server1,启在本机的8000端口,HAProxy同时最多向这个服务发起32个连接 server server2 192.168.6.129:8080 maxconn 32 server server3 192.168.6.130:8080 maxconn 32
注意:HAProxy 要求系统的 ulimit -n 参数大于 [maxconn*2+18],在设置较大的 maxconn 时,注意检查并修改 ulimit -n 参数。
1)在 /etc/init.d 目录下添加 HAProxy 服务的启停脚本:
# vi /etc/init.d/haproxy
启停脚本内容如下:
#!/bin/sh set -e PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/ha/haproxy/sbin PROGDIR=/root/haproxy PROGNAME=haproxy DAEMON=$PROGDIR/sbin/$PROGNAME CONFIG=$PROGDIR/conf/$PROGNAME.cfg PIDFILE=$PROGDIR/conf/$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 -e "Starting $DESC: $PROGNAME\n" $DAEMON -f $CONFIG echo "." } stop() { echo -e "Stopping $DESC: $PROGNAME\n" haproxy_pid="$(cat $PIDFILE)" kill $haproxy_pid echo "." } restart() { echo -e "Restarting $DESC: $PROGNAME\n" $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
2)将启动脚本添加可执行权限
# chmod +x haproxy
HAProxy 不会直接输出文件日志,需要借助 Linux 的 rsyslog 来让 HAProxy 输出日志。
1)修改 haproxy.cfg
在配置文件的 global 和 defaults 域中添加以下字段:
global ... log 127.0.0.1 local0 info log 127.0.0.1 local1 warning ... defaults ... log global ...
意思是将 info 级(及以上)的日志推送到 rsyslog 的 local0 接口,将 warn 级(及以上)的日志推送到 rsyslog 的 local1 接口,并且所有 frontend 都默认使用 global 中的日志配置。
注意:info 级的日志会打印 HAProxy 处理的每一条请求,会占用很大的磁盘空间,在生产环境中,建议将日志级别调整为 notice。
2)为 rsyslog 添加 haproxy 日志的配置
# vi /etc/rsyslog.d/haproxy.conf
配置文件内容如下:
$ModLoad imudp $UDPServerRun 514 $FileCreateMode 0644 #日志文件的权限 $FileOwner root #日志文件的owner local0.* /var/log/haproxy.log #local0接口对应的日志输出文件 local1.* /var/log/haproxy_warn.log #local1接口对应的日志输出文件
3)修改 rsyslog 的启动参数
# vi /etc/sysconfig/rsyslog
配置文件内容如下:
# Options for rsyslogd # Syslogd options are deprecated since rsyslog v3. # If you want to use them, switch to compatibility mode 2 by "-c 2" # See rsyslogd(8) for more details SYSLOGD_OPTIONS="-c 2 -r -m 0"
4)重启 rsyslog
# service rsyslog restart
返回信息:
5)用 logrotate 进行日志切分
通过 rsyslog 输出的日志是不会切分的,所以需要通过 Linux 提供的 logrotate 来对日志文件进行切分。
使用 root 用户,创建 haproxy 日志切分配置文件:
# mkdir /root/logrotate# vi /root/logrotate/haproxy
配置文件内容如下:
/var/log/haproxy.log /var/log/haproxy_warn.log { #切分的两个文件名 daily #按天切分 rotate 7 #保留7份 create 0644 root root #创建新文件的权限、用户、用户组 compress #压缩旧日志 delaycompress #延迟一天压缩 missingok #忽略文件不存在的错误 dateext #旧日志加上日志后缀 sharedscripts #切分后的重启脚本只运行一次 postrotate #切分后运行脚本重载rsyslog,让rsyslog向新的日志文件中输出日志 /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) &>/dev/null endscript }
6)将 logrotate 配置在 crontab 中:
0 0 * * * /usr/sbin/logrotate /root/logrotate/haproxy
# service haproxy start
返回信息:
# service haproxy stop
返回信息:
# service haproxy restart
返回信息:
执行以下命令:
# ps -ef|grep haproxy|grep -v grep
返回信息:
执行以下命令:
# lsof -i:9090
返回信息:
执行以下命令:
# cat /var/log/haproxy.log
返回信息:
提供服务的 server 为 Nginx,每个 nginx 上放入带有本机 IP 的 HTML 页面,相关信息如下:
IP | Nginx 端口 | HAProxy端口 |
192.168.6.128 | 8080 | 9090 |
192.168.6.129 | 8080 | 9090 |
192.168.6.130 | 8080 | 9090 |
页面显示转发到了 192.168.6.130 主机上,返回信息:访问地址:http://192.168.6.128:9090/hello.html
日志显示:
1)HAProxy 日志
2)Nginx 日志