参考来自三、Haproxy四层与七层负载均衡 – Egon林海峰 (egonlin.com)
一、haproxy简介
四层负载均衡
# 1、mode tcp 表示这是一个四层 TCP 负载均衡
# 2、frontend ft_web 定义了监听的端口
# 3、backend bk_web 定义了后端服务器列表,每个 server 行定义一个后端服务器,
check 选项表示对服务器进行健康检查
七层负载均衡
# 1、mode http:
这用于指示 HAProxy 在处理请求时要操作到应用层(也就是 HTTP 层面)。
这使得可以对 HTTP 头部、URL 、Cookie 等进行处理和使用。
# 2、option httplog:
这设置 HAProxy 生成的日志包含 HTTP 信息,如请求的方法、URI 等。
# 3、option forwardfor:
这用于插入 X-Forwarded-For 头部信息,这是一个 HTTP 头部信息,用来记录原始客户端的 IP 地址。
# 4、http-request set-header and http-request add-header:
这用于插入或修改 HTTP 请求头信息。
七层负载均衡里加入的配置:optionhttpchkHEAD/HTTP/1.1\rinHost:localhost
option httpchk 是 HAProxy 中用于设置 HTTP 健康检查的选项。
如果你不显式设置这个选项,HAProxy 默认会做 TCP 连接检查。
如果你只需要 TCP 层面的检查,确实可以不配置这一行。
但如果需要更精细的 HTTP 层面的检查,则需要添加这个选项。
配置语法
option httpchk <method> <uri> <version>
option httpchk <method> <uri> <version>\r\n<header-name>: <header-value> …
option httpchk HEAD / HTTP/1.1\r\nHost:localhost 配置的含义是:
1、option httpchk:启用HTTP型的健康检查。
2、HEAD:这个指定了具体使用的HTTP方法是 HEAD。使用HEAD请求可以减少健康检查产生的数据传输量,因为它不获取实际的响应体
3、/:这是要访问以检查服务器健康状态的URI路径,这里是根路径
4、HTTP/1.1:这指定了HTTP协议的版本是1.1。
5、\r\nHost:localhost:这是一个额外的HTTP头部,指定了请求的Host头信息。\r\n 是回车和换行的转义字符,用来分隔HTTP头部。在这里,Host头被设置为 localhost,代表请求将被发送到配置为localhost 的服务器。
注意:
# 1、Host字段值不应设置为localhost,而应该设置为你的域名
# 2、如果请求失败或者超时,那么 HAProxy 会将此服务器标记为不健康, 流量不再会被转发至此服务器,直到下一个正常的健康检查。
其他设置示例
option httpchk HEAD /index.html HTTP/1.1 #更多健康检查请问GPT
二、haproxy实现七层负载均衡
初始化环境,新建web服务器
参考这个nginx教程初始化环境+新建三台web服务器
https://www.yuque.com/u39220520/rtqkia/tysnfe69crokmikf
部署配置7层负载均衡
安装haproxy
yum -y install haproxy
cp -rf /etc/haproxy/haproxy.cfg{,.bak}
sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
配置配置文件
global # 全局参数
log 127.0.0.1 local2 info # 日志服务器
pidfile /var/run/haproxy.pid
maxconn 4000 #最大连接数(优先级低于后续的maxconn设置)
user haproxy
group haproxy
daemon #守护进程方式后台运行
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults # 用于为其他配置段提供默认参数
mode http #工作模式是http (tcp 是 4 层,http是 7 层)
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000 #优先级中
timeout connect 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
timeout client 50000 #客户端超时
timeout server 50000 #后端服务器超时
listen stats # haproxy自带的状态监控服务
mode http
bind *:81
stats enable
stats uri /haproxy #使用浏览器访问 http://192.168.71.12:81/haproxy,可以看到服务器状态
stats auth egonlin:666 #用户认证
monitor-uri /monitoruri
frontend web # haproxy作为负载均衡的配置
mode http # 七层
bind *:80 # haproxy作为负载均衡对外暴漏的ip和端口
option httplog #日志类别 http 日志格式
acl xxx url_reg -i \.html$ #acl相当于nginx的location。url_reg定义自己的正则匹配url,-i忽略大小写,下同
acl xxx url_reg -i \/$ #针对访问末尾不加任何路径的情况例如http://xx.xx.xx
#acl xxx path_beg -i /static /images /javascript /stylesheets # path_beg匹配路径开头
#acl xxx path_end -i .jpg .gif .png .css .js # path_end匹配路径结尾
acl yyy path_end -i .css .js # path_end匹配路径结尾
use_backend static1 if xxx #如果满足acl xxx规则,则代理给后端服务器组static
use_backend static2 if yyy #如果满足acl yyy规则,则代理给httpservers组
default_backend httpservers #上述规则都匹配失败后默认的代理的组
backend static1
balance roundrobin
server static1_a 192.168.71.14:8080 check
backend static2
balance roundrobin
server static2_a 192.168.71.15:8080 check
backend httpservers
balance roundrobin
server myhttp1 192.168.71.16:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
#server myhttp2 192.168.71.17:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
# inter表示健康检查的间隔,单位为毫秒 可以用1s等,
# fall代表健康检查失败2回后放弃检查。rise代表连续健康检查成功2此后将认为服务器可用。
# 默认的,haproxy认为服务时永远可用的,除非加上check让haproxy确认服务是否真的可用。
启动服务
systemctl enable haproxy
systemctl start haproxy
systemctl status haproxy
netstat -tunlp |grep haproxy
三、haproxy实现四层负载均衡
global
log 127.0.0.1 local0 notice
maxconn 2000
user haproxy
group haproxy
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend ft_web
bind *:80
default_backend bk_web
backend bk_web
balance roundrobin
server web1 192.168.71.14:8080 check
server web1 192.168.71.15:8080 check
server web1 192.168.71.16:8080 check
四、七层透传真实客户端IP
关键配置项是
option forwardfor
这一行配置你可以放到两种地方
1、如果加到frontend中那就是对所有被代理的server都有效
2、如果只是加到某个backend下,那就是只对这个backend有效
global # 全局参数
log 127.0.0.1 local2 info # 日志服务器
pidfile /var/run/haproxy.pid
maxconn 4000 #最大连接数(优先级低于后续的maxconn设置)
user haproxy
group haproxy
daemon #守护进程方式后台运行
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults # 用于为其他配置段提供默认参数
mode http #工作模式是http (tcp 是 4 层,http是 7 层)
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000 #优先级中
timeout connect 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
timeout client 50000 #客户端超时
timeout server 50000 #后端服务器超时
listen stats # haproxy自带的状态监控服务
mode http
bind *:81
stats enable
stats uri /haproxy #使用浏览器访问 http://192.168.71.12:81/haproxy,可以看到服务器状态
stats auth egonlin:666 #用户认证
monitor-uri /monitoruri
frontend web # haproxy作为负载均衡的配置
option forwardfor # ---------------------------> 加到这里就是对所有被代理的都有效
mode http # 七层
bind *:80 # haproxy作为负载均衡对外暴漏的ip和端口
option httplog #日志类别 http 日志格式
acl xxx url_reg -i \.html$ #acl相当于nginx的location。url_reg定义自己的正则匹配url,-i忽略大小写,下同
acl xxx url_reg -i \/$ #针对访问末尾不加任何路径的情况例如http://xx.xx.xx
#acl xxx path_beg -i /static /images /javascript /stylesheets # path_beg匹配路径开头
#acl xxx path_end -i .jpg .gif .png .css .js # path_end匹配路径结尾
acl yyy path_end -i .css .js # path_end匹配路径结尾
use_backend static1 if xxx #如果满足acl xxx规则,则代理给后端服务器组static
use_backend static2 if yyy #如果满足acl yyy规则,则代理给httpservers组
default_backend httpservers #上述规则都匹配失败后默认的代理的组
backend static1
#option forwardfor # ----------------------------> 加到这里就针对该backend有效
#http-request set-header X-Forwarded-Port %{dst_port} # 这一行不是必须的
balance roundrobin
server static1_a 192.168.71.112:8080 check
backend static2
balance roundrobin
server static2_a 192.168.71.113:8080 check
backend httpservers
balance roundrobin
server myhttp1 192.168.71.114:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
#server myhttp2 192.168.71.17:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
后端设置nginx日志
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 末尾加一个$http_x_forwarded_for
五、四层代理七层穿透
四层haproxy配置
frontend ft_web
bind *:8081
default_backend bk_web
backend bk_web
balance roundrobin
server web1 192.168.71.112:80 send-proxy # 将原始客户端IP透传到后端服务器
#server web2 192.168.71.113:80 send-proxy
七层haproxy配置
frontend web # haproxy作为负载均衡的配置
option forwardfor # ---------------------------> 加到这里就是对所有被代理的都有效
bind *:80 accept-proxy # 启用Proxy Protocol
nginx配置(web服务器)
日志中默认就加了$http_x_forwarded_for
在http的server默认中添加以下配置来设置如何从X-Forwarded-For头部取得真实IP地址(实测发行不配置也可以)
set_real_ip_from 0.0.0.0/24; # HAProxy的IP地址范围
real_ip_header X-Forwarded-For;
a