凌峰创科服务平台

Linux web服务器负载均衡如何配置?

什么是负载均衡?

负载均衡是一种将网络流量或计算负载分布到多个服务器上的技术,其主要目的是:

Linux web服务器负载均衡如何配置?-图1
(图片来源网络,侵删)
  1. 高可用性:当其中一台后端服务器宕机时,负载均衡器可以自动将流量转移到其他健康的服务器上,确保服务不中断。
  2. 可扩展性:随着用户量的增长,可以通过简单地增加后端服务器来水平扩展服务能力,而无需对应用本身做大的修改。
  3. 性能优化:将请求均匀分配给各个服务器,避免单台服务器因过载而响应缓慢,从而提升整体用户体验。
  4. 安全增强:可以隐藏后端服务器的真实IP地址,作为所有流量的入口,提供一层额外的保护,配合WAF(Web应用防火墙)等,可以更好地防御攻击。

负载均衡的核心概念

在深入了解方案前,需要先理解几个关键术语:

  • LB (Load Balancer):负载均衡器,负责分发流量的设备或程序。
  • VIP (Virtual IP Address):虚拟IP地址,是客户端访问服务的统一入口,这个IP地址不绑定在任何一台具体的服务器上,而是由负载均衡器持有。
  • RIP (Real IP Address):真实IP地址,后端每台Web服务器的实际IP地址。
  • DIP (Destination IP Address):目标IP地址,在NAT模式下,指负载均衡器将流量转发出去时使用的IP(通常是VIP)。
  • SIP (Source IP Address):源IP地址,在NAT模式下,指客户端的真实IP地址,负载均衡器在转发请求时,可以修改SIP。
  • 调度算法:决定如何将请求分配给后端服务器的策略,常见的有:
    • 轮询:将请求按顺序依次分配给后端服务器,默认算法,实现简单。
    • 加权轮询:根据服务器的性能差异,给不同的服务器分配不同的权重,性能好的服务器获得更多请求。
    • 最少连接:将请求分配给当前连接数最少的服务器,更好地处理长连接服务。
    • 源地址哈希:根据客户端的IP地址进行哈希计算,来自同一个IP的请求总是被分配到同一台服务器,适用于需要会话保持的场景。
    • IP哈希:与源地址哈希类似,但只使用IP地址进行哈希。
  • 会话保持:也称为粘性会话,确保来自同一用户的多次请求总是被发送到同一台后端服务器,这对于需要记录用户状态的应用(如购物车)非常重要。

Linux上实现负载均衡的几种主流方案

在Linux生态中,实现负载均衡主要有三种方式:软件负载均衡反向代理云服务商负载均衡

LVS (Linux Virtual Server) - 四层/传输层负载均衡

LVS是工作在Linux内核中的、基于IP层的负载均衡解决方案,性能极高,被称为“十全十美”的负载均衡器,它工作在OSI模型的第四层(传输层),只处理TCP/UDP数据包,不关心具体的应用层内容(如HTTP头)。

  • 工作模式

    Linux web服务器负载均衡如何配置?-图2
    (图片来源网络,侵删)
    • NAT (Network Address Translation):最经典的模式,客户端请求 -> VIP -> 负载均衡器将请求源地址改为自己的DIP,目标地址改为RIP -> 后端服务器处理 -> 服务器返回给DIP -> 负载均衡器将响应源地址改为VIP,目标地址改为客户端IP。缺点:负载均衡器会成为性能瓶颈。
    • DR (Direct Routing):高性能模式,客户端请求 -> VIP -> 负载均衡器只修改目标MAC地址,将数据帧直接发给后端服务器 -> 后端服务器处理,并直接响应给客户端。要求:负载均衡器和所有后端服务器必须在同一个物理网段。这是最常用的模式。
    • TUN (Tunneling):隧道模式,允许后端服务器分布在不同的地理位置,通过IP-in-IP隧道技术进行通信,配置最复杂。
  • 管理工具

    • ipvsadm:命令行工具,用于配置和管理LVS规则。
    • Keepalived:常与LVS配合使用,提供VRRP(虚拟路由冗余协议)功能,实现负载均衡器自身的高可用。
  • 优点

    • 性能极高,基于内核,抗并发能力强。
    • 稳定可靠,是许多大型网站的首选。
  • 缺点

    • 配置相对复杂,需要一定的网络知识。
    • 功能单一,只做四层负载均衡。

Nginx - 七层/应用层负载均衡

