目录
  1. 1. HAProxy安装
  2. 2. 日志配置
  3. 3. HAProxy配置
    1. 3.1. global
    2. 3.2. defaults
    3. 3.3. listen frontend backend
      1. 3.3.1. HAProxy状态统计
    4. 3.4. SMTP 代理
    5. 3.5. HTTP代理+健康检测
    6. 3.6. HTTP代理+ACL规则
    7. 3.7. req + rsp操作
  4. 4. 启动/重启

 HAProxy能用做负载均衡服务器,也可以用于做四层(TCP)、七层(HTTP)代理

HAProxy安装

 从这里下载HAProxy的源码包,此处用的是:

  • CentOS6.4 64bit
  • haproxy-1.5.14

 确认内核版本uname -r(此机器内核信息:2.6.32-358.el6.x86_64),编译参数TARGET可用值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- 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
- linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
- solaris for Solaris 8 or 10 (others untested)
- freebsd for FreeBSD 5 to 10 (others untested)
- osx for Mac OS/X
- openbsd for OpenBSD 3.1 to 5.2 (others untested)
- aix51 for AIX 5.1
- aix52 for AIX 5.2
- cygwin for Cygwin
- generic for any other OS or version.
- custom to manually adjust every setting

 确定TARGET参数后编译安装HAProxy

1
2
3
4
5
tar -zxf haproxy-1.5.14.tar.gz
cd haproxy-1.5.14
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir -p /usr/local/haproxy/{etc,log}

 如果不需要编译安装,可以使用yum进行安装(haproxy版本会比较旧)
  yum -y install haproxy

日志配置

 HAProxy默认无日志输出功能,需要相关日志配置。在CentOS6.4中通过配置rsyslog实现记录日志功能

  1. 创建/etc/rsyslog.d/haproxy.conf配置文件

    1
    2
    3
    4
    $ModLoad imudp
    $UDPServerRun 514
    local3.* /usr/local/haproxy/log/haproxy.log
    & ~
    • $ModLoad imudp:imudp是模块名,支持UDP协议
    • $UDPServerRun 514:允许514端口接收使用UDP和TCP协议转发过来的日志,rsyslog默认在514端口监听UDP
    • local3:此为facility参数,描述提交的日志信息的应用程序或进程。如邮件、内核和FTP等,local0~7为用户自定义。详细请查看这里
    • & ~:停止对日志消息的进一步处理,并且不要在本地写入。如果没有此重定向规则,日志消息会被重复写入到本地/var/log/message文件
      或者可这么写:*.info;mail.none;authpriv.none;cron.none;local3.none /var/log/messages
  2. 修改rsyslog配置文件/etc/sysconfig/rsyslog

    1
    SYSLOGD_OPTIONS="-c 2 -r -m 0"
    • -c:指定模式,SYSLOGD_OPTIONS选项在rsyslog v3版本被弃用,需要使用切换到模式2
    • -r:接受远程日志
    • -m:标记时间戳,0表示禁用

HAProxy配置

 HAProxy配置文件/usr/local/haproxy/etc/haproxy.cfg(若是yum安装则是/etc/haproxy/haproxy.cfg)
 HAProxy的配置文件主要由以下几个部分组成,官方1.5版本详细配置说明请查看这里

  • global:全局配置,配置涉及进程管理及安全相关内容。
  • defaults:默认参数配置,配置后的参数可用于listenfrontendbackend
  • frontend:定义前端接受请求的监听节点
  • backend:定义后端服务器节点,类似于Nginx的upstream
  • listen:关联frontendbackend组成一个完整的代理节点

 接下来逐个分析每个部分的详细配置

global

 如上所述,global为全局配置参数,主要是进程管理及安全的参数。可设置的参数非常多,详细查看官方配置说明文档,这里仅说明较常用的几个参数

  • chroot:修改HAProxy的工作目录并在放弃权限之前执行 chroot()操作
  • daemon:以守护进程方式启动
  • log:定义日志。log ip facility [level],Example:log 127.0.0.1 local3 info
  • nbproc:设置HAProxy启动进程数,默认一个进程。nbproc 1
  • uid:指定以UID用户运行HAProxy
  • maxconn:设置每个HAProxy进程能接受的最大并发数
  • debug:开启debug,生产环节禁用
  • quiet:启动HAProxy时不显示任何信息

 常见global配置实例:

