1. Haproxy介绍

Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCPHTTP应用代理等功能。其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后Haproxy还会自动将RS服务器假如。

Haproxy特别使用与那些访问量很大。但又需要会话保持或七层应用的业务。Haproxy运行在普通的服务器硬件上,仅仅进行简单的优化就可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合到各种网站的架构中,同时使得应用服务器不会暴露到网络中。

Haproxy软件引入了frontendbackend的功能,frontendacl规则匹配)可以运维管理人员根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backendserver pools等待前端把请求转过来的服务器组)。通过frontendbackup,我们可以很容易的实现haproxy7层代理功能,haproxy是一款不可多得的优秀代理服务软件

Haproxy支持两种主要代理模式:第一个是4tcp代理(例如:可用于邮件服务内部协议通信服务器、Mysql服务等)。第二个是7层代理(如HTTP代理)。在4tcp代理模式下,Haproxy仅在客户端和服务器之间双向转发流量。但是在7层模式下Haproxy会分析应用层协议,并且能通过运行、拒绝、交换、增加、修改或者删除请求(request)或者回应(reponse)里指定内容来控制协议。

 

2. Haproxy解决方案拓扑图

2.1 Haproxy L4负载均衡应用架构拓扑

Haproxy软件的四层tcp代理应用非常优秀,配置非常简单方便,比LVSNginx要方便很多,因为不需要在RS端执行脚本即可实现应用代理。

说明:由于Haproxy采用的是NAT模式,数据包来去都会经过Haproxy,因此,在流量特别大的情况下,其性能不如LVS

在一般的中小型公司,建议采用haproxy做负载均衡,而不要使用LVS或者Nginx

2.2 Haproxy L7负载均衡应用架构拓扑

Haproxy软件的最大优点在于其7层的根据URL请求头应用过滤的功能,一般用在LVS软件的下一层,或者像官方推荐的可以挂在硬件负载均衡NSF5下使用。

2.3 实施部署前主机规划列表

名称

接口

IP

用途

MASTER

eth0

192.168.1.81

外网管理IP,用于WAN数据转发


eth1

192.168.2.81

内网管理IP,用于LAN数据转发


eth2

192.168.3.81

用于服务器间心跳连接(直连)

vip


192.168.1.181

用于提供应用程序A挂载服务

BACKUP

eth0

192.168.1.82

外网管理IP,用于WAN数据转发


eth1

192.168.2.82

内网管理IP,用于LAN数据转发


eth2

192.168.3.82

用于服务器间心跳连接(直连)

vip


192.168.1.182

用于提供应用程序B挂载服务

此表为heartbeat+haproxy生产环境中的正式IP环境,haproxy做四层应用时的IP信息

2.4 实施部署环境

Haproxy所有实施部署环境和前面讲过的heartbeat的环境一模一样。因为在生产环境中,haproxy服务就是和heartbeat服务配合使用的,当然和keepalived服务配合也是可以的。

3. 安装Haproxy软件

3.1 安装

mkdir -p /home/yan/tools

cd /home/yan/tools

tar -xf haproxy-1.4.21.tar.gz

cd haproxy-1.4.21

make TARGET=linux26 ARCH=x86_64

make PREFIX=/application/haproxy-1.4.21 install

ln -s /application/haproxy-1.4.21/ /application/haproxy

3.2 配置Haproxy实现L4负载均衡

3.2.1 初始化Haproxy目录

cd /application/haproxy/

ll

3.2.2 创建Haproxy相关目录

mkdir -p bin conf logs var/run var/chroot

3.2.3  L4Haproxy的配置文件(conf目录下)

vim conf/haproxy.conf

global

        chroot /application/haproxy-1.4.21/var/chroot

        daemon

        group haproxy

        user haproxy

        log 127.0.0.1:514 local0 info

        pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

 

        maxconn 20480

        spread-checks 3

#       tune.maxaccept 100

#       tune.maxpollevents 180

        nbproc 8

 

defaults

                log     global

                mode    http

#       option  httplog

#       option  dontlognull

                retries 3

                option redispatch

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

 

