13.3.3 前端与后端(frontend/backend)定义与流量模型

前端与后端(frontend/backend)定义与流量模型#

frontend 用于接收客户端连接,定义监听地址、端口、协议与入口规则;backend 用于承载真实服务,定义服务器池、负载均衡与健康检查。典型流量模型为:客户端请求进入 frontend → 依据 ACL/规则选择 backend → backend 进行负载均衡并将请求转发到 server。

原理草图(流量模型)

文章图片

frontend 关键要素
- bind:监听地址与端口(如 0.0.0.0:80*:443)。
- mode:工作模式(http/tcp),决定可用的规则与日志格式。
- default_backend:未匹配规则时的默认后端。
- acluse_backend:基于 Host、Path、Header、SNI 等进行分流。
- http-request:请求级处理(重写、添加头、阻断等)。

backend 关键要素
- mode:与 frontend 保持一致(http/tcp)。
- balance:负载均衡算法(roundrobin、leastconn、source 等)。
- server:后端实例定义(IP/端口、权重、健康检查、连接限制)。
- option httpchk/tcp-check:健康检查方式。
- cookie/stick-table:会话保持与粘性。

安装与启用(基于 Debian/Ubuntu)

# 安装
apt update && apt install -y haproxy

# 查看版本
haproxy -v

# 配置文件路径
ls -l /etc/haproxy/haproxy.cfg

# 启动并设置开机自启
systemctl enable --now haproxy

# 查看状态
systemctl status haproxy --no-pager

完整可执行示例(HTTP 按 Host 分流)

# 文件:/etc/haproxy/haproxy.cfg
global
  log /dev/log local0
  maxconn 4000
  daemon

defaults
  mode http
  log global
  timeout connect 5s
  timeout client  30s
  timeout server  30s

frontend fe_web
  bind *:80
  mode http
  acl host_app hdr(host) -i app.example.com
  acl host_api hdr(host) -i api.example.com
  use_backend be_app if host_app
  use_backend be_api if host_api
  default_backend be_app

backend be_app
  mode http
  balance roundrobin
  option httpchk GET /health
  server app1 10.0.0.11:8080 check
  server app2 10.0.0.12:8080 check

backend be_api
  mode http
  balance leastconn
  option httpchk GET /health
  server api1 10.0.0.21:9000 check
  server api2 10.0.0.22:9000 check

验证与请求示例

# 语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg

# 重新加载(不中断连接)
systemctl reload haproxy

# 模拟 Host 请求(在客户端)
curl -H "Host: app.example.com" http://<LB_IP>/
curl -H "Host: api.example.com" http://<LB_IP>/

# 预期:请求分流到对应后端,健康检查通过时响应正常

TCP 模式示例(以 MySQL 为例)

# 文件:/etc/haproxy/haproxy.cfg
frontend fe_mysql
  bind *:3306
  mode tcp
  default_backend be_mysql

backend be_mysql
  mode tcp
  balance source
  option tcp-check
  server db1 10.0.0.31:3306 check
  server db2 10.0.0.32:3306 check

排错与日志定位

# 1) 配置检查失败时的常见原因:拼写错误、缩进不影响但关键字需正确
haproxy -c -f /etc/haproxy/haproxy.cfg

# 2) 后端不可用时,查看服务状态
systemctl status haproxy --no-pager

# 3) 查看系统日志(是否有 health check 失败)
journalctl -u haproxy -n 100 --no-pager

# 4) 临时提升日志级别(需要 global/defaults 配置 log)
#   确保 rsyslog/rsyslogd 正常转发 local0

常见注意点
- frontend 与 backend 的 mode 必须匹配,否则规则或日志行为异常。
- default_backend 建议必配,避免无匹配请求被拒绝。
- ACL 顺序与规则冲突会影响路由,建议先定义再使用。
- 连接限制(maxconn)应在 frontend 与 server 两端协同设置,避免拥塞。

练习
1. 将 be_app 的算法改为 leastconn,并观察请求分配差异。
2. 为 fe_web 增加按 Path 分流规则(/apibe_api)。
3. 故意将一个后端地址改错,观察 journalctl -u haproxy 中的健康检查日志并恢复。
4. 增加 http-request set-header X-Forwarded-Proto https,验证后端收到的头部变化。