Nginx最初是一款高性能的反向代理和Web服务器,现在也成为了最流行的七层负载均衡器,它工作在OSI模型的第七层(应用层),可以理解HTTP/HTTPS协议,因此可以实现更智能、更精细的负载均衡。

Linux web服务器负载均衡如何配置?-图3
(图片来源网络,侵删)
  • 核心功能

    • 基于域名、路径的负载均衡:可以将 www.example.com/api 的请求分发给一组服务器,而将 www.example.com/static 的请求分发给另一组服务器。
    • 健康检查:定期向后端服务器发送心跳请求(如HTTP /health),如果服务器连续N次无响应,则将其从负载均衡池中摘除。
    • SSL/TLS卸载:在负载均衡器上统一处理HTTPS的加解密,将普通的HTTP请求转发给后端服务器,减轻后端服务器的CPU压力。
    • 动静分离:将静态资源(图片、CSS、JS)的请求直接由Nginx处理,动态请求转发给后端应用服务器。
    • 丰富的调度算法:支持加权轮询、最少连接、IP哈希等。
  • 配置示例 (/etc/nginx/nginx.conf)

    http {
        # 定义后端服务器组
        upstream myapp1 {
            # 加权轮询,weight越大,分配的请求越多
            server 10.0.0.1:8080 weight=3;
            server 10.0.0.2:8080 weight=2;
            server 10.0.0.3:8080 weight=1;
            # 健康检查,每5秒检查一次,超时3秒,2次失败则认为服务器不可用
            # 需要nginx_upstream_check_module模块支持
            # check interval=3000 rise=2 fall=3 timeout=1000 type=http;
            # check_http_send "GET /health HTTP/1.0\r\n\r\n";
            # check_http_expect_alive http_2xx http_3xx;
        }
        server {
            listen 80;
            server_name www.example.com;
            location / {
                # 将请求代理到myapp1服务器组
                proxy_pass http://myapp1;
                # 设置一些代理头
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
            }
        }
    }
  • 优点

    • 功能强大,灵活,配置简单。
    • 不仅是负载均衡器,还集成了Web服务器、反向代理、缓存等多种功能。
    • 社区活跃,文档丰富。
  • 缺点

    • 性能相比LVS(DR模式)略低,因为工作在应用层,需要解析数据包内容。
    • 在处理海量长连接时,内存消耗相对较大。

HAProxy - 高性能七层/四层负载均衡

HAProxy是另一款非常著名且专业的负载均衡软件,尤其以其高性能、高稳定性和丰富的健康检查功能而著称,它既可以工作在四层,也可以工作在七层。

  • 特点

    • 性能卓越:在处理HTTP/HTTPS负载均衡时,性能通常优于Nginx。
    • 配置强大:ACL(访问控制列表)功能非常强大,可以根据请求的任何内容(如URL、Header、Cookie等)进行复杂的路由决策。
    • 健康检查精细:内置了非常灵活的健康检查机制,支持TCP、HTTP、SMTP等多种协议。
    • 日志和监控友好:提供了详细的日志和统计页面,便于监控和管理。
  • 配置示例 (/etc/haproxy/haproxy.cfg)

    # 全局配置
    global
        daemon
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 600 level admin
        stats timeout 30s
    # 默认配置
    defaults
        mode http
        timeout connect 5000
        timeout client 50000
        timeout server 50000
    # 前端,定义VIP和端口
    frontend my-http-in
        bind *:80
        # ACL规则:如果路径是/stats,则访问统计页面
        acl url_stats path_beg /stats
        use_backend stats_page if url_stats
        # 默认情况,将请求转发到后端服务器组
        default_backend myapp
    # 后端,定义服务器池
    backend myapp
        balance roundrobin
        # server格式: name ip:port [check params]
        server web1 10.0.0.1:8080 check inter 2000 rise 2 fall 3
        server web2 10.0.0.2:8080 check inter 2000 rise 2 fall 3
        server web3 10.0.0.3:8080 check inter 2000 rise 2 fall 3
    # 统计页面后端
    backend stats_page
        stats enable
        stats uri /stats
        stats refresh 30s
        stats auth admin:yourpassword
  • 优点

    • 专业的负载均衡工具,功能专注且强大。
    • 性能和稳定性在业界有口皆碑。
  • 缺点

    • 配置语法比Nginx略显复杂。
    • 除了负载均衡,其他功能(如Web服务器)较少。

方案对比与选择

