1. 项目概述:为什么选择CLB做HTTPS转发?
最近在帮一个做电商的朋友处理线上服务迁移,他们原来的架构是单台服务器跑Nginx,证书和业务都混在一起。随着促销活动流量上来,不仅服务器扛不住,每次更新SSL证书还得半夜操作,生怕影响线上交易。他问我有没有更稳当的方案,我第一个想到的就是腾讯云的CLB(Cloud Load Balancer)。这玩意儿本质上是个云端的负载均衡器,但很多人只拿它做简单的HTTP流量分发,其实它在HTTPS卸载和转发上才是真正的“利器”。
简单来说,这个项目的核心就是:把原来由后端服务器(比如Nginx、Apache)承担的HTTPS解密、证书管理的活儿,全部“卸载”到腾讯云CLB上。让CLB对外以HTTPS协议提供服务,接收加密请求,解密后,再以HTTP或HTTPS协议将请求转发到后端的多台业务服务器。这样做,后端服务器就轻松了,只需要处理纯文本的HTTP业务逻辑,性能压力骤减,安全性、扩展性和运维复杂度都得到了质的提升。特别适合那些业务快速增长、对安全性和高可用有要求,但运维人力又跟不上的团队。
2. 核心需求与方案选型解析
2.1 传统架构的痛点与CLB的解决方案
在没上负载均衡之前,常见的架构是“域名解析到服务器IP -> 服务器Nginx配置SSL证书 -> 反向代理到本地应用”。这个模式有几个绕不开的坑:
- 证书管理地狱:每台服务器都要独立安装、更新证书。证书快过期时,得一台台登录操作,漏了一台就是重大故障。Let‘s Encrypt虽然能自动续期,但在多台机器上协调更新也是麻烦事。
- 单点故障与性能瓶颈:所有流量压在一台机器上,这台机器挂了,整个服务就瘫了。升级配置成本高,且总有上限。
- 后端服务器资源浪费:SSL/TLS握手和解密是CPU密集型操作,非常消耗计算资源。宝贵的业务服务器CPU周期,大量浪费在了加解密上。
- 安全策略分散:WAF(Web应用防火墙)、CC防护等安全策略,如果每台服务器单独配置,不仅工作量大,还容易产生不一致,留下安全隐患。
腾讯云CLB的HTTPS转发方案,正是针对这些痛点设计的。它的核心思路是“集中化管理,分布式处理”:
- 集中化管理:SSL证书只需在CLB控制台配置一次,CLB实例会负责证书的存储、部署和续期提醒(如果使用腾讯云SSL证书服务,甚至支持自动续期)。所有的安全策略(如基础防护、WAF)也可以在CLB层面统一配置。
- 分布式处理:CLB作为一个高可用的集群服务,自动将流量分发到后端的多台服务器(CVM、容器等)。SSL解密工作在CLB的专用硬件或优化过的软件模块中完成,解放了后端服务器的CPU。
2.2 CLB HTTPS转发的两种模式与选择
这是最关键的技术决策点,直接决定了后端服务器的配置和整体架构。CLB主要提供两种监听器协议来对接后端:
模式一:HTTPS监听器 -> HTTP后端(推荐给大多数Web应用)这是最常用、也最经典的“SSL卸载”模式。CLB的监听器配置为HTTPS(端口443),并绑定SSL证书。后端服务器组协议端口配置为HTTP(通常是80端口)。
- 工作流程:用户
https://example.com-> CLB(解密,得到明文HTTP请求)-> 后端服务器(http://后端IP:80)。 - 优点:
- 后端极简:后端服务器无需配置任何SSL证书,只需运行一个普通的HTTP服务(如Nginx、Apache、Tomcat)。配置简单,出错率低。
- 性能最佳:后端处理纯文本HTTP,性能最高。
- 便于排查:后端服务器日志里看到的是真实的客户端IP(CLB会通过
X-Forwarded-For等头部传递),且是HTTP请求,调试方便。
- 注意事项:需确保后端服务监听的是HTTP端口。如果后端是Nginx,原本的SSL配置需要移除或注释掉。
模式二:HTTPS监听器 -> HTTPS后端(全链路加密)这种模式下,CLB和后端服务器之间仍然保持HTTPS加密连接。
- 工作流程:用户
https://example.com-> CLB(解密)-> CLB(使用新的证书或自签证书,重新加密)-> 后端服务器(https://后端IP:443,需解密)。 - 适用场景:
- 合规性要求:某些金融、政务行业要求数据在传输链路的每一跳都必须加密。
- 不安全的内网:后端服务器不在腾讯云VPC内,或者跨越了不可信任的网络区域。
- 缺点:
- 配置复杂:后端服务器仍需配置和管理SSL证书(可以是自签证书或购买的另一套证书)。
- 性能损耗:在CLB和后端之间多了一次完整的TLS加解密过程,增加了延迟和CPU开销。
- 运维负担:需要管理两套证书(CLB的和后端的)。
我的选择建议:对于99%的Web应用、API服务,强烈推荐使用模式一(HTTPS->HTTP)。腾讯云VPC内部网络本身是隔离、安全的,在此环境下进行明文HTTP传输风险极低。用复杂度换来的那点安全性提升,远不如它带来的运维成本和性能损耗。把省下的精力,用在加固后端应用本身的安全上,性价比更高。
2.3 与自建Nginx负载均衡的对比
很多技术团队熟悉Nginx,可能会考虑在云服务器上自建Nginx集群做负载均衡和SSL卸载。这里做个简单对比:
| 特性 | 腾讯云CLB | 自建Nginx负载均衡 |
|---|---|---|
| 高可用性 | 内置。CLB实例本身就是多可用区部署,无需自行搭建主备。 | 需自行实现。需要至少两台ECS,通过Keepalived等工具实现VIP漂移,有脑裂风险。 |
| 扩展性 | 弹性伸缩。带宽、性能可随时升级,后端可无缝挂载/移除服务器。 | 手动扩展。需要手动增加Nginx节点并更新上游配置,过程繁琐。 |
| SSL卸载 | 专用硬件/优化。性能高,支持国密算法。 | 依赖服务器CPU。消耗宝贵的业务计算资源。 |
| 证书管理 | 控制台统一管理,支持自动部署、续期提醒。 | 每台Nginx单独管理,易出错。 |
| 成本 | 按需计费(实例费+流量费)。有专业运维成本。 | 主要ECS成本。但需要投入大量开发和运维人力。 |
| 运维复杂度 | 低。图形化控制台,API丰富,监控告警完善。 | 高。需要专业运维人员配置、监控、排障、打补丁。 |
结论:除非有极强的定制化需求(如修改Nginx内核模块),或者对成本极度敏感且技术运维能力极强,否则对于生产环境,直接使用云厂商的负载均衡服务(如CLB)是更可靠、更经济的选择。它让你能聚焦业务开发,而不是基础设施的稳定性。
3. 实操详解:从零配置CLB HTTPS转发
光说不练假把式,下面我们一步步手把手配置一个HTTPS监听器,将流量转发到后端的HTTP服务。假设我们已有以下资源:
- 一个备案好的域名:
www.yourdomain.com - 该域名的SSL证书(可以是腾讯云申请、其他平台购买或自签的,支持PEM格式)
- 至少两台运行了Web服务(如Nginx、Apache)的腾讯云CVM,位于同一个VPC内。
3.1 第一步:准备后端服务器(CVM)
这是基础,确保你的业务能在HTTP协议下正常访问。
- 安装并配置Web服务:以最常用的Nginx为例。
# 在每台后端CVM上执行 # 1. 安装Nginx (以CentOS 7为例) yum install -y nginx # 2. 编写一个简单的测试配置文件,监听80端口 cat > /etc/nginx/conf.d/test.conf << EOF server { listen 80; server_name _; # 这里可以写具体域名,但CLB健康检查会通过IP访问,所以用_或localhost更稳妥 location / { root /usr/share/nginx/html; index index.html index.htm; # 一个关键配置:获取真实客户端IP proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header Host \$http_host; } } EOF # 3. 创建测试页面 echo "Hello from Server $(hostname)" > /usr/share/nginx/html/index.html # 4. 启动Nginx并设置开机自启 systemctl start nginx systemctl enable nginx # 5. 检查80端口是否监听 netstat -tlnp | grep :80 - 配置安全组:确保后端CVM的安全组入站规则允许来自CLB所在安全组或CLB的VIP地址段(可在腾讯云CLB文档中查询,通常是
9.0.0.0/8等)对80端口的访问。这是最容易忽略导致健康检查失败的一步!- 最佳实践:创建一个专门的安全组(如
sg-backend),放行来自CLB安全组的80端口流量,然后将所有后端CVM绑定这个安全组。
- 最佳实践:创建一个专门的安全组(如
3.2 第二步:创建与配置CLB实例
- 进入腾讯云控制台,找到“负载均衡”产品。
- 创建负载均衡实例:
- 实例类型:选择“应用型CLB”(七层负载均衡,支持HTTP/HTTPS)。
- 网络属性:选择“公网”或“内网”。对外服务选“公网”。
- 地域/可用区:选择与你的后端CVM相同的地域。建议选择“多可用区部署”以保障高可用。
- 网络:选择你的CVM所在的VPC和子网。
- 其他如带宽计费模式,根据业务流量预估选择“按带宽计费”或“按流量计费”。
- 配置HTTPS监听器:
- 在CLB实例详情页,点击“监听器管理” -> “新建监听器”。
- 协议端口:选择
HTTPS:443。 - SSL解析方式:选择“单向认证”(绝大多数场景)。如果是金融等强安全场景,可考虑“双向认证”(mTLS),但客户端也需要安装证书,适用于API接口等。
- 服务器证书:点击“选择已有证书”或“新建证书”。
- 新建证书:如果你有证书文件(PEM格式的证书内容和私钥),可以在此粘贴上传。私钥密码如果证书有则填写,没有则留空。
- 选择已有证书:如果你在腾讯云SSL证书管理平台购买了证书或上传了证书,可以直接关联。
- 启用SNI:如果你的一个CLB的443端口需要服务多个域名(每个域名证书不同),务必勾选“启用SNI(Server Name Indication)”。这是现代TLS的标配,能让服务器在握手初期就知道客户端请求的是哪个域名,从而返回正确的证书。
- 配置转发规则(可选但推荐):
- 在监听器下,可以创建“域名+URL”的转发规则,实现更精细的路由。例如,将
/api/*的请求转发到一组后端服务器,将/static/*转发到另一组。这对于微服务架构非常有用。 - 这里我们先配置一个默认的域名规则:点击“新建转发规则”,域名填写
www.yourdomain.com,URL路径默认为/。
- 在监听器下,可以创建“域名+URL”的转发规则,实现更精细的路由。例如,将
3.3 第三步:绑定后端服务器与健康检查
这是让流量流动起来的关键。
- 绑定后端服务:
- 在监听器或转发规则配置中,进入“绑定后端服务”环节。
- 选择后端协议端口为
HTTP:80。这就是我们选择的“HTTPS->HTTP”模式。 - 从左侧的服务器列表中选择你准备好的那两台CVM,添加到右侧,并设置端口为
80。你可以为每台服务器设置不同的权重(如性能好的机器权重高)。
- 配置健康检查:
- 检查协议:
HTTP(因为后端是HTTP服务)。 - 检查端口:
80。 - 检查路径:填写一个你应用中的健康检查接口或静态页面路径,例如
/health或/index.html。确保这个路径在后端服务器上能返回2xx或3xx状态码。 - 高级设置:
- 响应超时:2-5秒,根据网络状况调整。
- 健康阈值:2-3次。连续成功这么多次才认为健康。
- 不健康阈值:3-5次。连续失败这么多次才认为不健康。
- 健康检查的作用:CLB会定期向后端服务器的这个路径发送HTTP请求。如果某台服务器连续检查失败,CLB会自动将其从转发列表中剔除,直到它恢复健康。这是保障服务高可用的核心机制。
- 检查协议:
实操心得:健康检查的坑我曾遇到过CLB健康检查全部失败,但直接访问后端服务器IP却正常的情况。排查后发现是后端服务器防火墙(如firewalld或iptables)只对CLB的VIP网段开放了80端口,但健康检查的源IP并非VIP,而是CLB服务节点的真实IP(属于另一个网段)。解决方案:要么在后端服务器安全组/防火墙中,放行CLB健康检查的源IP网段(需查询腾讯云文档),要么将健康检查协议改为TCP,只检查端口连通性(但这样无法检测应用层状态)。
3.4 第四步:域名解析与最终测试
- 域名解析:到你的域名DNS管理后台(可能在腾讯云DNSPod或其他注册商处),为域名
www.yourdomain.com添加一条A记录,记录值填写你刚创建的公网CLB实例的VIP(公网IP地址)。TTL可以设短一点,如300秒,便于变更。 - 等待生效:DNS解析需要时间全球生效,通常几分钟到半小时。
- 全面测试:
- 浏览器访问:打开浏览器,访问
https://www.yourdomain.com。你应该能看到来自某台后端服务器的“Hello from Server xxx”页面,并且浏览器地址栏显示安全锁标志。 - 检查证书:点击浏览器地址栏的锁图标,查看证书信息,确认是你上传的证书,且证书链完整。
- 负载测试:快速刷新页面多次,观察是否有时会显示另一台服务器的hostname(如果页面内容一致,可以在后端服务器的访问日志中查看,请求是否被均匀分配)。
- 故障模拟:手动停止其中一台后端服务器的Nginx服务(
systemctl stop nginx)。等待CLB健康检查间隔(如30秒)后,再次访问网站。流量应全部被导向另一台健康的服务器,用户无感知。重启停掉的服务,它应该会自动恢复加入集群。
- 浏览器访问:打开浏览器,访问
4. 高级配置与性能优化
基础配置完成后,为了应对更复杂的生产场景和提升性能,还需要关注以下几点。
4.1 会话保持(Session Persistence)
对于需要登录状态的应用(如购物车),需要确保同一用户的请求在一定时间内能转发到同一台后端服务器。
- 在CLB中配置:在监听器或转发规则的“高级配置”中,开启“会话保持”。
- 保持方式:
- 植入Cookie:CLB会向客户端植入一个Cookie,其中包含了后端服务器信息。这是最常用的方式。
- 重写Cookie:如果后端应用已经生成了自己的Cookie(如JSESSIONID),CLB可以重写该Cookie,在其中加入服务器信息。这需要更精细的配置。
- 保持时间:根据应用Session的超时时间设置,通常设置为30分钟到1小时。
4.2 获取真实客户端IP
这是七层负载均衡(HTTP/HTTPS)必须处理的问题。经过CLB转发后,后端服务器直接看到的源IP是CLB的内网IP,而非用户的真实IP。
- 解决方案:CLB在转发HTTP请求时,会自动在HTTP头部中添加
X-Forwarded-For(记录整个请求链的IP)和X-Real-IP(记录最靠近CLB的客户端IP)字段。 - 后端应用读取:
- Nginx:在配置文件中使用
$http_x_forwarded_for或$http_x_real_ip变量来获取。通常更推荐使用$http_x_forwarded_for,但要注意其值可能是一串IP列表(客户端IP, 代理1IP, 代理2IP...),需要取第一个。 - Apache:使用
%{X-Forwarded-For}i或%{X-Real-IP}i。 - 应用代码:在Java(Servlet)、PHP(
$_SERVER[‘HTTP_X_FORWARDED_FOR’])、Python(Django/Flask的request headers)等中,直接从对应的Header中读取即可。
- Nginx:在配置文件中使用
4.3 安全加固与WAF集成
CLB是第一道流量入口,也是部署安全策略的最佳位置。
- 基础防护(DDoS/CC):腾讯云CLB默认提供一定流量的DDoS基础防护。对于可能遭受攻击的业务,可以考虑购买更高规格的DDoS高防包,并关联到CLB上。
- Web应用防火墙(WAF):这是防护SQL注入、XSS、爬虫等Web攻击的利器。
- 方式一:CLB集成WAF。在CLB控制台,可以直接为HTTPS监听器开启WAF防护,并选择相应的WAF策略(如宽松、正常、严格)。
- 方式二:独立WAF实例。购买独立的WAF实例,将域名CNAME解析到WAF提供的地址,再由WAF回源到CLB。这种方式功能更强大,策略更灵活。
- 选择建议:对于一般业务,CLB集成的WAF已经足够。如果业务有非常特殊的安全合规要求或需要深度定制防护规则,再考虑独立WAF。
4.4 监控与告警
配置好了不等于万事大吉,必须建立监控。
- CLB监控指标:在腾讯云“云监控”控制台,关注以下关键指标:
- 外网出带宽:接近购买带宽峰值时,需考虑升级。
- 活跃连接数、新建连接数:反映并发压力。
- 后端服务器健康检查状态:是否有服务器被判定为不健康。
- HTTP返回码(2xx, 4xx, 5xx):5xx比例升高,说明后端应用可能出问题了。
- 设置告警:为上述关键指标设置阈值告警。例如:
- 当“不健康后端服务器数量”持续大于0超过5分钟时,发送告警短信/邮件。
- 当“5xx状态码比例”超过1%时,发送告警。
- 当“外网出带宽”使用率超过80%时,发送告警。
5. 常见问题与故障排查实录
在实际使用中,你肯定会遇到各种问题。下面是我和团队踩过的一些坑,以及排查思路。
5.1 问题一:HTTPS访问失败,浏览器提示“连接不安全”或“证书错误”
- 可能原因1:证书未正确绑定或过期。
- 排查:在CLB监听器管理页面,检查证书状态是否为“已关联”,并确认证书在有效期内。点击证书详情,核对证书绑定的域名是否与你访问的域名完全一致(包括www前缀)。
- 解决:更新或重新上传正确的证书。
- 可能原因2:域名解析未生效或解析到错误IP。
- 排查:在本地电脑使用
nslookup www.yourdomain.com或dig www.yourdomain.com命令,查看解析出的IP是否与CLB的VIP一致。也可以使用在线多地Ping工具检查。 - 解决:检查DNS配置,等待TTL过期或刷新本地DNS缓存(
ipconfig /flushdnson Windows)。
- 排查:在本地电脑使用
- 可能原因3:CLB安全组或网络ACL拦截。
- 排查:检查CLB实例关联的安全组,是否放入了
0.0.0.0/0对443端口的入站访问。同时检查CLB所在子网的网络ACL规则。 - 解决:修改安全组和网络ACL规则,允许公网对443端口的访问。
- 排查:检查CLB实例关联的安全组,是否放入了
5.2 问题二:健康检查失败,后端服务器状态“异常”
- 可能原因1:后端服务器安全组未放行CLB的IP。
- 排查:登录后端服务器,尝试从另一台同VPC的机器
telnet其80端口。如果不通,基本就是安全组问题。特别注意:健康检查的源IP可能不是CLB的VIP,需要放行CLB服务网段。 - 解决:在后端服务器的安全组中,添加一条入站规则,允许源为
CLB所在安全组ID或CLB健康检查源IP网段(如9.0.0.0/8,具体查文档)访问80端口。
- 排查:登录后端服务器,尝试从另一台同VPC的机器
- 可能原因2:后端服务未监听
80端口或服务未启动。- 排查:登录后端服务器,执行
netstat -tlnp | grep :80,查看是否有进程监听。检查Nginx/Apache服务状态systemctl status nginx。 - 解决:启动服务,检查配置文件语法,确保监听地址正确(如
0.0.0.0:80,而非127.0.0.1:80)。
- 排查:登录后端服务器,执行
- 可能原因3:健康检查路径(URL)访问失败。
- 排查:在后端服务器上,使用
curl http://localhost/health测试健康检查URL,看是否返回成功的状态码(2xx/3xx)。检查Web服务日志,看CLB的IP访问该路径时是否有错误。 - 解决:确保健康检查路径存在且可公开访问,没有身份验证等限制。
- 排查:在后端服务器上,使用
5.3 问题三:可以访问,但后端应用获取不到真实客户端IP
- 排查:在后端服务器上,查看Nginx的访问日志格式,确认是否包含了
$http_x_forwarded_for变量。或者写一个简单的PHP/Python页面,打印出所有的HTTP Header。 - 解决:
- 确保CLB是七层(HTTP/HTTPS)监听器,四层(TCP)监听器不会添加这些头部。
- 在后端Web服务器(如Nginx)配置中,正确设置日志格式和代理参数,将
X-Forwarded-For等头部传递给后端应用。 - 在后端应用代码中,正确地从
X-Forwarded-For头部读取IP(注意处理多个IP的情况,取第一个)。
5.4 问题四:性能问题,感觉加了CLB后变慢了
- 可能原因1:CLB到后端是跨可用区访问。
- 排查:检查CLB实例和后端CVM是否位于同一个可用区。跨可用区会有1-2ms的网络延迟。
- 解决:尽量将后端服务器部署在与CLB相同的可用区,或者在创建CLB时选择“多可用区”,并在绑定后端服务器时,设置“按可用区调度”。
- 可能原因2:后端服务器性能瓶颈。
- 排查:登录后端服务器,使用
top、vmstat等命令查看CPU、内存、磁盘I/O情况。检查应用日志是否有慢查询或错误。 - 解决:优化应用代码、数据库查询,或升级后端服务器配置。
- 排查:登录后端服务器,使用
- 可能原因3:CLB带宽瓶颈。
- 排查:在云监控中查看CLB的“外网出带宽”监控图,是否持续接近购买的最大带宽峰值。
- 解决:升级CLB的带宽规格。
配置CLB做HTTPS转发,初期可能会觉得步骤繁琐,但一旦跑通,你就会发现它在稳定性、可运维性上带来的巨大收益。这套架构就像给业务系统加了一个智能、坚固的前置网关,把证书、安全、流量调度这些脏活累活都接管了,让后端可以更纯粹地关注业务逻辑开发。记住几个关键点:证书在CLB统一管、健康检查配置要细心、安全组规则是隐形杀手、监控告警不能少。多操作几次,这些就成了肌肉记忆,以后部署新服务就是分分钟的事。