listen www01  192.168.1.8180

                mode http

                no    option splice-response

        stats enable

                stats uri /admin?stats

        stats auth proxy:oldboy

        balance roundrobin  #轮询算法rr

        option httpclose

        option forwardfor  #记录客户端地址,而不是haproxy地址

        option httpchk HEAD /checkstatus.html HTTP/1.0  #健康检查

        server www01 192.168.1.80:80 check   #增加RS

        server www02 192.168.1.100:80 check  #check:对端口做检查

添加一个haproxy用户

useradd haproxy -s /sbin/nologin -M

3.2.4 Haproxy启动脚本(bin目录下存放)

vim bin/haproxy

#!/bin/bash

 

BASE="/application/haproxy-1.4.21"

 

PROG=$BASE/sbin/haproxy

PIDFILE=$BASE/var/run/haproxy.pid

CONFFILE=$BASE/conf/haproxy.conf

 

case "$1" in

start)

#$PROG -f $CONFFILE >/dev/null 2>&1

$PROG -f $CONFFILE

;;

status)

if [ ! -f $PIDFILE ]; then

echo "pid not found"

exit 1

fi

for pid in $(cat $PIDFILE); do

kill -0 $pid

RETVAL="$?"

if [ ! "$RETVAL" = "0" ]; then

echo "process $pid died"

exit 1

fi

done

echo "process is running"

;;

restart)

$PROG -f $CONFFILE -sf $(cat $PIDFILE) >/dev/null 2>&1

;;

stop)

kill $(cat $PIDFILE)

;;

*)

echo "USAGE: $0 start|restart|status|stop"

exit 1

;;

esac

chmod 700 haproxy

3.2.5 启动Haproxy服务

/application/haproxy/bin/haproxy start

[WARNING] 162/092036 (34610) : Proxy 'www': in multi-process mode, stats will be limited to process assigned to the current request.

[ALERT] 162/092036 (34610) : Starting proxy www: cannot bind socket

原因是不存在VIP导致启动Haproxy报错,80端口已经启动产生冲突

解决方法

echo 'net.ipv4.ip_nonlocal_bind = 1'>>/etc/sysctl.conf

sysctl -p

并且关闭http服务

(net.ipv4.ip_nonlocal_bind=1  意思是启动haproxy的时候,允许忽视VIP的存在)

加入开机自启动

echo '/application/haproxy/bin/haproxy start' >> /etc/rc.local

检查服务:

ps -ef | grep haproxy | grep -v grep

haproxy   34645      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34646      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34647      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34648      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34649      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34650      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34651      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34652      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

