最近用到的,Haproxy做前端负载服务器,碰到的一些问题记录。
1、后端负载多个服务器后,登录页面出现的验证码错误问题
这种情况一般都是会话保持没有做好,加入以下配置:
cookie SRV insert indirect nocache
使其变为:
listen HTTP-4481 bind 0.0.0.0:4481 mode http option httplog retries 3 option httpclose option forwardfor balance roundrobin timeout connect 5000 timeout client 50000 timeout server 50000 cookie SRV insert indirect nocache server WEB-1 192.168.1.1:4481 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000 server WEB-2 192.168.1.2:4481 cookie WEB-2 check weight 1 maxconn 50000 check inter 5000
2、frontend、backend、Listen之间的区别及关系
frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
backend : 后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器,也就是跟随者Frontend,两者结合使用。
通常Frontend和backend一并使用,如:
frontend http-4480 bind *:80 mode http option httplog default_backend HTTP-A-4480 backend HTTP-A-4480 server WEB-1 192.168.198.1:80 cookie WEB-1 check weight 1 maxconn 8000 check inter 5000 server WEB-2 192.168.198.2:80 cookie WEB-2 check weight 1 maxconn 8000 check inter 5000
Listen : (可以理解为Fronted和backend的组合体) 比如haproxy实例状态监控部分配置。
Listen是上面两者的结合体,是一种老的展现方式,现在依然可用,其配置如:
listen HTTP-4481 bind 0.0.0.0:4481 mode http option httplog retries 3 option httpclose option forwardfor balance roundrobin cookie SRV insert indirect nocache server WEB-1 192.168.1.1:4481 cookie WEB-1 check weight 1 maxconn 5000 check inter 5000 server WEB-2 192.168.1.2:4481 cookie WEB-2 check weight 1 maxconn 5000 check inter 5000
3、haproxy global部分配置说明
log global #引入global定义的日志格式 mode http #所处理的类别(7层代理http,4层代理tcp) maxconn 50000 #最大连接数 option httplog #日志类别为http日志格式 option httpclose #每次请求完毕后主动关闭http通道 option dontlognull #不记录健康检查日志信息 option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置的参数,可以从http header 中获取客户端的IP retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置 option redispatch #上述选项意思是指serverID 对应的服务器挂掉后,强制定向到其他健康的服务器, 当使用了 cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常 stats refresh 30 #设置统计页面刷新时间间隔 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 balance roundrobin #设置默认负载均衡方式,轮询方式 #balance source #设置默认负载均衡方式,类似于nginx的ip_hash #contimeout 5000 #设置连接超时时间 #clitimeout 50000 #设置客户端超时时间 #srvtimeout 50000 #设置服务器超时时间 timeout http-request 10s #默认http请求超时时间 timeout queue 1m #默认队列超时时间 timeout connect 10s #默认连接超时时间 timeout client 1m #默认客户端超时时间 timeout server 1m #默认服务器超时时间 timeout http-keep-alive 10s #默认持久连接超时时间 timeout check 10s #设置心跳检查超时时间
更详细的可参考:HAproxy指南之haproxy配置详解
4、真实服务器参数详解
server web2 192.168.2.1:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 # web1/web2:自定义服务器别名 # 192.168.2.10:80:服务器IP:Port # cookie 1/2:表示serverid # weight: 服务器权重,数字越大分配到的请求数越高 # check: 接受定时健康检查 # inter 2000: 检查频率 # rise 2: 两次检测正确认为服务器可用 # fall 3: 三次失败认为服务器不可用
5、在ubuntu中为haproxy打开日志记录
vi /etc/rsyslog.d/haproxy.conf
添加以下:
$ModLoad imudp $UDPServerRun 514 local0.* /var/log/haproxy.log
重启rsyslog和haproxy
service rsyslog restart
service haproxy restart
6、Ubuntu 12.04中默认安装的haproxy无法启动问题解决
vi /etc/default/haproxy
修改:ENABLED 的值 为 1 ,重启haproxy服务:
service haproxy start
即可。
7、在HA中配置SSL,启用HTTPS转发
方法一:
此方法只需在HAProxy中配置SSL即可,无需在后端服务器中配置SSL。
frontend https_frontend bind *:443 ssl crt /etc/ssl/certs/xxx.com_bundle.pem mode http option httpclose option forwardfor reqadd X-Forwarded-Proto:\ https default_backend web_server backend web_server mode http balance roundrobin cookie SERVERID insert indirect nocache server s1 172.16.157.9:80 check cookie s1 server s2 172.16.157.10:80 check cookie s2
方法二:
此方法无需在Haproxy中配置SSL,需要在后端服务中配置,如Nginx或Apache中配置SSL。
frontend https_frontend bind *:443 mode tcp default_backend web_server backend web_server mode tcp balance roundrobin stick-table type ip size 200k expire 30m stick on src server s1 172.16.157.9:443 check cookie s1 server s2 172.16.157.9:443 check cookie s2
注意,这种模式下mode 必须是tcp 模式
8、HTTP跳转为HTTPS
frontend unsecured bind 0.0.0.0:80 mode http redirect location https://www.xxx.com/
9、HA配置白名单,限制访问来源
在原有的配置中增加以下两行:
tcp-request content accept if { src -f /etc/haproxy/white_ip_list } tcp-request content reject
最终如:
listen API-8808 bind 0.0.0.0:8808 mode http option httplog retries 3 option httpclose option forwardfor balance roundrobin option redispatch tcp-request content accept if { src -f /etc/haproxy/white_ip_list } tcp-request content reject cookie SRV insert indirect nocache server WEB-1 192.168.1.1:8808 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000
在对应目录下放入white_ip_list
,在里面添加允许访问的IP地址,一行一个,示例:
192.168.1.100 192.168.2.0/24
10、HA配置不同域名访问不同的后端地址
frontend www bind *:80 mode http acl domain_api hdr_beg(host) -i api.open.gongzi.org acl domain_open hdr_beg(host) -i open.gongzi.org acl domain_open2 hdr_beg(host) -i open2.gongzi.org use_backend web_api if domain_api use_backend web_open if domain_open use_backend web_open2 if domain_open2 backend web_api mode http option redispatch balance roundrobin tcp-request content accept if { src -f /etc/haproxy/white_ip_list } tcp-request content reject cookie SRV insert indirect nocache server WEB-1 10.10.10.10:8808 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000 backend web_open mode http balance roundrobin server WEB-1 10.10.10.10:8808 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000 backend web_open2 mode http balance roundrobin server WEB-1 10.10.10.10:8808 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000