端口复用是指HAProxy能够在同一个IP地址和端口上同时处理多种协议或服务的流量。这是通过HAProxy的智能流量嗅探和协议识别能力实现的。
HAProxy可以自动检测传入流量的协议类型,并根据协议类型将流量路由到不同的后端服务。
配置示例:
frontend multi-protocol
bind *:443
mode tcp
tcp-request inspect-delay 5s
# 根据协议类型分流
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend https_backend if { req.ssl_hello_type 1 }
default_backend ssh_backend
对于HTTPS流量,HAProxy可以通过SNI信息进行分流:
frontend https-in
bind *:443
mode tcp
acl is_website req.ssl_sni -i example.com
acl is_api req.ssl_sni -i api.example.com
use_backend web_servers if is_website
use_backend api_servers if is_api
default_backend default_servers
对于HTTP/HTTPS流量,可以根据URL路径进行分流:
frontend http-in
bind *:80
mode http
acl is_static path_beg /static/
acl is_api path_beg /api/
use_backend static_servers if is_static
use_backend api_servers if is_api
default_backend web_servers
HTTP/HTTPS与其他协议复用:
多种HTTP服务复用:
WebSocket与HTTP复用:
inspect-delay参数:
CPU开销:
连接建立延迟:
使用HAProxy日志查看协议识别结果:
capture request header User-Agent len 128
log-format "%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"
测试不同协议连接:
# 测试HTTP
curl http://haproxy:80
# 测试HTTPS
curl https://haproxy:443
# 测试SSH
ssh user@haproxy -p 443
使用调试模式:
global
debug
端口复用是HAProxy的强大功能,合理使用可以简化网络架构,但需要根据实际业务需求和性能要求进行权衡。