编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

HAproxy配置举例

wxchong 2025-03-11 22:11:30 开源技术 36 ℃ 0 评论

一、HAProxy 四层(TCP)代理配置详解

配置文件示例(/etc/haproxy/haproxy.cfg)

bash

复制

global
    log /dev/log local0          # 日志输出到系统日志(local0设备)
    maxconn 50000                # HAProxy进程的最大并发连接数
    user haproxy                 # 运行HAProxy的用户
    group haproxy                # 运行HAProxy的用户组
    daemon                       # 以守护进程模式运行
    stats socket /var/run/haproxy.sock mode 660 level admin  # 启用统计套接字

defaults
    mode tcp                     # 四层代理模式(基于TCP)
    timeout connect 5s           # 后端服务器连接超时时间
    timeout client 50s           # 客户端空闲超时时间
    timeout server 50s           # 后端服务器响应超时时间

frontend tcp_lb                  # 定义前端监听入口
    bind *:80                    # 监听所有IP的80端口
    default_backend tcp_servers   # 默认后端组

backend tcp_servers              # 定义后端服务器组
    balance roundrobin           # 负载均衡算法:轮询
    option tcp-check             # 启用TCP健康检查(仅发送SYN包)
    server server1 192.168.1.101:80 check inter 2000 rise 2 fall 3 maxconn 300
    server server2 192.168.1.102:80 check inter 2000 rise 2 fall 3 maxconn 300

逐行解释

  1. global 段
  2. log /dev/log local0:将日志输出到系统日志的 local0 设备。
  3. maxconn 50000:限制HAProxy进程的最大并发连接数,避免资源耗尽。
  4. user/group:以非root用户运行,提升安全性。
  5. stats socket:启用统计接口,用于动态管理(如禁用服务器)。
  6. defaults 段
  7. mode tcp:四层代理模式,直接转发TCP流量。
  8. timeout connect:与后端服务器建立连接的超时时间。
  9. timeout client/server:客户端和服务器的空闲超时时间。
  10. frontend 段
  11. bind *:80:监听所有IP的80端口。
  12. default_backend:指定默认后端服务器组。
  13. backend 段
  14. balance roundrobin:轮询算法,依次分发请求。
  15. option tcp-check:仅发送TCP SYN包进行健康检查(轻量级)。
  16. server 行详解
  17. server1:服务器名称标识。
  18. 192.168.1.101:80:后端服务器的IP和端口。
  19. check:启用健康检查。
  20. inter 2000:每2秒检查一次健康状态。
  21. rise 2:连续2次成功检查标记服务器为健康。
  22. fall 3:连续3次失败检查标记服务器为故障。
  23. maxconn 300:限制此服务器的最大并发连接数。

二、HAProxy 七层(HTTP)代理配置详解

配置文件示例(/etc/haproxy/haproxy.cfg)

bash

复制

global
    log /dev/log local0
    maxconn 50000
    user haproxy
    group haproxy
    daemon
    stats socket /var/run/haproxy.sock mode 660 level admin

defaults
    mode http                    # 七层代理模式(基于HTTP)
    timeout connect 5s
    timeout client 50s
    timeout server 50s
    option forwardfor            # 添加X-Forwarded-For头传递客户端IP
    option http-keep-alive       # 启用HTTP长连接
    option httpclose             # 在响应后关闭HTTP连接(兼容旧客户端)

frontend http_lb                 # 定义前端监听入口
    bind *:80
    acl path_static path_beg /static  # 定义ACL规则:匹配以/static开头的路径
    use_backend static_servers if path_static
    default_backend dynamic_servers

backend static_servers           # 静态资源后端组
    balance leastconn            # 负载均衡算法:最小连接数
    server static1 192.168.1.103:80 check inter 2000 rise 2 fall 3 cookie s1
    server static2 192.168.1.104:80 check inter 2000 rise 2 fall 3 cookie s2

backend dynamic_servers          # 动态内容后端组
    balance source               # 负载均衡算法:源IP哈希
    option httpchk GET /health   # 发送HTTP GET请求检查健康状态
    http-check expect status 200 # 期望HTTP 200状态码为健康
    server dynamic1 192.168.1.105:8080 check inter 3000 rise 2 fall 3 maxconn 500
    server dynamic2 192.168.1.106:8080 check inter 3000 rise 2 fall 3 maxconn 500