1
2
3
4
5
6
7
8
9
10
global
log 127.0.0.1 local3
maxconn 4096
chroot /usr/local/haproxy
pidfile /usr/local/haproxy/haproxy.pid
uid 99
gid 99
daemon
#quiet
#debug

defaults

defaults用于统一设置listenfrontendbackend的默认参数

  • log:设置日志,如果global已经配置好日志,就直接写log global
  • mode:工作模式,mode {tcp|http|health}。设置HAProxy实例运行的模式或协议,frontendbackend需要运行在同一模式
    • tcp:纯TCP工作模式,在client和server之间建立一个TCP连接代理,仅用作4层代理转发,常用于SSH、SMTP、POP3等代理。
    • http:HTTP工作模式,HAProxy能对客户端的7层请求进行分析进而过滤、处理及转发等动作。
    • health:health模式,对进入HAProxy的连接仅回复’OK’并关闭连接。
  • option httplog [clf]:记录HTTP请求、会话状态和计时器。clf格式记录
  • option dontlognull:不记录null日志
  • option logasap:提前将 HTTP 请求记入日志,而不等待 HTTP 报文传输完毕
  • option forwardfor:在发往服务器的请求中插入X-Forwarded-For首部用于记录客户端的IP。option forwardfor except 127.0.0.0/8不记录本机转发日志
  • retries :设置对某个服务器连接失败后重试的次数
  • option redispatch:连接失败时重新分发会话
  • option http-keep-alive :设置http keepalive时间,既允许空闲连接的时间
  • option http-server-close:每次请求完毕后主动关闭http连接
  • timeout http-request :http请求超时时间

 常见defaults配置实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
defaults
log global
mode http
option httplog
option dontlognull
retries 3
maxconn 2000
#option forwardfor
#option http-keep-alive 10s
#timeout http-request 10s
timeout connect 5000
timeout client 50000
timeout server 50000

listen frontend backend

listenfrontendbackend通过实例详细解释相关参数以及用法

HAProxy状态统计

listen常见用法listen <name> ip:port,也可以先只指定listen <name>然后在内部用bind ip:port

1
2
3
4
5
6
listen status *:8000					#绑定ip及port
stats enable #开启状态输出页面
stats hide-version #隐藏HAProxy版本号
stats uri /haproxy?stats #访问url
stats realm HAProxy\ Statistics #提示信息
stats auth admin:password #验证的用户及密码

SMTP 代理

 利用HAProxy做简单的SMTP邮件代理

1
2
3
4
5
listen smtp *:25
log global
mode tcp
option tcplog
server smtp 192.168.1.1:25 check

HTTP代理+健康检测

 简单的HTTP代理及基础检测

1
2
3
4
5
6
7
8
9
10
listen http_proxy *:80
mode http
cookie SERVERID #允许cookie记录serverid
balance roundrobin #负载均衡算法
option forwardfor
option httplog clf #使用httplog并使用clf日志格式
option httpchk GET /index.html #健康检测,使用HTTP请求通过HTTP CODE判断健康状态,2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。
#option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.test.com #更精确的健康检测,对HTTP头部进行检测
server web1 192.168.1.1:80 cookie server_id_1 check
server web2 192.168.1.2:80 cookie server_id_2 check inter 500 rise 1 fall 2 backup

 重点解释一下server web2 192.168.1.2:80 cookie server_id_2 check inter 500 rise 1 fall 2

  • server web2 192.168.1.2:80:定义server的名称、IP及端口
  • cookie server_id_2:设定每个server的cookie serverid(前面已经允许cookie记录serverid)
  • check:启用健康检查
  • inter 500:检查的时间间隔,500毫秒
  • rise 1:server需要被检查X次正常后才认为可用
  • fall 2:server需要被检查X次失败后才认为不可用
  • backup:作为备份,类似Nginx upstream中的backup。web1不可用后才使用web2
  • weight:设置server权重,上面例子没用到
  • balance:指定HAProxy的负载均衡算法
    • roundrobin:基于权重的轮询算法。假若服务器处理时间均匀的情况下,此算法是最平衡及公平的,权重值动态调整,但每个后端服务器限制接受4095个活动链接
    • static-rr:基于权重的轮询算法。和roundrobin类似,不同的是权重值为静态方法,不会进行动态调整,但后端服务器无连接限制
    • leastconn:将新请求转发到最少连接数的后端服务器上。推荐在长会话中使用(LDAP/SQL/TSE),短会话(HTTP)不太适合。算法是动态的,可在运行时调整权重
    • first:此算法将所有请求都转发到backend的第一台服务器上,当该服务器达到最大连接数后则转发到下一台服务器。
    • source:此算法将源IP进行hash,并由后端服务器的权重总数相除后决定转发。使得相同IP的请求能被转发到后端的同一台服务器上,但当后端服务器权重改变时很可能会重新分配转发。常用于基于TCP的无cookies场景
    • uri:将URI左边部分(?之前)或整个URI进行hash,并由后端服务器的权重总数相除后决定转发。使得相同URI的请求能被转发到后端同一台服务器上,但当后端服务器权重改变时很可能会重新分配转发。常用于代理缓存或反病毒代理,此算法仅用于HTTP后端服务器场景
    • url_param:通过检索HTTP GET请求中URL指定的参数进行转发。可使得具有相同URL参数的请求(如userid)能被转发到后端同一台服务器上,除非权重发生变化。
    • hdr(header parament):对HTTP HEADER进行检索决定转发。
    • rdp-cookie:根据cookie锁定并hash每个TCP请求

