在高并发Web服务架构中,单台服务器很难承载所有流量。腾讯云CLB(负载均衡)通过将流量分发到多台后端服务器,实现系统的高可用和横向扩展。华万通信在协助多家企业完成腾讯云架构落地的过程中,积累了一些CLB的配置经验,本文将结合实践详细介绍监听器配置、健康检查、会话保持和HTTPS卸载的核心流程,并附完整代码示例。
一、CLB核心概念与架构
CLB(Cloud Load Balancer)是腾讯云提供的流量分发服务,支持四层(TCP/UDP)和七层(HTTP/HTTPS)负载均衡。典型架构如下:
客户端 → CLB负载均衡器 → 后端服务器池(CVM)
↓
健康检查/会话保持
核心优势:
- 跨可用区容灾,可用性99.95%+
- 自动剔除异常后端,自愈能力强
- 支持亿级并发连接,适合电商、游戏、金融场景
二、CLB实例创建与基础配置
2.1 创建公网CLB实例
通过腾讯云控制台或API创建:
# 使用腾讯云SDK创建CLB实例
from tencentcloud.common import credential
from tencentcloud.clb.v20180317 import clb_client, models
# 初始化认证
cred = credential.Credential("SecretId", "SecretKey")
client = clb_client.ClbClient(cred, "ap-guangzhou")
# 创建CLB请求
req = models.CreateLoadBalancerRequest()
req.LoadBalancerType = "OPEN" # 公网类型
req.LoadBalancerName = "web-clb-prod"
req.VpcId = "vpc-xxxxxx"
req.SubnetId = "subnet-xxxxxx"
req.Number = 1
# 发送请求
resp = client.CreateLoadBalancer(req)
print(f"CLB实例ID: {resp.LoadBalancerIds}")
关键参数说明:
LoadBalancerType:OPEN(公网)、INTERNAL(内网)MasterZoneId/SlaveZoneId:指定主备可用区,实现跨AZ容灾InternetAccessible:设置公网带宽上限(按固定带宽或流量)
2.2 监听器配置(HTTP/HTTPS/TCP)
监听器是CLB的流量入口,负责协议解析和转发规则匹配。
# 创建HTTP监听器
req = models.CreateListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.Ports = [80, 8080] # 监听端口
req.Protocol = "HTTP"
req.ListenerNames = ["http-80", "http-8080"]
# 健康检查配置
health_check = models.HealthCheck()
health_check.HealthSwitch = 1 # 开启健康检查
health_check.IntervalTime = 5 # 检查间隔(秒)
health_check.HealthNum = 3 # 健康阈值(连续3次成功标记为健康)
health_check.UnHealthNum = 3 # 不健康阈值
health_check.HttpCode = 2 # HTTP状态码2xx/3xx为健康
health_check.HttpCheckPath = "/health" # 健康检查路径
req.HealthCheck = health_check
resp = client.CreateListener(req)
三、后端服务器绑定与健康检查实战
3.1 注册后端服务器
# 绑定CVM到CLB后端
req = models.RegisterTargetsRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"
# 绑定两台后端服务器,权重分别为60和40
targets = [
models.Target(PrivateIpAddress="10.0.1.10", Port=8080, Weight=60),
models.Target(PrivateIpAddress="10.0.1.11", Port=8080, Weight=40)
]
req.Targets = targets
resp = client.RegisterTargets(req)
print("后端服务器绑定成功")
权重分配策略:
- Weight=0:服务器不接收新连接,适合下线维护场景
- Weight越高,分配流量比例越大(支持0-100)
3.2 健康检查深度配置
健康检查是CLB自动剔除异常节点的核心机制。
# 更新健康检查配置
req = models.ModifyTargetHealthConfigRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"
# 七层(HTTP)健康检查高级配置
health_config = {
"HealthSwitch": 1,
"IntervalTime": 5,
"HealthNum": 3,
"UnHealthNum": 3,
"HttpCode": 2, # 2:2xx/3xx;4:仅4xx
"HttpCheckPath": "/api/health",
"HttpCheckDomain": "www.example.com", # 检查域名
"HttpCheckMethod": "HEAD", # HEAD(轻量)/GET(完整)
}
req.HealthCheck = health_config
resp = client.ModifyTargetHealthConfig(req)
常见健康检查失败原因:
- 后端服务端口未监听 → 检查
netstat -tlnp - 安全组未放通CLB IP → 添加CLB VIP到安全组入站规则
- 健康检查路径返回非2xx → 检查应用
/health端点实现
四、HTTPS卸载与证书管理
4.1 为什么需要HTTPS卸载?
传统架构中,每台后端服务器都需要配置SSL证书并处理TLS握手,消耗大量CPU资源。CLB的HTTPS卸载将证书配置和加解密集中在负载均衡器上,后端服务器只需处理HTTP流量,性能提升30%+。
客户端(HTTPS)→ CLB(TLS终止)→ 后端服务器(HTTP)
↑
证书只配置在这里
4.2 证书上传与绑定
# 上传SSL证书到腾讯云SSL证书服务
from tencentcloud.ssl.v20191205 import ssl_client, models as ssl_models
ssl_client = ssl_client.SslClient(cred, "ap-guangzhou")
req = ssl_models.UploadCertificateRequest()
req.CertificatePublicKey = """-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJA......(证书内容)
-----END CERTIFICATE-----"""
req.CertificatePrivateKey = """-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQ......(私钥内容)
-----END PRIVATE KEY-----"""
req.Alias = "example-com-2026"
resp = ssl_client.UploadCertificate(req)
cert_id = resp.CertificateId # 例如:te-xxxxxx
在CLB HTTPS监听器中绑定证书:
# 创建HTTPS监听器并绑定证书
req = models.CreateListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.Ports = [443]
req.Protocol = "HTTPS"
req.Certificate = models.CertificateOutput(CertificateId=cert_id)
# SNI配置(支持同一IP绑定多个域名证书)
req.SniSwitch = 1 # 开启SNI
req.Rules = [
models.Rule(Path="/", Domain="www.example.com", CertificateId=cert_id),
models.Rule(Path="/", Domain="api.example.com", CertificateId=cert_id_api)
]
resp = client.CreateListener(req)
五、会话保持与转发规则
5.1 会话保持配置
对于需要"同一客户端请求转发到同一后端"的场景(如未实现共享Session的Web应用),需要开启会话保持。
# 开启会话保持(基于Cookie)
req = models.ModifyListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"
# 七层会话保持配置
req.SessionExpireTime = 3600 # 会话保持时间(秒),0表示关闭
req.CookieName = "CLB_SESSION" # 插入式Cookie名称
req.CookieSwitch = 1 # 开启基于Cookie的会话保持
resp = client.ModifyListener(req)
四层(TCP)会话保持:
- 基于源IP绑定,同一客户端IP固定转发到同一后端
- 配置
Scheduler为IP_Hash
5.2 转发规则与URL路径匹配
# 配置URL路径转发规则(七层)
req = models.CreateRuleRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"
rules = [
# 路径1:/api/* 转发到API服务器组
models.Rule(
Path="/api/*",
Targets=[
models.Target(PrivateIpAddress="10.0.2.10", Port=8080, Weight=100)
]
),
# 路径2:/static/* 转发到静态资源服务器
models.Rule(
Path="/static/*",
Targets=[
models.Target(PrivateIpAddress="10.0.3.10", Port=80, Weight=100)
]
)
]
req.Rules = rules
resp = client.CreateRule(req)
六、CLB监控告警与日志分析
6.1 核心监控指标
通过腾讯云监控(Cloud Monitor)获取CLB运行数据:
# 查询CLB监控数据
from tencentcloud.monitor.v20180724 import monitor_client, models
monitor_client = monitor_client.MonitorClient(cred, "ap-guangzhou")
req = models.GetMonitorDataRequest()
req.Namespace = "QCE/LOADBALANCE"
req.MetricNames = ["ConNum", "NewConn", "InPkg", "OutPkg"] # 连接数、新建连接、入包量、出包量
req.Period = 60 # 60秒粒度
req.StartTime = "2026-05-19T10:00:00+08:00"
req.EndTime = "2026-05-19T11:00:00+08:00"
req.Instances = [{"Dimensions": [{"Name": "loadBalancerId", "Value": "lb-xxxxxx"}]}]
resp = monitor_client.GetMonitorData(req)
关键告警阈值建议:
NewConn > 10000:新建连接数过高,需扩容后端ConNum > 100000:并发连接数告警5xx状态码占比 > 5%:后端异常,检查健康检查
6.2 访问日志分析
CLB支持将访问日志实时投递到COS(对象存储),用于后续分析。
# 配置CLB访问日志投递到COS
req = models.ModifyLoadBalancerAttributesRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.LoadBalancerPassToTarget = 1 # 开启日志投递
req.LogSetId = "xxxxxx" # CLS日志集ID(或使用COS)
req.LogTopicId = "xxxxxx"
resp = client.ModifyLoadBalancerAttributes(req)
日志字段说明(部分):
request_time:请求处理耗时(毫秒)upstream_addr:后端服务器地址status:HTTP响应状态码request_length/bytes_sent:请求/响应大小
七、最佳实践与常见问题
7.1 跨可用区高可用配置
在华万通信服务企业的实际经验中,跨可用区配置是防止单可用区故障的关键。很多企业在初期为节省成本只选单可用区,一旦该区网络抖动,整个服务不可用。
# 在不同可用区创建CLB实例(主备)
# 主实例(广州三区)
req_master = models.CreateLoadBalancerRequest()
req_master.MasterZoneId = "ap-guangzhou-3"
req_master.SlaveZoneId = "ap-guangzhou-4" # 备可用区
# 通过DNS轮询或GSLB实现跨地域容灾
7.2 安全加固建议
-
限制CLB管理API访问IP:通过CAM策略限定仅公司出口IP可调用CLB API
-
后端服务器安全组:仅放通CLB VIP段(通过API动态获取)
-
开启CLB访问日志:满足等保合规要求
获取CLB VIP地址段(用于安全组配置)
req = models.DescribeLoadBalancersRequest()
req.LoadBalancerIds = ["lb-xxxxxx"]
resp = client.DescribeLoadBalancers(req)VIP地址:resp.LoadBalancerSet[0].LoadBalancerVips
安全组入站规则仅放通该VIP
八、总结
腾讯云CLB作为高并发Web服务的流量入口,核心价值在于:
- 高可用:自动健康检查+跨AZ容灾,避免单点故障
- 高性能:HTTPS卸载降低后端CPU消耗,支持亿级并发
- 灵活转发:基于URL路径、域名、Header的高级路由规则
- 易运维:完善的监控告警+访问日志,故障排查高效
对于日均QPS超过5000的中大型企业,CLB几乎是标配。结合自动扩缩容(AS)和容器服务(TKE),可以构建完全弹性的Web服务架构。
在实际落地过程中,CLB的配置方案需要根据业务架构、流量模型和安全合规要求做针对性调整。华万通信在协助制造、零售、金融等行业客户完成腾讯云架构规划中,积累了大量CLB选型与最佳实践,欢迎有相关需求的团队交流探讨。
参考官方文档: