在没有缓存服务器做session共享的情况下,可以使用haproxy插入cookie实现session共享。
#配置选项
cookie name insert indirect nocache
name:cookie的key名称,⽤于实现持久连接。
insert:如果客户端请求报⽂没有cookie就插⼊新的cookie到响应报⽂,如第⼀次访问HAProxy。
indirect:不会向客户端发送服务器已经处理过请求的cookie信息,⽐如后端服务器宕机后HAProxy将客户端请求强制转发⾄real server则会涉及修改cookie,不建议配置。
nocache:当client和hapoxy之间有缓存时,haproxy不缓存客户端cookie,因为客户端浏览器会缓存cookie并携带cookie访问haproxy。
#配置示例
listen web_host
bind 10.0.0.100:80
mode http
log global
balance roundrobin
cookie SERVER-COOKIE insert indirect nocache
server web1 192.168.7.103:80 cookie web1 check inter 3000 fall 3 rise 5
server web2 192.168.7.104:80 cookie web2 check inter 3000 fall 3 rise 5
我们会发现转发到服务器192.168.7.104的cookie的Name为SERVER-COOKIE,Value为web2,和我们所配置的一样。
最终实现只要cookie一样,就能转发到同一个后端服务器。
#配置示例
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
#配置说明
stats enable #基于默认的参数启⽤stats page
stats hide-version #隐藏版本
stats refresh <delay> #设定⾃动刷新时间间隔
stats uri <prefix> #⾃定义stats page uri,默认值:/haproxy?stats
stats realm <realm> #账户认证时的提示信息,示例:stats realm : HAProxy\ Statistics
stats auth <user>:<passwd> #认证时的账号和密码,可使⽤多次,默认:no authentication
stats admin { if | unless } <cond> #启⽤stats page中的管理功能,不建议开启
pid = 3698 (process #2, nbproc = 2, nbthread = 1)
#pid为当前pid号,process为当前进程号,nbproc和nbthread为⼀共多少进程和每个进程多少个线程
uptime = 0d 0h00m08s
#启动了多⻓时间
system limits: memmax = unlimited; ulimit-n = 131124
#系统资源限制:内存最⼤打开⽂件数,可以通过ulimit -n 1048576设置
maxsock = 131124; maxconn = 65536; maxpipes = 0
#最⼤socket连接数/单进程最⼤连接数/最⼤管道数maxpipes
current conns = 1; current pipes = 0/0; conn rate = 1/sec
#当前连接数/当前管道数/当前连接速率
Running tasks: 1/9; idle = 100 %
#运⾏的任务/当前空闲率
服务器当前状态:
active UP:#绿色,在线服务器
active UP, going down:#浅黄色,监测未通过正在进⼊down过程
active DOWN, going up:#浅橙色,down的服务器正在进⼊up过程
active or backup DOWN:#深橙色,在线的服务器或者是backup的服务器已经转换成了down状态
active or backup DOWN for maintenance (MAINT)#咖啡色,active或者backup服务器⼈为下线的
active or backup SOFT STOPPED for maintenance#深蓝色,active或者backup被⼈为软下线(⼈为将weight改成0)
backup UP:#浅蓝色,标记为backup的服务器
backup UP, going down:#紫色,备份服务器正在进⼊down过程
backup DOWN, going up:#粉色,备份服务器正在进⼊up过程
not checked:#灰色,标记为不监测的服务器
手动下线服务器
#手动下线服务器
echo "disable server web1/10.0.0.13" /var/lib/haproxy/haproxy.sock
#如果haproxy有四个进程,配置示例
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
stats socket /var/ tib/haproxy/haproxy1.sock mode 600 Level admin process 1
stats socket /var/ lib/haproxy/haproxy2.sock mode 600 level admin process 2
stats socket /var/ tib/haproxy/haproxy3.sock mode 600 Level admin process 3
stats socket /var/ tib/haproxy/haproxy4.sock mode 600 level admin process 4
#关闭四个进程
echo "disable server web1/10.0.0.13" /var/lib/haproxy/haproxy1.sock
echo "disable server web1/10.0.0.13" /var/lib/haproxy/haproxy2.sock
echo "disable server web1/10.0.0.13" /var/lib/haproxy/haproxy3.sock
echo "disable server web1/10.0.0.13" /var/lib/haproxy/haproxy4.sock
在http模式下,基于实际需求修改客户端的请求报⽂与响应报⽂,通过reqadd和reqdel在请求报⽂添加删除字段,通过rspadd与rspidel在响应报⽂中添加与删除字段。
#在请求报⽂尾部添加指定⾸部
reqadd <string> [{if | unless} <cond>]
#从请求报⽂中删除匹配正则表达式的⾸部
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>]
#在响应报⽂尾部添加指定⾸部
rspadd <string> [{if | unless} <cond>]
示例:
rspadd X-Via:\ HAPorxy #2.1版本之前
http-response add-header magedu n50 #2.1版本之后
#从响应报⽂中删除匹配正则表达式的⾸部
rspidel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>]
示例:
rspidel server.* #2.1版本之前,从响应报⽂删除server信息
http-response del-header server #2.1版本之后,从响应报⽂删除server信息
rspidel X-Powered-By:.* #从响应报⽂删除X-Powered-By信息
对响应给客户端的报⽂进⾏压缩,以节省⽹络带宽,但是会占⽤部分CPU性能。一般haproxy不做压缩,只在nginx做压缩。
compression algo #启⽤http协议中的压缩机制,常⽤算法有gzip、deflate
identity #调试使⽤的压缩⽅式
gzip #常⽤的压缩⽅式,与各浏览器兼容较好
deflate #有些浏览器不⽀持
raw-deflate #新出的压缩⽅式
compression type #要压缩的⽂件类型
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httplog
compression algo gzip deflate
compression type compression type text/plain text/html text/css text/xml text/javascript application/javascript
cookie SERVER-COOKIE insert indirect nocache
server web1 192.168.7.103:80 cookie web1 check inter 3000 fall 3 rise 5
server web2 192.168.7.104:80 cookie web2 check inter 3000 fall 3 rise 5
#inter 3s表示每次检测间隔3s,一般在3-5s之间
#fall 3表示连续检测三次挂了之后,服务器down
#rise 5表示在down的情况下,连续检测五次成功之后,服务器up
#check addr指定检测IP,check port指定检测端口
server 172.31.7.104 172.31.7.104:80 cookie web2 weight 2 check inter 3s fall 3 rise 5
server 172.31.7.104 172.31.7.104:80 cookie web2 weight 2 check addr 172.31.7.103 port 80 inter 3s fall 3 rise 5
#相当于在haproxy上使用curl去访问URL:curl http://172.31.7.104:80/app/monitor/check.html
#一般这个URI只对服务器做监控,不对业务进行处理
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httpchk GET /app/monitor/check.html HTTP/1.0
server 172.31.7.104 172.31.7.104:80 cookie web2 weight 2 check inter 3s fall 3 rise 5
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httpchk HEAD /app/monitor/check.html HTTP/1.0\r\nHost:\ 192.168.7.102
server 172.31.7.104 172.31.7.104:80 cookie web2 weight 2 check inter 3s fall 3 rise 5
访问控制列表(ACL,Access Control Lists)是⼀种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进⾏过滤(条件匹配),即对接收到的报⽂进⾏匹配和过滤,基于请求报⽂头部中的源地址、源端⼝、⽬标地址、⽬标端⼝、请求⽅法、URL、⽂件后缀等信息内容进⾏匹配并执⾏进⼀步操作,⽐如允许其通过或丢弃。
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
#示例:
#ACL模板:
acl image_service hdr_dom(host) -i img.magedu.com
ACL名称 ACL匹配规范 匹配模式 操作对象
#调用:
use_backend img_site_host if image_service
后端服务器名称 ACL-Name
ACL-name:ACL的名字
ACL名称,可以使⽤⼤字⺟A-Z、⼩写字⺟a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分⼤⼩写
⽐如Image_site和image_site就是两个完全不同的acl
ACL-criterion:定义ACL匹配规范
hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息
hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin
hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end
hdr_dom([<name> [,<occ>]]):域匹配,header中的domain name
hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路 径
hdr_len([<name> [,<occ>]]):⻓度匹配,header的⻓度匹配
hdr_reg([<name> [,<occ>]]):正则表达式匹配,⾃定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]):⼦串匹配,header中的uri模糊匹配
dst:⽬标IP
dst_port:⽬标PORT
src:源IP
src_port:源PORT
#示例:
hdr(<string>) ⽤于测试请求头部⾸部指定内容
hdr_dom(host) 请求的host名称,如 www.magedu.com
hdr_beg(host) 请求的host开头,如 www. img. video. download. ftp.
hdr_end(host) 请求的host结尾,如 .com .net .cn
path_beg 请求的URL开头,如/static、/images、/img、/css
path_end 请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
有些功能是类似的,⽐如以下⼏个都是匹配⽤户请求报⽂中host的开头是不是www:
acl short_form hdr_beg(host) www.
acl alternate1 hdr_beg(host) -m beg www.
acl alternate2 hdr_dom(host) -m beg www.
acl alternate3 hdr(host) -m beg www.
ACL-flags:ACL匹配模式
-i 不区分⼤⼩写
-m 使⽤指定的pattern匹配⽅法
-n 不做DNS解析
-u 禁⽌acl重名,否则多个同名ACL匹配或关系
ACL-operator:ACL操作符(几乎不用)
整数⽐较:eq、ge、gt、le、lt
字符⽐较:
- exact match (-m str) :字符串必须完全匹配模式
- substring match (-m sub) :在提取的字符串中查找模式,如果其中任何⼀个被发现,ACL将匹配
- prefix match (-m beg) :在提取的字符串⾸部中查找模式,如果其中任何⼀个被发现,ACL将匹配
- suffix match (-m end) :将模式与提取字符串的尾部进⾏⽐较,如果其中任何⼀个匹配,则ACL进⾏匹配
- subdir match (-m dir) :查看提取出来的⽤斜线分隔(“/”)的字符串,如果其中任何⼀个匹配,则ACL进⾏匹配
- domain match (-m dom) :查找提取的⽤点(“.”)分隔字符串,如果其中任何⼀个匹配,则ACL进⾏匹配
ACL-value:value的类型
The ACL engine can match these types against
patterns of the following types :
- Boolean #布尔值
- integer or integer range #整数或整数范围,⽐如⽤于匹配端⼝范围
- IP address / network #IP地址或IP范围, 192.168.0.1,192.168.0.1/24
- string--> www.magedu.com
exact –精确⽐较
substring—⼦串
suffix-后缀⽐较
prefix-前缀⽐较
subdir-路径, /wp-includes/js/jquery/jquery.js
domain-域名,www.magedu.com
- regular expression #正则表达式
- hex block #16进制
use_backend img_site_host if valid_src valid_port #与关系,A和B都要满⾜为true
use_backend img_site_host if invalid_src || invalid_port #或,A或者B满⾜⼀个为true
use_backend img_site_host if ! invalid_src #⾮,取反,A和B哪个也不满⾜为true
listen web_host
bind 100.0.0.100:80
mode http
balance roundrobin
log global
option httplog
####################acl setting#######################
acl web_host1 hdr_dom(host) -i www.lck.net
acl web_host2 hdr_dom(host) -i www.lck.com
########################use acl#######################
use_backend lck_host_1 if web_host
use_backend lck_host_2 if web_host
###################default backend####################
default_backend default_web
######################backend#########################
backend lck_host_1
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 5
backend lck_host_2
mode http
server web1 192.168.7.104 check inter 2000 fall 3 rise 5
backend default_web
mode http
server web1 192.168.7.104:80 check inter 2000 fall 3 rise 5
使用场景:当公网地址不够用的时候,把所有的请求都发往haproxy的frontend的bind监听地址,然后通过acl判断用户所请求的域名,然后根据不同域名转发到后端不同服务器。
listen web_host
bind 100.0.0.100:80
mode http
balance roundrobin
log global
option httplog
####################acl setting#######################
#172.18.0.0/16 或 192.168.7.103访问haproxy,则调用后端服务器lck_host
acl ip_range_test src 172.18.0.0/16 192.168.7.103
########################use acl#######################
use_backend lck_host if ip_range_test
###################default backend####################
default_backend default_web
######################backend#########################
backend lck_host
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 55
backend default_web
mode http
server web1 192.168.7.104:80 check inter 2000 fall 3 rise 5
listen web_host
bind 100.0.0.100:80
mode http
balance roundrobin
log global
option httplog
####################acl setting#######################
#172.18.0.0/16 或 192.168.7.103访问haproxy,直接deny
acl block_test src 172.18.0.0/16 192.168.7.103
########################use acl#######################
#2.1版本之前指令是block,2.1版本之后指令是http-request deny
http-request deny if block_test
###################default backend####################
default_backend default_web
######################backend#########################
backend lck_host
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 55
backend default_web
mode http
server web1 192.168.7.104:80 check inter 2000 fall 3 rise 5
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httplog
####################acl setting#######################
acl redirect_test hdr(User-Agent) -m sub -i "Mozilla/5.0 (Windows NT 6.1; WOW64;Trident/7.0;rv:11.0) like Gecko"
########################use acl#######################
#redirect prefix http://192.168.7.103 if redirect_test
use_backend lck_host if redirect_test
default_backend default_web
backend lck_host
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 5
backend default_web
mode http
server web1 192.168.7.104:80 check inter 2000 fall 3 rise 5
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httplog
acl php_server path_end -i .php
use_backend php_server_host if php_server
acl image_server path_end -i .jpg .png .jpeg .gif
use_backend image_server_host if image_server
default_backend default_web
backend php_server_host
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 5
backend image_server_host
mode http
server web1 192.168.7.104 check inter 2000 fall 3 rise 5
backend default_web
mode http
server web1 192.168.7.102:80 check inter 2000 fall 3 rise 5
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httplog
acl static_path path_beg -i /static /images /javascript
use_backend static_path_host if static_path
default_backend default_web
backend static_path_host
mode http
server web1 192.168.7.104 check inter 2000 fall 3 rise 5
backend default_web
mode http
server web1 192.168.7.102:80 check inter 2000 fall 3 rise 5
如果后端服务器全挂了,会默认显示503状态码
defaults
errorfile 500 /usr/local/haproxy/html/500.html
errorfile 502 /usr/local/haproxy/html/502.html
errorfile 503 /usr/local/haproxy/html/503.html
#2.1版本之后要按照以下格式,2.1版本之前可以随意写
cat /usr/1ocal/haproxy/html/503.html
HTTP/1.1 503 Service Unavailable
Content-Type: text/html;charset=utf-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>error</title>
</head>
<body>
<h1>页面维护中</h1>
<h2>503请联系总部: 18600000000</h2>
</body>
</html>
defaults
errorloc 503 http://192.168.7.102/error_page/503.html
应⽤场景:Memcache、Redis、MySQL、RabbitMQ
listen redis-port
bind 192.168.7.102:6379
mode tcp
balance leastconn
server server1 192.168.7.104:6379 check
server server1 192.168.7.103:6379 check backup
listen web_host
bind 192.168.7.101:80
mode http
balance roundrobin
log global
option httplog
acl invalid_src src 192.168.1.0/24 192.168.7.102
tcp-request connection reject if invalid_src
default_backend default_web
backend php_server_host
mode http
server web1 192.168.7.103 check inter 2000 fall 3 rise 5
backend static_path_host
mode http
server web1 192.168.7.104 check inter 2000 fall 3 rise 5
backend default_web
mode http
server web1 192.168.7.102:80 check inter 2000 fall 3 rise 5