Linux Haproxy详细配置教程

1 Linux Haproxy 负载均衡 v1.8 ★★★

类似于ningx的反向代理
1.1 Haproxy 概述

Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。其配置简单,维护方便,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后,Haproxy还会自动将该RS服务器加入进来提供服务。
Haproxy特别适用于那些高负载、访问量很大。但又需要会话保持或七层应用代理的业务。Haproxy运行在普通的服务器硬件上,几乎不需要进行更多的优化就可以支 持数以万计的并发连接。并且它的运行模式使得它可以很简单、安全的整合到各种网站的架构中,同时,haproxy的代理模式,可以使得应用服务器不会暴露到网络中。即后面的节点服务器不需要公网IP地址
Haproxy 工作在4层和7层,LVS工作在4层,naginx工作在7层,工作方式和nginx负载均衡相似,在配置文件中配置节点,然后通过算法轮询,

HAproxy优点:
1、 HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、 支持url检测后端的服务器;
4、 它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、 HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,HAProxy的支持多种算法。

1.1.1 Haproxy 解决方案拓扑图

2.1 Haproxy L4负载均衡应用架构拓扑
Haproxy软件的四层tcp代理应用非常优秀,配置非常简单方便,比LVS和Nginx要方便很多,因为不需要在RS端执行脚本即可实现应用代理。
说明:由于Haproxy采用的是NAT模式,数据包来去都会经过Haproxy,因此,在流量特别大的情况下,其性能不如LVS。
在一般的中小型公司,建议采用haproxy做负载均衡,而不要使用LVS或者Nginx。
2.2 Haproxy L7负载均衡应用架构拓扑
Haproxy软件的最大优点在于其7层的根据URL请求头应用过滤的功能,一般用在LVS软件的下一层,或者像官方推荐的可以挂在硬件负载均衡NS、F5下使用。

实施部署前主机规划列表
名称 接口 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挂载服务
环境的实施是建立在高可用之上,

1.1.2 Haproxy 负载算法

Haproxy有8种负载均衡算法(balance),分别如下:

1.roundrobin(rr) # 动态加权轮询 支持权重,

2.static-rr # 静态轮询 不支持权重,建议使用

3.leastconn # 最小连接优先处理,建议使用

4.source # 源地址哈希算法,建议使用

  1. uri # 根据URI做哈希算法

  2. url_param,# 根据请求的URl参数'balance url_param' requires an URL parameter name做哈希

  3. hdr(name) # 根据HTTP请求头来锁定每一次HTTP请求

  4. rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求

1.2 Haproxy 安装

官网:https://github.com/haproxy/haproxy/releases

历史版本:
on 25 Nov 2016
v1.8-dev0 …
0e658fb zip tar.gz
on 25 Nov 2016
v1.7.0 …
e59fcdd zip tar.gz
on 10 Nov 2016
v1.7-dev6 …
d5d890b zip tar.gz

yum install gcc gcc-c++ -y

  1. 开启系统转发
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.ip_nonlocal_bind = 1 # 开启vip忽略
    sysctl -p

  2. 源码编译
    tar xf haproxy-1.8.tar.gz;cd haproxy-1.8
    make TARGET=linux2628 PREFIX=/usr/local/haproxy
    make install prefix=/usr/local/haproxy

# ARCH系统版本架构uname -r
注 1.7版本报错,安装1.8正常
TARGET=参数可以在安装目录下README文件中有解释
less haproxy-1.7-dev0/README

1.3 Haproxy 环境配置和配置文件

  1. 配置日志rsyslog.conf
    vi /etc/rsyslog.conf
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /var/log/haproxy.log

  2. 手动创建目录

cd /usr/local/haproxy/
mkdir -p bin conf logs var/run var/chroot

├── bin
├── conf
├── doc
├── logs
├── sbin
│ └── haproxy
└── var
├── chroot
└── run

  1. 拷贝配置文件haproxy.cfg

cd haproxy-1.8-dev0c
cp examples/haproxy.cfg /usr/local/haproxy/conf/

  1. 修改haproxy配置文件