3.2.6 Haproxy日志配置(cat /etc/syslog.conf

yum -y install rsyslog

编辑/etc/rsyslog.conf  (末尾添加)

vim /etc/rsyslog.conf

#Haproxy

local0.*   /application/haproxy-1.4.21/logs/haproxy.log

#end /etc/rsyslog.conf

3.2.7 配置/etc/sysconfig/rsyslog

vim /etc/sysconfig/rsyslog

# 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 -r -x"

# 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".

重启日志服务

/etc/init.d/rsyslog restart

chkconfig rsyslog on

ps -ef | grep rsyslog | grep -v grep

root      34518      1  0 08:54 ?        00:00:00 /sbin/rsyslogd -i /var/run/syslogd.pid -m 0 -r -x

 

3.2.8 查看状态信息


haproxy原理与部署_第1张图片


haproxy原理与部署_第2张图片

 

检查备节点(192.168.1.82http能正常访问

修改主节点(192.168.1.81/application/haproxy/conf/haproxy.conf

vim /application/haproxy/conf/haproxy.conf

server www02 192.168.1.82:80 check

wget 192.168.1.82能通但是浏览器中显示不正常,原因是走了健康检查了,将option httpchk HEAD /checkstatus.html HTTP/1.0注释掉)

/application/haproxy/bin/haproxy restart

此时查看浏览器上www02已经变绿

访问192.168.1.81(主节点)跟192.168.1.82(备)结果相同,表示四层负载均衡已经OK

3.3 测试haproxy负载均衡和健康检查功能

修改主节点(192.168.1.81/application/haproxy/conf/haproxy.conf

再添加一个server www03 192.168.1.85:80 check

重启服务:

/application/haproxy/bin/haproxy restart

wKiom1e5NsaDNFNAAABdpox75YY115.png-wh_50 

当访问192.168.1.81时会在两台主机之间相互轮询切换

轮询访问结果测试

for((i=0;i<10;i++));do curl http://192.168.1.81;sleep 2;echo;done

 

4. Haproxy健康检查功能

4.1 基于端口的健康检查配置

server www01 192.168.1.80:80 check

server www02 192.168.1.82:80 check

server www03 192.168.1.85:80 check

补全上面配置结果

server www01 192.168.1.80:80 cookie www01 check port 80 inter 5000 fall 5

提示:

1check port 80 表示对80端口进行健康检查

2inter 5000 fall 5 表示每5秒检查一次,一共检查5次。如果有问题就会摘掉出问题的机器。

3)如果结尾不加inter 5000 fall 5,则默认每2秒检查一次,一共检查3次。如果有问题就会摘掉出问题的机器。

4The default

values are the following ones :

  - inter : 2000  意思是不加该参数,正常情况默认没两秒检查一次

  - rise  : 2  意思是不加该参数,在RS宕机后恢复前,检查2OK,认为其复活,并加入到群组中

  - fall  : 3  意思是不加该参数,检查3此后,认为RS宕机,剔除集群组

  - port  : default server port  不加该参数,默认就是端口检查

  - addr  : specific address for the test (default = address server)

4.2 基于URL的健康检查

1)基于IPURL健康检查

option httpchk HEAD /checkstatus.html HTTP/1.0

server tmpbai51 192.168.1.51:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

server tmpbai53 192.168.1.53:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

server tmpbai54 192.168.1.54:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

当打开option httpchk HEAD /checkstatus.html HTTP/1.0进行URL健康检查时浏览器上显示都是红色,原因是没有checkstatus.html

解决办法在apache站点目录下创建checkstatus.html,或者将checkstatus.html改为index.html

此时浏览器上的检查条目会变绿

2)基于域名的URL健康检查:

option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www

URL健康检查实践测试:实际上haproxy就是相当于用下面的方式在访问RS节点确认是否正常

curl http://192.168.1.82/checkstatus.html

3)第一种HEAD配置方法

option httpchk HEAD /checkstatus.html HTTP/1.0

这种检测方式就相当于curl http://192.168.1.82/checkstatus.html

4)健康检查的频率、时间等参数

maxconn 2048 最大连接数,连接数不是越大越好,衡量服务器的承受能力,设置其能承受的最大值不至于把服务器压垮

weight 8  权重(权重越大,承受的访问量越大)

5)第二种GET配置方法

option httpchk GET /checkstatus.html

5. Haproxy的相关生产功能应用

5.1 haproxy高可用参数backup功能测试

tail -3 haproxy.conf

server www02 192.168.1.82:80 check

#server www03 192.168.1.85:80 check

server www21 192.168.1.85:80 check backup

打开浏览器

wKiom1e5NtvSQxd8AABZJyx5hHA219.png

 此时访问192.168.1.81(主节点)只能访问到192.168.1.82,不会轮询到85主机

 当82主机宕掉后会立马切换到85主机

5.2 haproxy下的RS无法记录客户真实IP问题

当查看82主机的http日志是发现访问IP都是81,不会记录真实主机的IP

解决办法:

1)haproxy配置文件里加如如下参数:

listen www

......

option forwardfor

.......

提示:参数最好放在listen www里面

2)RS上对日志格式进行修改

//传统日志和后抛Netscaler负载均衡的apache日志比较

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

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

此时再从笔记本访问后查看82的日志,里面记录的就是笔记本的真实IP了,不是haproxy主机的IP

3)生产环境负载均衡后面的RS服务器不记录负载均衡的健康检查日志:

虚拟主机不记录健康检查文件日志(check.txt):

SetEnvIf Request_URL "^/check\.txt$" dontlog

LogLevel warn

