如何配置HAProxy集群代理内部ALB后可外部访问的指定微服务?
解决HAProxy集群代理内部ALB特定微服务的方案
嘿,这个需求很典型!既然你已经能通过规则捕获到主机名包含microservice的请求,接下来的核心就是把这些请求代理到内部ALB,同时保证HAProxy集群的可用性。咱们一步步来:
一、HAProxy单实例基础代理配置
先从单节点的HAProxy配置入手,搞定核心转发逻辑,再扩展到集群。
1. 全局与默认配置
先写好全局和defaults段,确保基础的性能和健康检查:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http
2. 前端捕获请求并转发
在frontend段里,你已经有了捕获主机名的ACL,只需要把匹配到的请求转发到对应的backend:
frontend external_frontend bind *:80 # 或者你对外暴露的端口,比如443如果用HTTPS # 你的ACL规则:匹配主机名包含microservice的请求 acl host_microservice hdr(host) -i -m substr microservice # 把匹配到的请求转发到内部ALB的backend use_backend internal_alb_backend if host_microservice # 其他不匹配的请求可以返回403或者转发到其他backend,根据你的需求 default_backend default_deny backend default_deny mode http http-request deny
3. 后端代理到内部ALB
这里配置内部ALB的地址,加上健康检查确保转发的可用性:
backend internal_alb_backend mode http # 替换成你的内部ALB的私有IP或域名 server internal_alb 192.168.1.100:80 check inter 2000 rise 2 fall 3 # 如果内部ALB是HTTPS的,改成对应的端口,并且可以加上ssl选项 # server internal_alb internal-alb.example.com:443 check inter 2000 ssl verify none
二、HAProxy集群高可用配置
单节点的HAProxy有单点故障风险,所以咱们需要把HAProxy做成集群,常用的方案是Keepalived+VIP漂移:
- 在两台HAProxy服务器上安装Keepalived
- 配置Keepalived的
/etc/keepalived/keepalived.conf:- 主节点配置:
vrrp_instance VI_1 { state MASTER interface eth0 # 替换成你的网卡名称 virtual_router_id 51 priority 100 # 主节点优先级高于备节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 203.0.113.10/24 # 对外暴露的虚拟IP,用户访问这个IP } } - 备节点配置:
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 203.0.113.10/24 } }
- 主节点配置:
- 启动Keepalived后,VIP会自动漂移到健康的HAProxy节点,保证服务不中断。
三、额外优化建议
- HTTPS支持:如果外部用户需要HTTPS访问,在HAProxy的frontend绑定443端口,并配置证书:
frontend external_frontend bind *:443 ssl crt /etc/haproxy/certs/your-cert.pem # 其他ACL和转发规则不变 - 会话保持:如果你的微服务需要会话保持,可以在backend里添加
cookie配置:backend internal_alb_backend cookie SRV insert indirect nocache server internal_alb 192.168.1.100:80 check inter 2000 cookie alb1 - 监控统计:开启HAProxy的stats页面,方便监控集群状态:
listen stats bind *:8080 stats enable stats uri /haproxy-stats stats auth admin:yourpassword # 设置用户名密码
这样配置下来,外部用户访问VIP(或绑定的域名)时,只要主机名包含microservice,请求就会被HAProxy转发到内部ALB,同时集群保证了服务的高可用性。
内容的提问来源于stack exchange,提问作者SnIpY
相关产品推荐
相关产品推荐

