简单示例
将请求简单地代理到下一台服务器
listen http-server
bind :80
mode http
default_backend backend-default
backend backend-default
mode http
server server1 192.168.0.10:80
另外一种写法
listen http-server
bind :80
mode http
server default 192.168.0.10:80
虚拟主机
Haproxy 支持根据域名将请求转发到不同的服务器,使用后端服务器组能实现负载均衡。
listen http-server
bind :80
mode http
acl is-foo hdr_dom(host) -i foo.com
acl is-bar hdr_dom(host) -i bar.com
use_backend backend-foo if is-foo
use_backend backend-bar if is-bar
default_backend backend-no-match
backend backend-foo
mode http
server server1 192.168.0.10:80
server server2 192.168.0.11:80
backend backend-bar
mode http
server server1 192.168.0.20:80
server server2 192.168.0.20:80
backend backend-no-match
http-request deny deny_status 400
如果没有设置 default_backend
,当找不到匹配的路由时会报 503 Service Unavailable。
以上域名判断也可以简写为:
# 完整写法
acl is-foo hdr_dom(host) -i foo.com
use_backend backend-foo if is-foo
# 合并后的写法
use_backend backend-foo if { hdr_dom(host) -i foo.com }
后端地址也可以是域名和端口:
# 转发到后端的依然是前端的 host,即 foo.com
server server1 internal.foo.com:80
与 Nginx 的区别
跟 Nginx 不一样的是,HAProxy 在转发时会将来源的 host 一同转发,即当请求 foo.com 时,后端服务器的 host 也是 foo.com,而 Nginx 不会转发 host ,比如,下面是 Nginx 的配置
# 此处需要自行设置 host,才能将前端的 host 转发到后端
proxy_set_header Host foo.com;
proxy_pass http://192.168.0.2:80;
Nginx 使用域名进行转发,效果就跟 HAProxy 一样,会将 host 带到后端。
# 转发到后端的 host 是 foo.com
proxy_pass http://foo.com:80;
HTTPS 代理
HAProxy 默认支持代理 HTTPS 浏览器,实际上它通过 TCP 四层直接实现 TLS 加密内容的转发,它并不需要知道请求的内容。HAProxy 通过读取 TLS 报文中的 SIN 信息来获取所访问域名 host,这样就可以实现代理多站点。
listen https-server
bind :443
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
tcp-request content reject if WAIT_END
acl is-foo req.ssl_sni -i foo.com
acl is-foo req.ssl_sni -i www.foo.com
acl is-bar req.ssl_sni -i bar.com
acl is-bar req.ssl_sni -i www.bar.com
use_backend backend-foo if is-foo
use_backend backend-bar if is-bar
backend backend-foo
mode tcp
server server1 192.168.0.10:443
backend backend-bar
mode tcp
server server1 192.168.0.20:443
如果请求没有匹配到任何一个路由时,服务器将会直接断开 TCP 链接。
用户修改 /etc/hosts 即可使用代理,假设 HAProxy 代理服务器的 IP 是 192.168.0.2,则修改如下:
192.168.0.2 foo.com
192.168.0.2 www.foo.com
192.168.0.2 bar.com
192.168.0.2 www.bar.com