逐行解释

  1. defaults 段
  2. mode http:七层代理模式,解析HTTP协议。
  3. option forwardfor:在请求头中添加 X-Forwarded-For,传递客户端IP。
  4. option http-keep-alive:启用HTTP长连接,减少握手开销。
  5. option httpclose:兼容不支持长连接的客户端。
  6. frontend 段
  7. acl path_static path_beg /static:定义ACL规则,匹配以 /static 开头的路径。
  8. use_backend:根据ACL规则选择后端组。
  9. backend static_servers 段
  10. balance leastconn:最小连接数算法,优先选择负载低的服务器。
  11. cookie s1:会话保持(cookie插入标识 s1)。
  12. backend dynamic_servers 段
  13. balance source:源IP哈希算法,同一客户端的请求固定到同一服务器。
  14. option httpchk:发送HTTP GET请求到 /health 检查健康状态。
  15. http-check expect status 200:要求返回200状态码才视为健康。
  16. maxconn 500:限制服务器的最大并发连接数。

三、高并发场景下的操作系统优化

1. 修改文件描述符限制

编辑 /etc/security/limits.conf:

bash

复制

* soft nofile 1000000    # 所有用户的软限制(当前会话生效)
* hard nofile 1000000    # 所有用户的硬限制(需重启生效)
haproxy soft nofile 1000000  # HAProxy进程的软限制
haproxy hard nofile 1000000  # HAProxy进程的硬限制
  • 作用:避免因文件描述符不足导致连接被拒绝。

2. 调整内核网络参数

编辑 /etc/sysctl.conf:

bash

复制

# 增大TCP连接队列
net.core.somaxconn = 65535      # 每个端口最大监听队列长度
net.ipv4.tcp_max_syn_backlog = 65535  # 半连接队列长度

# 快速回收TIME_WAIT连接
net.ipv4.tcp_tw_reuse = 1       # 允许重用TIME_WAIT连接
net.ipv4.tcp_tw_recycle = 1     # 快速回收TIME_WAIT连接(谨慎使用)

# 增大临时端口范围
net.ipv4.ip_local_port_range = 1024 65535  # 客户端可用端口范围

# 禁用TCP慢启动(适用于长连接)
net.ipv4.tcp_slow_start_after_idle = 0

# 增大TCP缓冲区
net.core.rmem_max = 16777216    # 接收缓冲区最大值(16MB)
net.core.wmem_max = 16777216    # 发送缓冲区最大值(16MB)
net.ipv4.tcp_rmem = 4096 87380 16777216  # 接收缓冲区动态调整范围
net.ipv4.tcp_wmem = 4096 65536 16777216  # 发送缓冲区动态调整范围

# 启用TCP Fast Open(减少握手延迟)
net.ipv4.tcp_fastopen = 3       # 客户端和服务器均启用

应用配置:

bash

复制

sudo sysctl -p

3. HAProxy全局参数优化

在 global 段添加:

bash

复制

global
    tune.bufsize 32768           # 每个请求的缓冲区大小(默认16KB)
    tune.maxrewrite 2048         # 头部最大重写空间(默认1KB)
    tune.ssl.default-dh-param 2048  # SSL DH参数长度(提升安全性)
    nbthread 8                   # 工作线程数(建议等于CPU核心数)
    spread-checks 2              # 健康检查时间分散(避免同时检查)

四、验证与监控

1. 查看HAProxy状态

bash

复制

sudo systemctl status haproxy          # 检查服务状态
echo "show info" | sudo socat /var/run/haproxy.sock -  # 查看统计信息

2. 压力测试

使用 wrk 测试并发性能:

bash

复制

wrk -t12 -c5000 -d30s http://your-server-ip:80
  • -t12:12个线程。
  • -c5000:5000个并发连接。
  • -d30s:持续30秒。

五、注意事项

  1. 健康检查频率:inter 值不宜过小(如低于1秒),避免对后端服务器造成压力。
  2. TIME_WAIT回收:net.ipv4.tcp_tw_recycle 在NAT环境下可能导致问题,需谨慎启用。
  3. 线程绑定:若启用 nbthread,可绑定CPU核心提升性能:
  4. bash
  5. 复制
  6. global cpu-map 1 0 # 线程1绑定到CPU0 cpu-map 2 1 # 线程2绑定到CPU1

通过以上配置和优化,HAProxy可支持 10万级以上并发连接,适用于高流量Web应用、API网关等场景。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表