global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
log loghost local0 info
maxconn 1000
user haproxy
group haproxy
daemon
quiet
pidfile /usr/local/haproxy/conf/haproxy.pid
spread-checks 3
nbproc 8

defaults
log global
mode http
# 不记录健康检查的日志
retries 3
# 连次失败3次T除
timeout connect 5000
timeout client 50000
timeout server 50000

listen admin_stats
bind 192.168.136.250:80
option httplog
maxconn 10
stats enable
stats refresh 30s
stats uri /admin?stats 状态页
stats realm XingCloud\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE
cookie SERVERID insert indirect nocache

backend www.a.com
mode http
balance roundrobin
#server server1 192.168.136.135:80 cookie app1inst1 check inter 2000 rise 2 fall 5
#server server2 192.168.136.136:80 cookie app1inst2 check inter 2000 rise 2 fall 5
server server1 192.168.136.135:80 check port 22 inter 5000 fall 5
server server2 192.168.136.136:80 check port 22 inter 5000 fall 5

1.4 Haproxy 日志配置+rsyslog服务

Centos 5.8
vim /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r -x"

Centos 6

  1. 添加参数
    vim /usr/local/haproxy/conf/haproxy.cfg
    log 127.0.0.1:514 local0 warning

  2. 开启端口
    vim /etc/rsyslog.conf
    取消注释 开启端口,添加日志文件路径
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /usr/local/haproxy/logs/haproxy.log

 启动rsyslog服务(默认已开机启动)
/etc/init.d/rsyslog restart

日志文件

配置中定义的日志文件 /usr/local/haproxy/logs/haproxy.log
系统日志文件 /var/log/message

1.5 Haproxy 配置文件详解
1.5.1 global 全局配置

主要控制haproxy启动前的进程及相关设置

global
log 127.0.0.1 local0 # 未定义日志级别,记录所有日志
log 127.0.0.1:514 local1 notice #定义haproxy日志级别[error warringinfo debug] 通过syslog服务处理
daemon # 以后台形式运行harpoxy
nbproc 1 # 设置进程数量 设置过程数时,该值的设置应该和服务器的核心数一致
pidfile /usr/local/haproxy/conf/haproxy.pid #haproxy 进程PID文件
ulimit-n 819200 # ulimit 的数量限制
maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
chroot /usr/local/haproxy/var/chroot # chroot运行路径
uid/user 99/haproxy #运行haproxy 用户或UID
gid/group 99/haproxy #运行haproxy 用户组或gid
debug #haproxy 调试级别,建议只在开启单进程的时候调试
spread-checks 3 # 健康检查间隔时间
quiet # 安静模式,启动时无输出
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # 开启socket支持
stats timeout 2m
1.5.2 default 默认配置

如果frontend backend listen段未设置,则默认使用defaults段的设置

defaults
log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
#option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时 (根据客户的习惯,一般设置在20-30s之间)
timeout server 30000ms #服务器超时 (后端服务器的超时之和不要大于客户访问的超时时间)
#timeout check 2000 #心跳检测超时
#timeout http-keep-alive10s #默认持久连接超时时间
#timeout http-request 10s #默认http请求超时时间
#timeoutqueue 1m #默认队列超时时间
balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source # 设置默认负载均衡方式,类似于nginx的ip_hash
#balnace leastconn #设置默认负载均衡方式,最小连接数

1.5.3 listen 统计页面

listen admin_stats #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
bind 0.0.0.0:1080 # 监控网卡地址 0.0.0.0或* 代表监控所有
mode http #http的7层模式
option httplog #采用http日志格式
option forwardfor #记录客户端真实IP
cookie SERVERID insert indirect
timeout server 15s
timeout connect 15s
#log 127.0.0.1 local0 err #错误日志记录
maxconn 10 #默认的最大连接数
stats enable # 开启状态
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
stats auth Frank:Frank #设置监控页面的用户和密码:Frank
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)
balance roundrobin # 负载均衡策略
server web01 192.168.137.101:80 check port 2000 fall 3
server web02 192.168.137.102:80 check port 2000 fall 3

