引言:为什么网站需要负载均衡
在互联网业务高速发展的今天,单一服务器承载网站所有流量的模式早已难以为继。当大量用户同时访问一个网站时,单台服务器的CPU、内存、网络带宽等资源很快就会成为瓶颈,导致页面响应变慢甚至服务完全中断。更严重的是,一旦这台服务器发生硬件故障或遭受恶意攻击,整个网站将完全不可用,由此造成的业务损失和用户流失难以估量。
阿里云负载均衡SLB(Server Load Balancer)正是为解决这些问题而生的核心云服务。SLB通过将访问流量自动分发到多台后端服务器上,不仅突破了单台服务器的性能上限,还通过健康检查机制自动屏蔽故障节点,实现了业务的高可用与弹性扩展。对于网站运营者而言,合理配置SLB的流量分发规则,是保障用户体验、提升系统稳定性的关键一步。
需要先登录阿里云控制台,点击:阿里云控制台
一、SLB产品体系与选型指南
阿里云SLB并非单一产品,而是一个包含三种不同形态的负载均衡家族。理解各产品之间的差异,是正确配置流量分发规则的第一步。
1.1 应用型负载均衡ALB
ALB面向七层应用(HTTP/HTTPS/gRPC/QUIC),是当前阿里云主推的负载均衡产品。它支持内容路由、域名转发、URL路径转发、重定向、SSL卸载等高级功能,单实例可支撑百万级QPS。ALB基于Tengine(Nginx增强版)实现七层负载均衡,具备更强的应用层流量调度能力与安全防护能力。对于绝大多数Web网站、API服务、微服务架构等场景,ALB是最佳选择。
1.2 网络型负载均衡NLB
NLB专注于四层网络协议(TCP/UDP),基于高性能网络转发架构设计,单实例支持亿级并发连接,转发延迟低至微秒级。适用于实时音视频、游戏服务器、高性能数据库代理等对性能要求极高的场景。
1.3 传统型负载均衡CLB
CLB是阿里云早期的经典负载均衡产品,兼容四层(TCP/UDP)和七层(HTTP/HTTPS)负载均衡,配置相对简单。但CLB不支持域名与URL路径转发等高级七层特性,目前正逐步被ALB替代。对于简单的负载均衡场景或传统业务迁移,CLB仍可满足需求。
1.4 选型决策矩阵
综合来看,Web网站和API服务优先选择ALB;高性能四层业务(如游戏、直播)选择NLB;传统简单业务或成本敏感场景可选择CLB。具体决策时还需考虑以下维度:若业务需要基于域名或URL路径做精细化路由,必须选择ALB;若业务对并发连接数要求极高(如千万级以上),优先选择NLB;若业务仅为简单的TCP/UDP端口转发或轻量级HTTP代理,CLB足以胜任。
二、核心配置术语解析
在开始配置之前,需要先理解以下几个SLB的核心概念:
- 实例(Instance):SLB的核心资源实体,包含虚拟服务地址(VIP)、监听规则、服务器组关联关系等,是流量转发的核心载体。
- 监听(Listener):SLB接收用户请求的入口,包含协议(HTTP/HTTPS/TCP/UDP)、端口、转发规则等配置。一个实例可创建多个监听,例如同时监听80端口的HTTP和443端口的HTTPS。单实例上限为50个监听。
- 服务器组(Server Group):后端服务器的逻辑集合,包含ECS实例、ENI弹性网卡、IP地址等类型,用于统一管理后端节点的端口、权重和健康检查规则。
- 转发规则(Forwarding Rule):定义流量如何从监听分发到不同的服务器组。在七层监听中,可以基于域名、URL路径或两者组合来设置转发规则。
三、配置前的环境准备
在配置SLB之前,需要确保后端服务器已经就绪。以一个典型的网站集群为例,假设有两台ECS实例:
- ECS_01(可用区A,内网IP:192.168.1.10)
- ECS_02(可用区B,内网IP:192.168.2.20)
在两台机器上分别安装Web服务器(如Nginx),并确保80端口正常提供服务。生产环境中必须保证两台机器的代码与内容完全一致,但为了后续测试SLB分发效果,可以在两台机器的默认首页中写入不同的标识以便观察:
# 在 ECS_01 上执行 echo \"Welcome to Web Server 01 (Zone A)\" > /usr/share/nginx/html/index.html # 在 ECS_02 上执行 echo \"Welcome to Web Server 02 (Zone B)\" > /usr/share/nginx/html/index.html
此外,还需要确保两台ECS的数据库配置指向同一个RDS实例,会话数据建议持久化到Redis中,使应用层实现无状态化。
四、创建SLB实例
4.1 控制台创建步骤
在阿里云控制台中,进入负载均衡SLB产品页面,点击\"创建实例\"按钮。根据业务需求选择实例类型(ALB、NLB或CLB)、地域和可用区。对于网站类业务,建议选择ALB,并开启多可用区部署以提升可用性。
4.2 实例网络类型
- 公网类型:SLB实例拥有公网IP,可以直接接收来自互联网的访问请求。
- 私网类型:SLB实例仅有私网IP,仅能接收来自同一VPC内的访问请求,适用于内部服务集群。
对于面向公众的网站,通常选择公网类型。
五、配置监听与转发规则
监听是SLB接收用户请求的入口。创建完SLB实例后,需要配置监听规则来定义流量如何进入负载均衡器。
5.1 创建HTTP监听
在SLB实例的管理页面中,点击\"创建监听\",配置以下参数:
- 监听协议:选择HTTP或HTTPS。对于Web网站,通常需要同时配置80端口的HTTP和443端口的HTTPS。
- 监听端口:HTTP默认为80,HTTPS默认为443。
- 调度算法:选择流量分发策略(详见第六章节)。
- 会话保持:根据业务需求决定是否开启(详见第七章节)。
- 健康检查:建议开启(详见第八章节)。
5.2 配置HTTPS监听与证书
对于HTTPS监听,需要绑定SSL证书。证书可以在阿里云SSL证书服务中购买或上传已有证书。将HTTPS证书配置在SLB层面,实现SSL/TLS卸载(SSL Offloading),意味着加密解密的高计算开销由SLB承担,后端ECS服务器只需处理HTTP明文流量,从而显著降低后端服务器的CPU负载。
配置HTTPS监听时的主要步骤:
- 上传SSL证书到阿里云证书管理控制台。
- 在创建监听时选择HTTPS协议,并绑定已上传的证书。
- 配置TLS安全策略(如TLS 1.2或TLS 1.3)。
- 开启HTTP到HTTPS的强制跳转(可选)。
5.3 基于域名与URL路径的转发规则
ALB的七层监听支持基于域名和URL路径的精细化转发策略,这是ALB区别于CLB的核心优势之一。通过配置转发规则,同一个SLB实例可以根据请求的域名或路径,将流量分发到不同的后端服务器组,实现多站点共用同一个负载均衡实例的高效架构。
5.3.1 基于域名的转发
如果同一个SLB实例需要承载多个网站(如example1.com和example2.com),可以配置基于域名的转发规则:
- 规则1:域名 example1.com → 转发到服务器组A
- 规则2:域名 example2.com → 转发到服务器组B
配置时,在监听器中添加转发规则,输入要转发的请求域名。如果不填写域名,则默认对所有域名生效。
5.3.2 基于URL路径的转发
如果同一个网站的不同功能模块需要部署在不同的后端服务器上,可以配置基于URL路径的转发规则。例如:
- 路径 /api/* → 转发到API服务器组
- 路径 /static/* → 转发到静态资源服务器组
- 路径 /* → 转发到默认服务器组
在ALB控制台中,进入监听配置页面,点击\"添加转发规则\",然后输入具体的路径信息(如/api/*)并选择对应的后端服务器组。转发规则中Domain和Url可以单独指定,也可以组合使用,但同一监听下Domain和Url的组合必须唯一。
5.3.3 转发规则配置示例
以下是一个完整的转发规则配置示例,展示如何将不同域名和路径的请求分发到不同的服务器组:
转发规则1: 域名:www.example.com 路径:/api/* 目标服务器组:api-servers(权重80) 转发规则2: 域名:www.example.com 路径:/static/* 目标服务器组:static-servers(权重60) 转发规则3: 域名:www.example.com 路径:/* 目标服务器组:web-servers(权重100) 转发规则4: 域名:admin.example.com 路径:/* 目标服务器组:admin-servers(权重50)
六、调度算法选择与配置
调度算法决定了SLB如何将请求分发到后端服务器。SLB支持多种调度算法,不同产品支持的算法子集有所不同。
6.1 轮询(Round-Robin)
轮询算法按照访问顺序依次将外部请求分发到后端服务器。例如,两台ECS实例会交替接收请求——第一个请求到ECS01,第二个到ECS02,第三个到ECS01,以此类推。轮询算法适用于短连接、无状态的HTTP请求场景,当后端服务器性能相近时,可以实现均匀的流量分布。但轮询算法不感知服务器的实时负载情况,如果服务器性能差异较大,可能导致较慢的服务器成为瓶颈。
6.2 加权轮询(Weighted Round-Robin)
加权轮询是轮询算法的扩展,允许为每台后端服务器设置权重值。权重值越高的后端服务器,被轮询到的概率越高。例如,两台ECS实例分别设置权重60和40,则第一台处理60%的请求,第二台处理40%的请求。加权轮询适用于后端服务器配置存在差异的场景,可以根据服务器的CPU、内存等性能指标分配相应的权重。
6.3 加权最小连接数(Weighted Least Connections)
加权最小连接数算法除了根据每台后端服务器设定的权重值进行轮询,同时还考虑后端服务器的实际负载(即连接数)。当权重值相同时,当前连接数越小的后端服务器被轮询到的概率越高。此算法适用于长连接业务场景,如数据库连接、WebSocket等,能够更智能地将请求分配给负载较轻的服务器。
6.4 一致性哈希(Consistent Hashing)
一致性哈希根据请求的特定属性(如源IP、四元组等)计算哈希值,将相同属性的请求始终映射到同一台后端服务器。ALB支持基于源IP地址和URL的一致性哈希;NLB支持基于源IP地址、四元组(源IP+源端口+目的IP+目的端口)和QUIC ID的一致性哈希。一致性哈希适用于需要请求"粘性"的场景,如缓存服务、分布式存储等。
6.5 调度算法选型建议
- 常规Web网站:加权轮询(WRR)——可以根据服务器配置差异设置权重。
- API服务:加权轮询或加权最小连接数。
- 长连接业务(WebSocket、数据库代理):加权最小连接数(WLC)。
- 缓存服务、分布式存储:一致性哈希(CH)。
- 服务器性能一致的短连接场景:轮询(RR)。
七、会话保持配置
会话保持(Session Persistence)是负载均衡器中的一项重要功能,它确保来自同一客户端的请求在一段时间内被路由到同一个后端服务器。这对于需要维持会话状态的应用程序非常重要,比如购物车或用户登录状态等。
7.1 七层会话保持:基于Cookie
对于HTTP/HTTPS监听,SLB支持基于Cookie的会话保持,具体分为两种方式:
- 植入Cookie(Insert Cookie):SLB自动为每个请求插入一个名为SERVERID的Cookie,这个Cookie包含指向特定后端ECS实例的信息。客户端后续请求携带这个Cookie时,SLB会将请求转发给之前指定的后端服务器。植入Cookie的会话保持最长时间为86400秒(24小时)。
- 重写Cookie(Rewrite Cookie):如果应用本身已经使用了Cookie来实现会话管理,SLB可以重写这些Cookie,将会话保持所需的信息写入其中。重写Cookie方式支持配置Cookie的生存周期,周期到期后Cookie失效,会话保持结束。
两种方式的区别在于:植入Cookie是SLB在应用服务器设置的Cookie基础上增加一个Cookie字段;重写Cookie则是修改应用服务器设置的Cookie的value值。
7.2 四层会话保持:基于源IP
对于TCP/UDP监听,SLB支持基于源IP地址的会话保持——根据客户端的源IP地址确定将请求发送到哪个后端ECS实例。这种方式实现简单,但可能不够精确,因为多个用户可能共享相同的IP地址(例如,通过NAT访问互联网的用户)。
7.3 会话保持配置建议
- 对于Web应用,推荐使用基于Cookie的会话保持(植入或重写)。
- 超时时间的设置需要权衡:过短会导致有效会话被中断,过长则可能导致资源浪费。建议根据应用的具体需求进行测试调整。
- ALB支持针对不同的域名配置不同的会话保持规则,可以使用重写Cookie方式来实现。
八、健康检查配置
健康检查是SLB保障高可用的核心机制。通过定期探测后端服务器的健康状况,SLB可以自动将故障节点从转发列表中剔除,确保用户请求只被转发到健康的服务器上。
8.1 健康检查类型
健康检查支持多种探测方式:
- TCP端口探测:检查后端服务器的指定端口是否开放,适合基础连通性验证。
- HTTP/HTTPS GET请求:向后端服务器发送HTTP请求并检查响应状态码,适合应用层状态确认。
- 自定义脚本:通过自定义脚本进行更复杂的健康检查。
对于Web服务器,建议配置HTTP健康检查,设定检查路径(如/health),并确保后端服务器对该路径返回200状态码。
8.2 健康检查核心参数
健康检查的主要参数包括:
- 检查间隔(Interval):SLB向后端服务器发送健康检查请求的时间间隔,默认5秒,可调整范围1-30秒。
- 超时时间(Timeout):等待后端服务器响应的时间,默认3秒,可调整范围1-30秒。
- 健康阈值(HealthyThreshold):健康检查连续成功多少次后,将后端服务器的健康检查状态由fail判定为success。
- 不健康阈值(UnhealthyThreshold):健康检查连续失败多少次后,将后端服务器的健康检查状态由success判定为fail。
8.3 健康检查配置最佳实践
- 生产环境建议设置5次连续失败才触发剔除机制,避免因短暂的网络波动导致不必要的后端服务器切换。
- 检查间隔不宜过短(避免频繁探测增加服务器负担),也不宜过长(延迟发现故障)。
- 对于高并发业务,建议适当降低健康检查的间隔时间,以更快发现故障节点。
- 健康检查路径应选择轻量级的接口,避免对后端服务器造成额外负担。
九、后端服务器组配置
服务器组是后端服务器的逻辑集合,用于统一管理后端节点的端口、权重和健康检查规则。
9.1 添加后端服务器
在SLB实例的服务器组管理页面中,点击\"添加后端服务器\",选择需要加入的ECS实例,并配置以下参数:
- 端口:后端服务器提供服务的端口(如Web服务器通常为80或443)。
- 权重:配合加权轮询或加权最小连接数算法使用,权重越高分配到的流量越多。
9.2 权重配置策略
权重值的设置应反映后端服务器的实际处理能力:
- 如果所有服务器配置相同,可以设置相同的权重值。
- 如果服务器配置存在差异(如不同规格的ECS),应根据CPU、内存等性能指标按比例设置权重。
- 在服务器升级或扩容时,可以通过逐步调整权重来实现流量的平滑迁移。
十、使用阿里云CLI配置SLB
除了控制台操作,阿里云还提供了CLI命令行工具,方便进行自动化部署和批量配置。
10.1 安装与配置阿里云CLI
# 安装阿里云CLI(以Linux/macOS为例) curl -fsSL https://aliyuncli.alicdn.com/install.sh | bash # 配置访问凭证 aliyun configure # 按提示输入AccessKey ID、AccessKey Secret、默认地域等
10.2 使用CLI创建SLB实例
# 创建ALB实例 aliyun alb create-load-balancer \ --region cn-hangzhou \ --load-balancer-name my-web-alb \ --address-type Internet \ --load-balancer-edition Standard \ --vpc-id vpc-xxxxx \ --zone-mappings '[{"ZoneId":"cn-hangzhou-h","VSwitchId":"vsw-xxxxx"}]'
10.3 使用CLI创建监听
# 创建HTTP监听 aliyun alb create-listener \ --load-balancer-id alb-xxxxx \ --protocol HTTP \ --port 80 \ --listener-name http-listener \ --default-actions '[{"Type":"ForwardGroup","ForwardGroupConfig":{"ServerGroupTuples":[{"ServerGroupId":"sgp-xxxxx"}]}}]'
10.4 使用CLI添加转发规则
# 添加基于路径的转发规则 aliyun alb create-rule \ --listener-id lsr-xxxxx \ --rule-name api-rule \ --priority 10 \ --conditions '[{"Type":"Path","PathConfig":{"Values":["/api/*"]}}]' \ --rule-actions '[{"Type":"ForwardGroup","ForwardGroupConfig":{"ServerGroupTuples":[{"ServerGroupId":"sgp-api-xxxxx"}]}}]'
十一、使用Python SDK配置SLB
阿里云提供了Python SDK(Alibaba Cloud SDK for Python),方便在应用程序中集成SLB的配置与管理。
11.1 安装SDK
pip install alibabacloud_alb20200620 pip install alibabacloud_tea_openapi
11.2 Python代码示例:创建ALB实例
from alibabacloud_alb20200620.client import Client from alibabacloud_alb20200620.models import CreateLoadBalancerRequest from alibabacloud_tea_openapi.models import Config # 初始化客户端 config = Config( access_key_id='your-access-key-id', access_key_secret='your-access-key-secret', region_id='cn-hangzhou' ) client = Client(config) # 创建ALB实例 request = CreateLoadBalancerRequest( load_balancer_name='my-web-alb', address_type='Internet', load_balancer_edition='Standard', vpc_id='vpc-xxxxx', zone_mappings=[ {'ZoneId': 'cn-hangzhou-h', 'VSwitchId': 'vsw-xxxxx'} ] ) response = client.create_load_balancer(request) print(f"ALB实例ID: {response.body.load_balancer_id}")
11.3 Python代码示例:创建服务器组并添加后端服务器
from alibabacloud_alb20200620.models import CreateServerGroupRequest, AddServersToServerGroupRequest # 创建服务器组 sg_request = CreateServerGroupRequest( server_group_name='web-servers', vpc_id='vpc-xxxxx', protocol='HTTP', health_check_config={ 'HealthCheckEnabled': True, 'HealthCheckPath': '/health', 'HealthCheckInterval': 5, 'HealthCheckTimeout': 3, 'HealthyThreshold': 3, 'UnhealthyThreshold': 3 } ) sg_response = client.create_server_group(sg_request) server_group_id = sg_response.body.server_group_id # 添加后端服务器 add_request = AddServersToServerGroupRequest( server_group_id=server_group_id, servers=[ {'ServerId': 'i-xxxxx1', 'Port': 80, 'Weight': 100}, {'ServerId': 'i-xxxxx2', 'Port': 80, 'Weight': 80} ] ) client.add_servers_to_server_group(add_request) print(f"服务器组创建成功,ID: {server_group_id}")
十二、高可用架构最佳实践
12.1 跨可用区部署
为了实现真正的生产级高可用,后端ECS应部署在同一个地域的不同可用区。这样即使阿里云的某个物理机房因不可抗力断电,另一个机房的ECS也能无缝接管全部流量。SLB实例本身在阿里云底层也是多可用区主备高可用的。
12.2 数据层的高可用
- 数据库:必须使用阿里云RDS高可用版(一主一备跨可用区),所有后端ECS均连接同一个RDS实例。
- 会话管理:配置为无状态服务,将会话数据持久化到阿里云Redis中。
- 代码与静态资源:通过OSS或NAS实现多机共享,或通过CI/CD自动化流水线同步部署。
12.3 安全加固
- 为SLB配置安全组规则,限制源IP范围至必要业务区域。
- HTTPS网站必须配置SSL证书,并启用HTTP到HTTPS的强制跳转。
- 定期更新SSL证书,避免证书过期导致服务中断。
12.4 监控与告警
监控指标应重点关注:
- 每秒新建连接数
- 后端服务器错误率
- 队列深度
- 健康检查失败次数
十三、常见问题与解决方案
问题1:后端服务器健康检查一直失败怎么办?
解答:首先检查后端服务器的服务是否正常运行,端口是否开放。对于HTTP健康检查,确认健康检查路径是否正确,后端服务器是否对该路径返回200状态码。同时检查安全组规则是否允许SLB的健康检查探测IP访问后端服务器。
问题2:会话保持不生效是什么原因?
解答:检查监听是否开启了会话保持功能。对于基于Cookie的会话保持,确认客户端是否正常接收和发送Cookie。如果使用了重写Cookie方式,检查后端服务器是否正确设置了Cookie。
问题3:如何实现同一个SLB实例承载多个网站?
解答:使用ALB的七层监听,配置基于域名的转发规则,将不同域名的请求转发到不同的后端服务器组。每个域名对应一个服务器组,实现多站点共用同一个SLB实例。
问题4:加权轮询的权重值如何设置?
解答:权重值应反映后端服务器的实际处理能力。例如,如果ECS_01的CPU核数是ECS_02的两倍,可以将ECS_01的权重设为100,ECS_02的权重设为50。权重值之和不需要等于任何特定数值,系统按比例分配流量。
问题5:SLB实例创建后无法访问是什么原因?
解答:检查以下几个方面:SLB实例的安全组是否放行了对应的监听端口;后端服务器是否正常运行且端口开放;健康检查是否通过;域名解析是否正确指向了SLB的VIP地址。
问题6:HTTPS监听配置完成后浏览器提示证书不安全?
解答:确认SSL证书是否由受信任的CA机构签发。检查证书绑定的域名是否与访问的域名一致。确认证书是否在有效期内。如果使用了自签名证书,浏览器会提示不安全,建议使用正规CA签发的证书。