ErrorLog /var/log/httpd/vhost_error.log

CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog

5.3 在配置内核参数开发转发功能

/etc/sysctl.conf中加入如下配置

net.ipv4.ip_forward=1

sysctl -p

 

6. Haproxy双机双主的相关生产应用

6.1 主备Haproxy配置文件区别

主备Haproxy配置文件完全一样,没有任何不同

将主节点的配置文件全部拷贝到备节点,启动服务

修改配置文件/application/haproxy/conf/haproxy.conf

listen www

        bind 192.168.1.181:80

IP改为VIP地址

重启服务

此时访问VIP192.168.1.181

6.2 Haproxy主从端分别开启转发功能:

vim /etc/stsctl.cinf

net.ipv4.ip_forward = 1

sysctl -p

6.3 生产环境防火墙iptables配置建议

(生产环境高访问量站点防火墙可能对LB性能有影响,最后前端加硬件防火墙或者干脆不用防火墙)

6.4 heartbeathaproxy关联问题

在生产环境中,haproxy可能会配置heartbeatkeepalived使用,当Haproxy无法提供服务时,要不要把服务推到备机?

一般情况这个问题不会发生,如果严格去做的话可以单独写一个守护进程脚本,当haproxy一宕的时候,停掉heartbeat

6.5 haproxy日志配置优化

将配置文件/application/haproxy/conf/haproxy.conf中的日志改为

log 127.0.0.1:514 local0 waring

6.6 haproxy多业务多VIP的配置

vim /application/haproxy/conf/haproxy.conf

global

        chroot /application/haproxy-1.4.21/var/chroot

        daemon

        group haproxy

        user haproxy

        log 127.0.0.1:514 local0 warning

        pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

 

        maxconn 20480

        spread-checks 3

#       tune.maxaccept 100

#       tune.maxpollevents 180

        nbproc 8

 

defaults

        log     global

        mode    http

#       option  httplog

        option httpclose

#       option  dontlognull

        stats enable

        stats uri /admin?stats

        stats auth proxy:oldboy

        cookie SERVERID insert

        retries 3

option redispatch

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

 

listen www

        bind 192.168.1.181:80

        mode http

        balance roundrobin

        option forwardfor

        option httpchk HEAD /checkstatus.html HTTP/1.0

        server www01 192.168.1.80:80 check

        server www02 192.168.1.82:80 check

        server www21 192.168.1.85:80 check

 

listen ssh

        bind 192.168.1.181:900

        mode tcp

        balance roundrobin

        server ssh85 192.168.1.82:22 check

haproxy原理与部署_第3张图片 

启动后连接ssh -p900 [email protected]测试

6.7 haproxy多实例解决方案

/application/haproxy/conf/下再添加一个配置文件,比如haproxy.conf.simple-L4

(注意,两个配置文件pid文件名不能一样,listen不能一样,bind不能一样)

vim /application/haproxy/conf/haproxy.conf.simple-L4

启动实例:

/application/haproxy/sbin/haproxy -f haproxy.conf.simple-L4

检查:ps -ef | grep haproxy

6.8 heartbeathaproxy配合生产场景维护

6.9 查看服务是否正常及VIP情况

查看日志情况

tail -f /application/haproxy/logs/haproxy.log

tail -f /var/log/heartbeat.log

tail -f /var/log/messages

 

7. haproxyL7生产应用实践

7.1 rs web server测试环境准备

/var/下分别建立php nginx resin3个站点目录,并增加index文件及内容,假设PHPnginxresin分别代表不同的业务服务:

PHP  表示动态php程序服务

nginx表示静态图片、jshtml等服务

resin表示动态jsp/java服务

操作命令:

for name in php nginx resin;do mkdir -p /var/$name;echo $name > /var/$name/index.html;done

检查:

for name in php nginx resin;do cat /var/$name/index.html;done

安装httpd:

yum -y install httpd

添加虚拟主机

编辑httpd-vhost.conf最下面加

vim /etc/httpd/conf.d/httpd-vhost.conf

    Options FollowSymLinks

    AllowOverride none

    Order allow,deny

    Allow from all