########设置haproxy 错误页面#####

errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

1.5.4 frontend 前端配置

用来匹配接收客户请求域名,URI等,并针对不同的区配,做不同的请求处理

bind 10.204.3.250:80 #VIP
#这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
acl web hdr(host) -i www.abc.com
#acl后面是规则名称,-i是要访问的域名,
acl img hdr(host) -i img.abc.com
如果访问www.abc.com这个域名就分发到下面的webserver 的作用域。
#如果访问img.abc.com.cn就分发到imgserver这个作用域。
use_backend www.abc.com if web
use_backend img.abc.com if img

实例
acl is_www.wugk1.com hdr_end(host) -i wugk1.com
acl is_www.wugk2.com hdr_end(host) -i wugk2.com
use_backend www.wugk1.com if is_www.wugk1.com
use_backend www.wugk2.com if is_www.wugk2.com
default_backend www.wugk1.com

再定义段
Backend www.wugk1.com

1.5.5 backend 后端配置

定义后端服务集群,以及对后端服务器的一些权重,队列,连接数等选项的设置

backend www.abc.com # webserver作用域 可以使用域名的方式 www.a.com
mode http
balance roundrobin # #负载均衡算法 banlance roundrobin 轮询,
balance source 保存session值,支持static-rr,leastconn,first,uri等参数
(共有8中算法:'roundrobin'简单的轮询static-rr根据权重leastconn最少连接者先处理ource根据请求源IP 'uri'根据请求的URI url_param 根据请求的URl参数hdr(name)根据HTTP请求头来锁定每一次HTTP请求'rdp-cookie(name)'很据cookie(name)来锁定并哈希每一次TCP请求)
健康检查
option httpchk /index.html HTTP/1.0 # 健康检查 针对站点文件检查 排除端口 等同于
curl http://www.a.com/index.html的测试结果
#检测文件,如果分发到后台index.html访问不到就不再分发给它

option httpchk GET /index.html # 健康检查 GET方法 对文件检查

option httpchk # 健康检查 相当于option / HTTP/1.0 不常用

基于域名的健康检查

option httpchk HEAD /index.html HTTP/1.1\r\nHOST:\www.a.com
option httpchk GET /index.html HTTP/1.1\r\nHOST:\www.a.com

server  web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3  
server  web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3  backup

backend img.abc.com
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3

参数详解:

check port 22可以简写成check 默认取前面端口

# inter 5000 fall 5  每5秒检查一次,总共检查5次  不添加默认为间隔2秒,共3次
# -rise 2  恢复前检查2次OK,加入提供服务
# weight  权重
# maxconn 2048   最大并发量
# cookie 1表示serverid为1,check inter 1500 是检测心跳频率    

backup 备用节点,不提供服务,当所有节点宕机才提供服务,一般是生产中某台提供其它服务的服务器能做,应急

option allbackups 所有备机一起启动 多台备机的情况下

配置实例1: 如果是https:加密站点

需要在:
global
maxsslconn 455350 #ssl最大连接数
tune.ssl.default-dh-param 2048 #采用2048位加密
frontend http-in
bind:443 ssl crt /etc/pki/tls/certs/haproxy.pem #在开放一个加密端口号和ssl加密证书的路径(在/etc/pki/tls/certs下makehaproxy.pem可生成一个安全证书)
haproxy rsyslog日志存储(http和httpd都得用,方便以后的排错)
vim /etc/rsyslog.conf #修改此配置文件
$ModLoadimudp
$UDPServerRun514
$AllowedSenderUDP, 127.0.0.1
.info;mail.none;authpriv.none;cron.none;local2.none #粗的是新加的/var/log/messages
local2.* /var/log/haproxy.log
service rsyslog restart #重启日志
service haproxy restart #重启haproxy服务

配置实例2: 代理tcp的90端口转发后端80端口