HTTP代理+ACL规则

 不使用listen而是使用frontendbackend再加上ACL规则进行HTTP代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
frontend http_acl *:5000
mode http
option forwardfor
option httplog clf
acl static_resource path_beg -i /static /images
acl static_resource path_end -i .jpg .gif .png
use_backend backend_res_server if static_resource
default_backend backend_app_server

backend backend_res_server
balance roundrobin
server static_server_1.155 10.0.1.155:80 check

backend backend_app_server
balance roundrobin
server app1 10.0.6.5:8888 check
server app2 10.0.6.6:8888 check

逐个分析配置语句,之前提过的省略

  • frontend http_acl *:5000:创建名为http_aclfrontend,监听5000端口
  • acl static_resource path_end -i .jpg .gif .png
    • acl static_resource:创建ACL规则,此规则名为static_resource
    • path_beg/path_end -i .jpg:匹配URL路径中开始/结束字符,例子中以.jpg .gif .png结束的字符,-i忽略大小写
  • use_backend:指定满足ACL规则的后端服务器。use_backend <backend> <if | unless> <condition>
  • default_backend:默认的后端服务器
  • backend <backend_name>:创建后端服务器组

ACL规则还有很多应用,列举一些简单例子:

  • acl acl_name hdr_reg(host) -i ^(www.google.com|www.google.com.hk)$
    • hdr_reg(host):指定匹配HTTP HEADER中的hosthdr_reg使用正则匹配
  • acl acl_name hdr_dom(host) -i www.google.comacl acl_name hdr(host) -i www.google.com
    • hdr_dom(host)/hdr(host):HTTP HEADER的域名匹配
  • acl acl_name hdr_cnt(Content-length) eq 0
    • hdr_cnt(Content-length):HTTP HEADER内容的Content-length等于0
  • acl acl_name url_sub -i acl_test
    • url_sub:URL请求地址中包含acl_test
  • acl acl_name url_dir -i acltest
    • url_dir:URL路径中包含acltest,例如:http://www.google.com.hk/acltest/chrome.png
    • path_dir:除url_dirpath_dir也可用于判断URL中路径

创建ACL规则后,便是使用规则

  • 跳转
    • redirect prefix http://www.google.com.hk code 301 if acl_name:满足名为acl_nameACL规则的请求,301跳转到http://www.google.com.hk后续参数不变
  • 选择backend服务器
    • use_backend backend_name if acl_name
  • 阻止
    • block if acl_name1||acl_name2:满足acl_name1acl_name2的请求返回403

req + rsp操作

 HAProxy还有一系列的req操作,这部分了解甚少,以后再补吧
reqadd reqallow reqdel reqdeny reqiallow reqidel reqideny reqipass reqirep reqisetbe reqitarpit reqpass reqrep
rspadd rspdel rspdeny rspidel rspideny rspirep rsprep

启动/重启

1
2
3
4
5
#启动
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

#平滑重启
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg -sf `cat /usr/local/haproxy/haproxy.pid`

Powered: Hexo, Theme: Nadya remastered from NadyMain