特性 LVS (DR模式) Nginx HAProxy
工作层级 四层 七层(为主) 四层/七层
性能 极高 非常高
功能丰富度 低(仅负载均衡) 极高(Web、反向代理、缓存等) 高(专注负载均衡)
配置复杂度 较高 简单 中等
健康检查 基础(TCP) 丰富(HTTP等) 非常丰富(支持多种协议)
会话保持 需要配合LVS模块 原生支持(IP Hash等) 原生支持(Cookie Insert等)
适用场景 超大规模、对性能要求极致的场景 中小型网站、Web应用、需要动静分离的场景 对性能和稳定性要求高、需要复杂路由规则的企业级应用

如何选择?

  • 追求极致性能和稳定性,且业务相对简单(如TCP转发、四层负载):首选 LVS
  • 中小型Web应用,需要动静分离、反向代理、SSL卸载等多种功能,且配置要简单:首选 Nginx,这是目前最主流、最通用的选择。
  • 大型企业级应用,对负载均衡的健壮性、监控和精细路由有极高要求:首选 HAProxy
  • 不想自己维护负载均衡服务器:直接使用 云服务商提供的负载均衡服务(如阿里云SLB、腾讯云CLB、AWS ELB),它们底层通常基于LVS或HAProxy,并提供了高可用、弹性伸缩、按量付费等一站式解决方案。

完整实践案例:使用Nginx实现Web负载均衡

假设我们有以下环境:

  • 负载均衡器168.1.100 (安装Nginx)
  • 后端Web服务器10.0.1 (安装Nginx/Apache)
  • 后端Web服务器20.0.2 (安装Nginx/Apache)
  • VIP168.1.100 (负载均衡器的外网IP)

步骤1:在后端服务器上配置Web服务 确保两台后端服务器 (0.0.10.0.2) 都能正常运行Web服务,并且可以通过IP访问到,为了区分,可以在各自的首页 (/usr/share/nginx/html/index.html) 上写上不同的文字,如 "Server 1" 和 "Server 2"。

步骤2:在负载均衡器上安装和配置Nginx

# 安装Nginx (以CentOS为例)
sudo yum install -y nginx
# 备份默认配置
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 编辑Nginx配置文件
sudo vim /etc/nginx/nginx.conf

步骤3:编写Nginx负载均衡配置http 块中添加如下配置:

http {
    # ... 其他配置 ...
    # 定义后端服务器组
    upstream backend_servers {
        # 使用加权轮询算法
        server 10.0.0.1:80 weight=1;
        server 10.0.0.2:80 weight=1;
        # 启用IP哈希,实现会话保持(可选)
        # ip_hash;
        # 启用最少连接算法(可选)
        # least_conn;
    }
    # 定义前端服务
    server {
        listen 80;
        server_name lb.example.com; # 你的域名,或者直接用IP
        location / {
            # 将请求代理到我们定义的后端服务器组
            proxy_pass http://backend_servers;
            # 传递客户端真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

步骤4:启动并测试

# 检查配置文件语法
sudo nginx -t
# 如果没有问题,启动或重载Nginx
sudo systemctl start nginx
# 或者
sudo nginx -s reload
# 测试
# 在客户端机器上,不断访问 http://192.168.1.100
# 你会看到页面内容在 "Server 1" 和 "Server 2" 之间轮换出现,证明负载均衡生效。

高可用性考虑

单点故障是任何系统都必须面对的问题,负载均衡器本身也可能宕机,通常需要为负载均衡器本身做高可用。

  • Keepalived + LVS/HAProxy: 这是最经典的组合,两台负载均衡器组成一个VRRP组,共享一个虚拟IP(VIP),正常情况下,主负载均衡器工作,处理所有流量;当主节点故障时,备用节点会接管VIP,成为新的主节点,从而实现负载均衡器的高可用。
  • Nginx + Keepalived: 同样可以使用Keepalived为Nginx做高可用,原理与LVS相同。
  • 云服务商的负载均衡服务: 云服务商通常会提供多可用区部署,自动实现负载均衡器的高可用,无需用户额外配置。

在Linux上实现Web服务器负载均衡,方案多样,各有千秋,对于绝大多数应用场景,Nginx凭借其易用性和丰富的功能集,是入门和首选的最佳实践,当业务规模增长到对性能和稳定性有极致要求时,HAProxyLVS会是更优的选择,而利用云服务则是省心省力、快速上路的现代化方案,理解每种方案的核心原理和适用场景,是构建一个健壮、可扩展的Web服务的关键。

分享:
扫描分享到社交APP
上一篇
下一篇