########tcp配置#################
listen test1
bind 0.0.0.0:90
mode tcp
option tcplog #日志类别,采用tcplog
maxconn 4086
#log 127.0.0.1 local0 debug
server s1 10.18.138.201:80 weight 1
server s2 10.18.102.190:80 weight 1
server s2 10.18.102.190:22 weight 1 #不仅仅只限80 8080 也可以是22 23等其它tcp端口

1.6 Haproxy 启动
启动haproxy
-f 指定配置文件
-c 检查语法
-D 启动进程
-q 不显示提示信息
-p pid文件

配置检测
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c

启动
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -D

平滑重启
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg –sf cat ../haproxy.pid

停止
Kill cat /usr/local/haproxy /haproxy.pid

【注意】
Haproxy在本地要起一个VIP,但是网卡上没有真实VIP地址,启动的时候会报错,所以要修改内核参数忽略检查VIP地址

1.7 Haproxy 状态页

根据以下参数配置,访问状态页
stats uri / admin?stats #统计页面url
stats auth admin:admin #用户名和密码

如果监控端口不是默认的80,需要加端口的方式,/后面可自定义。
http://10.204.3.21:8000/admin?stats

1.8 Haproxy 动态管理

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m

socat工具,与haproxy.sock通信管理haproxy

yum install socat -y

显示帮助命令
echo "help" |socat stdio /var/lib/haproxy/haproxy.sock

help的位置可以写各种命令,例如:echo "show info" 将echo的输出传参给socat命令处理

也可以通过这种方式监控haproxy

关闭指定后端节点服务器web01
echo "disable server backend-name web01" |socat stdio /var/lib/haproxy/haproxy.sock

这里要指定backend的名称,再指定服务器名,我们在状态页也可以看到backed名称

1.9 haproxy 管理与配置

1.9.1 haproxy 健康检查
httpchk格式:
option httpchk
option httpchk
option httpchk
option httpchk

Enable HTTP protocol to check on the servers health
May be used in sections : defaults | frontend | listen | backend
yes | no | yes | yes
method: GET
参考资料:less /haproxy-1.8-dev0/doc/configuration.txt

option httpchk /index.html HTTP/1.0 # 健康检查 针对站点文件检查 排除端口 等同于
curl http://www.a.com/index.html的测试结果
#检测文件,如果分发到后台index.html访问不到就不再分发给它

option httpchk GET /index.html # 健康检查 GET方法 对文件检查

option httpchk # 健康检查 相当于option / HTTP/1.0 不常用

基于域名的健康检查

option httpchk HEAD /index.html HTTP/1.1\r\nHOST:\www.a.com
option httpchk GET /index.html HTTP/1.1\r\nHOST:\www.a.com

【注意】
健康检查最好是由开发给出指定URI,因为这也是推锅的一种手段,因为一旦健康检查出问题无法有效检查,那可以说是开发给的文件有问题,要做健康检查的URI,必须考虑以下问题
机房缓存—》静态面页动态页面redis缓存数据库

1.9.2 haproxy 实现301跳转 (redirect 重定向)
在frontend段添加acl规则
acl 51cto hdr(host) -i www.baidu.com
redirect prefix http://www.51cto.com

【实验说明】
如果是在win的管理机上做测试,要先修改host文件的映射,把百度映射到你的haproxy服务器上,
实现的功能主要是当访问公司某个页面时,让他跳转到另一个页面,也可以做优雅切换之类的

1.9.3 Haproxy 日志记录真实客户端IP

  1. 在haproxy服务器的配置文件的listen段加添参数

option forwardfor # 开启此功能

  1. 在后端节点服务器上,配置日志格式
    例如:httpd.conf nginx.conf中定义日志格式

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

1.9.4 Haproxy 高可用参数backup
场景1: 当所有节点都失效时,自动启动1台备机 另1台备机仍然闲置

server web1 10.16.0.9:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3
server web2 10.16.0.10:80 cookie 2 weight 3 check port 80 inter 2000 rise 2 fall 3
server web3 10.16.0.11:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup
server web4 10.16.0.12:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup

