HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,"X-Forwarded-For"首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。
需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。
下面是一个例子。
frontend www
mode http
option forwardfor except 127.0.0.1
在haproxy的配置文件中默认就有此选项
在nginx的主配置文件中也默认有此选项
Haproxy实现会话保持 一、源地址hash(用户IP识别)Haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)。
缺点:当后端一台服务器挂了以后会造成部分session丢失
示例:
backend SOURCE_srv
mode http
balance source
server app-node1 10.31.1.179:80 check port 80 inter 3000 rise 3 fall 3
server app-node2 10.31.1.191:80 check port 80 inter 3000 rise 3 fall 3
server app-node3 10.31.0.35:80 check port 80 inter 3000 rise 3 fall 3
二、cookie 识别haproxy 将WEB服务端返回给客户端的cookie中插入haproxy中特定的字符串(或添加前缀)在后端的服
务器COOKIE ID。
backend COOKIE_srv
mode http
cookie SERVERID insert indirect nocache
server app-node1 10.31.1.179:80 check port 80 cookie a inter 3000 rise 3 fall 3
server app-node2 10.31.1.191:80 check port 80 cookie b inter 3000 rise 3 fall 3
server app-node3 10.31.0.251:80 check port 80 cookie c inter 3000 rise 3 fall 3
在LB1上配置好HAProxy后,LB1将接受用户的所有请求。如果一个用户请求不包含任何cookie,那这个请求将被HAProxy转发到一台可用的WEB服务器。可能是webA,webB,webC。然后HAProxy将把处理这个请求的WEB服务器的cookie值插入到请求响应中。如SERVERID=A。当这个客户端再次访问并在HTTP请求头中带有SERVERID=A,HAProxy将会把它的请求直接转发给webA处理。在请求到达webA之前,cookie将被移除,webA将不会看到这个cookie。如果webA不可用,对应的请求将被转发到其他可用的WEB服务器,相应的cookie值也将被重新设置。
Haproxy性能优化参数option redispatch:当server对应的服务器挂掉后,强制定向到其他健康的服务器
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
retries 3 : //3次连接失败就认为服务器不可用,主要通过后面的check检查
maxconn 30000 : //代理时所能接受的最大并发连接数,应该要比后端主机的并发总和要小
好了,今天的内容就到这里,下期再见。
HAproxy的基本配置(负载均衡+日志独立+动静分离+读写分离)
CentOS 7下Keepalived + HAProxy 搭建配置详解
Ubuntu 16.04 下安装HAProxy 1.5.11 做tcp负载均衡