NameVirtualHost *:8000

NameVirtualHost *:9000

NameVirtualHost *:10000

    ServerAdmin [email protected]

    ServerName nginx.yan.org

    ServerAlias yan.org

    DocumentRoot "/var/nginx"

 

    ServerAdmin [email protected]

    ServerName php.yan.org

    DocumentRoot "/var/php"

 

    ServerAdmin [email protected]

    ServerName resin.yan.org

    DocumentRoot "/var/resin"

vim /etc/httpd/conf/httpd.conf  增加监听端口

Listen 8000

Listen 9000

Listen 10000

检查语法:

/etc/init.d/httpd configtest

重启:

/etc/init.d/httpd restart

 

7.2 实现haproxy301域名跳转

主节点(192.168.1.81)操作

修改笔记本hosts文件:

vim /etc/hosts (将虚拟主机的域名解析为haproxy配置文件bind中的IP

192.168.1.81 nginx.yan.org php.yan.org resin.yan.org yan.org

修改主节点(192.168.1.81haproxy配置文件

vim /application/haproxy/conf/haproxy.conf

global

        chroot /application/haproxy-1.4.21/var/chroot

        daemon

        group haproxy

        user haproxy

        #log 127.0.0.1:514 local0 info

        log 127.0.0.1:514 local0 warning

        pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

        maxconn 20000

        spread-checks 3

        nbproc 8

defaults

        log     global

        mode    http

        retries 3

        option redispatch

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

        stats enable

        stats hide-version

        stats uri /admin?stats

        stats auth proxy:123456

        option httpclose

 

frontend webserver

        bind 192.168.1.81:80

        #1)301×

        #èó1.yan.org -->nginx.yan.org  ¨301

        #(short_domר hdr°üHost -i(·ó) yan.org

        acl short_dom hdr(Host) -i yan.org

        #prefix °×× ±¤·http://yan.org/a.html×http://nginx.yan.org/a.html

        redirect prefix http://nginx.yan.org:8000 code 301 if short_dom

 

        acl oldboy_static path_beg /nginx/

        acl oldboy_php path_beg /php/

        acl oldboy_java path_beg /resin/

        acl oldboy_pic  path_end  .gif .png .jpg .css .js

 

        acl iphone_users hdr_sub(user-agent)  -i iphone

        redirect prefix http://3g-iphone.yan.org if iphone_users

 

        acl android_users hdr_sub(user-agent)  -i android

        redirect prefix http://3g-android.yan.org/ if android_users

 

        use_backend nginxpools if oldboy_static or oldboy_pic

        use_backend phppools if oldboy_php

        use_backend javapools if oldboy_java

 

        default_backend nginxpools

 

# nginx static contents

backend nginxpools

        balance roundrobin

        server oldboy_8000 192.168.1.80:8000

 

# php contents

backend phppools

        balance roundrobin

        server oldboy_9000 192.168.1.80:9000

 

# java contents

backend javapools

        balance roundrobin

        server oldboy_10000 192.168.1.80:10000

重启haproxy服务

/application/haproxy/bin/haproxy stop

/application/haproxy/bin/haproxy start

此时笔记本打开浏览器访问http://yan.org:8000 会跳转到http://nginx.yan.org:8000

7.3 实现haproxy基于url地址目录做7层跳转

acl oldboy_static path_beg /nginx/  #path_beg 域名后面是nginx时,把他定义为oldboy_static

acl oldboy_php path_beg /php/

acl oldboy_java path_beg /resin/

 

use_backend nginxpools if oldboy_static  #如果有oldboy_static就交给nginxpools

use_backend phppools if oldboy_php

use_backend javapools if oldboy_java

在真实服务器(192.168.1.80)上创建三个目录(nginx,php,resin):

mkdir /var/nginx/nginx

echo nginx123 > /var/nginx/nginx/index.html

mkdir /var/nginx/nginx

echo nginx123 > /var/nginx/nginx/index.html

mkdir /var/php/php

echo php123 > /var/php/php/index.html

mkdir /var/resin/resin

echo resin123 > /var/resin/resin/index.html

测试:

在客户机(笔记本)hosts文件加一条:192.168.1.80 nginx.yan.org php.yan.org resin.yan.org yan.org

浏览器访问http://nginx.yan.org:8000/nginx/

http://php.yan.org:9000/php/

http://resin.yan.org:10000/resin/

将客户机hosts改回192.168.1.81 nginx.yan.org php.yan.org resin.yan.org yan.org

浏览器访问http://nginx.yan.org/nginx/得到的结果为nginx123,说明跳转成功

wKioL1e5Nzmzp7tqAAAO6ew3PiU017.png 

以上内容实现了:

访问http://nginx.yan.org/nginx/  ==>nginxpools后端处理

访问http://nginx.yan.org/php/  ==>phppools后端处理

访问http://nginx.yan.org/resin/  ==>resinpools后端处理

7.4 实现haproxy基于文件扩展名做7层跳转

acl oldboy_pic  path_end  .gif .png .jpg .css .js

use_backend nginxpools if oldboy_static or oldboy_pic

测试:在nginx目录下放三张图片nginx.jpg  php.jpg  resin.jpg

当访问http://nginx.yan.org/nginx.jpg 会访问到图片

当访问http://resin.yan.org/resin.jpg 会访问到图片(跳转到nginx目录下找resin.jpg

7.5 实现haproxy基于user_agent7层跳转

acl iphone_users hdr_sub(user-agent)  -i iphone   

redirect prefix http://3g-iphone.yan.org if iphone_users

 

acl android_users hdr_sub(user-agent)  -i android

redirect prefix http://3g-android.yan.org/ if android_users

问题1rsyslog没有生成日志文件

解决办法:

1)vim /etc/rsyslog.conf 改为

local0.*   /var/log/haproxy.log

2)关闭selinux,重启rsyslog