场景2:当所有节点失效时,自动启动所有备机,需要添加option allbackup参数生效

option allbackup
server web1 10.16.0.9:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3
server web2 10.16.0.10:80 cookie 2 weight 3 check port 80 inter 2000 rise 2 fall 3
server web3 10.16.0.11:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup
server web4 10.16.0.12:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup

场景3:当1个节点失效时,就自动启动1个备节点

此方案暂时没有解决方案

1.9.5 Haproxy 高可用备节点bind无法绑定的处理方法
[ALERT] 085/171635 (23522) : Starting proxy hdbattery: cannot bind socket [10.204.3.250:8000]
问题描述: 主节点已经分配了VIP,正常启动,备节点因为没有VIP,启动时提示无法bind
解决方法: 通过修改内核参数来开启允许绑定非本机的IP
vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p

1.9.6 haproxy 互为主备或多VIP业务场景

在配置文件中,配置多个listen段并bind多个VIP就可以了,尽量将listen的参数写入defautl段中,这样可以减少维护

【配置步骤】
配置好内核参数,忽略bind net.ipv4.ip_nonlocal_bind = 1 开启允许绑定非本机的IP
互为主备的环境下,共有二个VIP,主绑一个VIP-1,同时绑一个VIP-2 但是VIP-2在主机上不存在
备绑定一个VIP-2 同时绑定一个VIP-1,但是VIP-1不存在

1.10 Haproxy ACL规则匹配

acl [flags] [operator] ...
Declare or complete an access list.
May be used in sections : defaults | frontend | listen | backend
no | yes | yes | yes
Example:
acl invalid_src src 0.0.0.0/7 224.0.0.0/3
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
block if !invalid_src # block拒绝连接

【注意】 ACL 名称可以重复定义
1.10.1 基于ACL其于URI的跳转

acl web_a hdr(host) –i www.baidu.com
acl web_b hdr(host) –i map.baidu.com
use_backend www if web_a
use_backend map if web_b
default_backend www

【实例讲解】

  1. 当用户输入的域名是www.baidu.com时,就跳转到后端地址池中的名为www的池定义的服务器
  2. 当用户输入的域名是map.baidu.com时,就跳转到后端地址池中的名为map的池定义的服务器
  3. 当用户输入的域名没有匹配到上面的acl,就默认走www的池

企业案例:参考老男孩架构课haproxy 2 38课

1.10.2 基于acl实现URI地址目录的跳转
函数: path.beg 匹配跟径开头

acl img path.beg /images/
acl php path.beg /php/
use_backend nginx_img if img
use_backend nginx_php if php
default_backend nginx_php

backend nginx_img

    mode http
    balance roundrobin  
    server  server2 10.204.3.23:80 check port 80 inter 5000 fall 5

backend nginx_php

    mode http
    balance roundrobin  
    server  server2 10.204.3.24:80 check port 80 inter 5000 fall 5

【实例讲解】
当用户输入的路径是/images/时,就跳转到后端nginx_img池中定义的服务器
当用户输入的路径是/php/时,就跳转到后端nginx_php池中定义的服务器
当用户输入的不包含上面路径时,默认走nginx_php

【环境搭建】

  1. 在3.23服务器上的发布目录中,创建/images/index.html文件
  2. 在3.24服务器上的发布目录中,创建/php/index.html文件
  3. 分别配置acl规则,访问/images/index.html文件的,走nginx_img这个池
  4. 访问/images/index.html文件的,走nginx_php这个池

1.10.3 基于扩展名做动静分离
函数: Path_end 匹配路径结尾

acl img path.beg .jpg .gif
acl php path.beg .html .txt .css
use_backend nginx_img if img
use_backend nginx_php if php
default_backend nginx_php

backend nginx_img

    mode http
    balance roundrobin  
    server  server2 10.204.3.23:80 check port 80 inter 5000 fall 5

backend nginx_php

    mode http
    balance roundrobin  
    server  server2 10.204.3.24:80 check port 80 inter 5000 fall 5

