HAproxy安装
Haproxy 介绍
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。如果说在功能上,能以proxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。
但要明确一点的,Haproxy并不是Http服务器。以上提到所有带反向代理均衡负载的产品,都清一色是WEB服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。
HAProxy的算法有如下8种:
roundrobin,表示简单的轮询
static-rr,表示根据权重,
leastconn,表示最少连接者先处理,
source,表示根据请求源IP,
uri,表示根据请求的URI;
url_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name
hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
Haproxy 编译安装
编译安装
tar zxf haproxy-1.4.22.tar.gz
tar zxf keepalived-1.2.7.tar.gz
uname -r
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp模板文件
cp -ar examples /usr/local/haproxy/
rsync -arvz /usr/local/haproxy/share/man /usr/share/
cp -ar tests /usr/local/haproxy/
cp doc/configuration.txt /usr/local/haproxy/
rsync -arvz soft/haproxy-1.4.22/examples/errorfiles /usr/local/haproxy/
cp examples/haproxy.cfg /usr/local/haproxy/etc/
cp examples/haproxy.init /etc/init.d/haproxy
日志支持,接口和你自己定义的有关系
vim /etc/syslog.conf
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
vim /etc/sysconfig/syslog
SYSLOGD_OPTIONS=”-r -m 0″
service syslog restart
Haproxy的相关启动参数
/usr/local/haproxy/sbin/haproxy –help
haproxy -f < 配置文件>
[-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p ] [-s] [-l] [-dk]
[-ds] [-de] [-dp] [-db] [-m < 内存限制M>] [{-sf|-st} pidlist…]
-d 前台,debug模式
-D daemon模式启动
-q 安静模式,不输出信息
-V 详细模式
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用后台模式,程序跑在前台
-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
/usr/local/haproxy/sbin/haproxy -c -f /usr/local/haproxy/etc/haproxy.cfg # 对haproxy 语法做检查
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg -sf cat /var/run/haproxy.pid
# reload
killall haproxy 或者 kill -9 pidof haproxy
Haproxy 配置文件解说
cat /usr/local/haproxy/etc/haproxy.cfg
全局配置信息#############参数是进程级的,通常和操作系统(OS)相关
global
maxconn 20480 #默认最大连接数
log 127.0.0.1 local3 #[err warning info debug]
chroot /usr/local/haproxy #chroot运行的路径
uid 99 #所属运行的用户uid
gid 99 #所属运行的用户组
daemon #以后台形式运行haproxy
nbproc 1 #进程数量(可以设置多个进程提高性能)
pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
ulimit-n 65535 #ulimit的数量限制
默认的全局设置
defaults
log global
mode http #所处理的类别 (#7层 http;4层tcp )
maxconn 20480 #最大连接数
option httplog #日志类别http日志格式
option httpclose #每次请求完毕后主动关闭http通道
option dontlognull #不记录健康检查的日志信息
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
stats refresh 30 #统计页面刷新间隔
retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置
balance roundrobin #默认的负载均衡的方式,轮询方式
balance source #默认的负载均衡的方式,类似nginx的ip_hash,可以固定session
balance leastconn #默认的负载均衡的方式,最小连接
contimeout 5000 #连接超时5s , 单位是ms
clitimeout 50000 #客户端超时
srvtimeout 50000 #服务器超时
timeout check 2000 #心跳检测超时
注: 时间的设置,单位为毫秒ms
1ms = 1/1000 second
1m = 60s = 60000 ms
1h = 60m = 3600s
1d = 24h = 1440m = 86400s = 864000000ms
监控页面的设置
listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称
bind :65532 #监听端口
mode http #http的7层模式
log 127.0.0.1 local3 err #错误日志记录
stats refresh 5s #每隔5秒自动刷新监控页面
stats uri /admin?stats #监控页面的url
stats realm Haproxy\ Statistics #监控页面的提示信息
stats auth yangcan:yangcan #监控页面的用户和密码yangcan,可以设置多个用户名
stats auth admin:admin #监控页面的用户和密码admin
stats hide-version #隐藏统计页面上的HAproxy版本信息
stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
网站监测listen配置
此用法主要是监控haproxy后端服务器的监控状态
listen site_status
bind :1081 #监听端口
mode http #http的7层模式
log 127.0.0.1 local3 err #[err warning info debug]
monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于2台时返回true
acl site_dead nbsrv(server_blog) lt 2
acl site_dead nbsrv(server_bbs) lt 2
monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503
monitor-net 10.0.0.103/24 #来自10.0.0.103的日志信息不会被记录和转发
monitor-net 10.0.0.25/24
frontend配置
注意,frontend配置里面可以定义多个acl进行匹配操作
frontend http_80_in
bind :80 #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
mode http #http的7层模式
log global #应用全局的日志配置
option httplog #启用http的log
option httpclose #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP
errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http
HAProxy的日志记录内容设置
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
acl策略配置
acl baby_web hdr_reg(host) -i ^(blog80.baby.local |station80.baby.local)$
如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写,主要用于redirect到www80.baby.local上;
acl baby_blog hdr_dom(host) -i www80.baby.local
如果请求的域名满足www80.baby.local 返回true -i是忽略大小写
acl baby hdr(host) -i baby.local
如果请求的域名满足baby.local 返回true -i是忽略大小写
acl file_req url_sub -i killall=
在请求url中包含killall=,则此控制策略返回true,否则为false
acl dir_req url_dir -i allow
在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false
acl missing_cl hdr_cnt(Content-length) eq 0
当请求的header中Content-length等于0时返回true
acl策略匹配相应
block if missing_cl
当请求中header中Content-length等于0阻止请求返回403
block if !file_req || dir_req
block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求
redirect prefix http://www80.baby.local code 301 if baby
当访问itnihao.cn的时候,用http的301挑转到http://10.0.0.103
reqisetbe ^[^]*/(img|css)/ server_web
reqisetbe ^[^]*/bbs/ server_blog
reqisetbe 关键字定义,根据定义的关键字选择backend
use_backend server_web if baby_web
当满足baby_web的策略时使用server_web的backend
use_backend server_blog if baby_log
当满足baby_log的策略时使用server_blog的backend
default_backend server_bbs
以上都不满足的时候使用默认server_bbs的backend
注: redirect 和 reqisetbe 需要放置在 use_backend 之前
配置文件实例
global
maxconn 50000
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
option tcplog
log 127.0.0.1 local3 debug
option redispatch
option abortonclose
option dontlognull
maxconn 5000000
timeout connect 2000000
timeout client 2000000
timeout server 2000000
listen lot_10002
bind 0.0.0.0:10002
mode tcp
balance roundrobin
server lot_14_10002 172.16.1.14:10002 check
server lot_15_10002 172.16.1.15:10002 check
listen lot_9002
bind 0.0.0.0:9002
mode tcp
balance roundrobin
server lot_15 172.16.1.15:9002 check
listen lot_10004
bind 0.0.0.0:10004
mode tcp
balance roundrobin
server lot_14 172.16.1.14:10004 check
listen lot_11201
bind 0.0.0.0:11201
mode tcp
balance roundrobin
server lot_14 172.16.1.14:11201 check
listen lot_10401
bind 0.0.0.0:10401
mode tcp
balance source
server lot_22 172.16.1.22:10401 check
listen admin_stats #定义HAProxy监控页面
bind 0.0.0.0:9188
mode http
#log 127.0.0.1 local3 err
stats refresh 30s #HAProxy监控页面统计自动刷新时间。
stats uri /haproxy-status #设置监控页面URL路径。 http//IP:9188/haproxy-status可查看
stats realm welcome login\ Haproxy #统计页面密码框提示信息
stats auth admin:123456 #登录统计页面用户和密码
stats hide-version #隐藏HAProxy版本信息
stats admin if TRUE #设置TURE后可在监控页面手工启动关闭后端真实服务器