此时/application/haproxy/logs/下会生成haproxy.log

问题2:日志文件没有记录日志,为空

解决:

编辑haproxy配置文件

vim /application/haproxy/conf/haproxy.conf  改为

log 127.0.0.1 local0 warning

8. Haproxy多种健康检查方法及实例

8.1 基于tcp端口的健康检查

使用这种检查方法,haproxy只会去检查后端server服务的对应端口,根据前面经验,我们知道这并不能保证服务的完全可用,但却可以作为辅助的检查手段,当在不是非常严格业务环境下也是可以用的,例如:前面讲解过的keepalived向下的健康检查默认就是基于端口的。对用户体验非常严格,就不要使用基于tcp端口的检查方式

8.4 基于具体业务域名的URL健康检查

基于域名的URL健康检查:实际上,可以理解为haproxy用下面的方式在访问RS节点确认是否正常来检查

curl http://www.yan.org/index.jsp 或 wget http://www.yan.org/index.jsp 方式

这种检测方式,适用于更精细的基于具体业务的检测需求。实际上是带着head host头部信息向下健康检查

它的使用语法如下:

option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.yan.org

根据具体业务对应的域名来进行更细化的监控。可以用HEADGET方式

option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ nginx.yan.org

option httpchk GET /check.html HTTP/1.1\r\nHost:\php .yan.org

8.5 生产环境如何正确选择健康检查

1)常规业务可以使用基于tcp的方式做健康检查,我们在keepalived健康检查时就是这样做的,虽然,keepalived也支持url健康检查

2)由于基于URL的方式做健康检查相对来说也比较容易配置,所以推荐使用基于URL的健康检查

可以使用http://192.168.1.80/check.html的方式,也可以使用基于域名的http://www.yan.org/html方式,后者更高级一些

3)实际生产环境中,最重要最关键的是,我们设置的check.html能否真正的代表rs上的业务状态

4)对于用户体验比较高的业务,可以请开发人员设置更加深入的健康检查文件,例如:yan.phpyan.jsp,这个健康检查可以深入到数据库,存储及各个接口,如果之一出现异常我就摘除。

5)对于用户体验比较高的业务,除了健康检查文件更深入外,健康检查的频率、次数都要相应调整。例如:1秒检查一次,一次连不上就摘除RS