实验环境和上面一样,两台server建立相同的文件,通过识别扩展名自动分配后端节点

1.10.4 基于user_agent客户端做跳转
在日志中,记录中用户的IP和客户端类型,可以在日志中找到对应的客户端类型做匹配

acl iphone_user hdr_sub(user-agent) -i iphone
redirect prefix http://iphone.baidu.com if iphone_user #redirect方式跳转
use_backupend iphone if iphone_user # 跳转到后端backend池

测试实例:
acl img hdr_sub(user-agent) -i QQBrowser
redirect prefix http://www.qq.com if img

    acl php hdr_sub(user-agent) -i Chrome
    redirect  prefix  http://www.51cto.com if php

    acl windows hdr_sub(user-agent) -i windows
    use_backend 3-23 if windows

1.10.5 基于IP和端口控制过滤

    acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
    acl invalid_src  src_port     0:1023
    acl local_dst    hdr(host) -i localhost
    block if invalid_src || local_dst

acl invalid_src src 192.168.1.0/24 # 网段
acl invalid_src src_port 0:1024
acl local_dst hdr(host) –i localhost
block if !invalid_src # 拒绝不是来自上面规则的

实例: 针对IP做跳转
acl badguy1 src 10.204.3.17
use_backend 3-24 if badguy1

acl badguy src 10.204.1.245
use_backend 3-23 if badguy

1.11 Haproxy+Keepalived+nginx 架构

1.11.1 系统环境:
系统版本:CentOS6.0 x86_64
HAProxy版本:1.4.21
Keepalived版本:1.2.1
Nginx版本:1.2.2
MASTER_IP:192.168.0.130
BACKUP_IP:192.168.0.131
VIP:192.168.0.133
WEB_1:192.168.0.134
WEB_2:192.168.0.135

1.11.2 HAProxy安装:
haproxy.cfg内容如下:
######### haproxy.cfg ######################
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 99
gid 99
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000

frontend http-in
bind *:80
acl is_www.wugk1.com hdr_end(host) -i wugk1.com
acl is_www.wugk2.com hdr_end(host) -i wugk2.com
use_backend www.wugk1.com if is_www.wugk1.com
use_backend www.wugk2.com if is_www.wugk2.com
default_backend www.wugk1.com

backend www.wugk1.com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /index.html HTTP/1.0
option httpclose
option forwardfor
server Server1 192.168.33.11:80 cookie Server1
backend www.wugk2.com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /index.html HTTP/1.0
option httpclose
option forwardfor
server Server1 192.168.33.11:81 cookie Server1
#########################################################

然后启动haproxy,如下执行启动命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

错误提示:
[WARNING] 217/202150 (2857) : Proxy 'chinaapp.sinaapp.com': in multi-process mode, stats will be limited to process assigned to the current request.
会提示如上信息,nbproc进程如果设置为1则不会提示,如果想去掉这个提示可以修改编译文件即可。 在源码配置src/cfgparse.c找到如下行

if (nbproc > 1) {
if (curproxy->uri_auth) {

  • Warning("Proxy '%s': in multi-process mode, stats will be limited to process assigned to the current request.\n",
  • Warning("Proxy '%s': in multi-process mode, stats will be limited to the process assigned to the current request.\n",
    调整nbproc > 1数值即可。

1.12 Haproxy+heartbeat+nginx 架构

……..配置此处省略……….

1.13 LVS+haproxy 4层与7层分开控制

  1. 为了性能考虑,4层与7层分开,减少资源消耗
  2. Haproxy可以支持多台,可横向增加100台以上,易扩展

1.14 Haproxy 故障排除

1.14.1 故障: make: [install-doc] 错误 1
install: 无法获取"doc/haproxy-en.txt" 的文件状态(stat): 没有那个文件或目录
install: 无法获取"doc/haproxy-fr.txt" 的文件状态(stat): 没有那个文件或目录
make:
[install-doc] 错误 1

转载于:https://blog.51cto.com/zhongliang/2152901

你可能感兴趣的:(操作系统,后端,网络)