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
参数后编译安装HAProxy1
2
3
4
5tar -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
实现记录日志功能
创建
/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
修改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:默认参数配置,配置后的参数可用于
listen
、frontend
、backend
- frontend:定义前端接受请求的监听节点
- backend:定义后端服务器节点,类似于Nginx的
upstream
- listen:关联
frontend
和backend
组成一个完整的代理节点
接下来逐个分析每个部分的详细配置
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
10global
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用于统一设置listen
、frontend
、backend
的默认参数
- log:设置日志,如果global已经配置好日志,就直接写
log global
- mode:工作模式,
mode {tcp|http|health}
。设置HAProxy实例运行的模式或协议,frontend
和backend
需要运行在同一模式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
13defaults
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
listen
、frontend
、backend
通过实例详细解释相关参数以及用法
HAProxy状态统计
listen
常见用法listen <name> ip:port
,也可以先只指定listen <name>
然后在内部用bind ip:port
1
2
3
4
5
6listen 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
5listen 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
10listen 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
而是使用frontend
和backend
再加上ACL规则进行HTTP代理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17frontend 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_acl
的frontend
,监听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中的host,hdr_reg
使用正则匹配
acl acl_name hdr_dom(host) -i www.google.com
、acl 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_dir
外path_dir
也可用于判断URL中路径
创建ACL规则后,便是使用规则
- 跳转
redirect prefix http://www.google.com.hk code 301 if acl_name
:满足名为acl_name
ACL规则的请求,301跳转到http://www.google.com.hk
后续参数不变
- 选择
backend
服务器use_backend backend_name if acl_name
- 阻止
block if acl_name1||acl_name2
:满足acl_name1
或acl_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 | #启动 |