使用NGINX和NGINX Plus实现负载均衡(第1部分)

NGINX | 2014年2月20日

NGINX是一款功能强大的加速代理,适用于各种基于HTTP的应用。其缓存、HTTP连接处理和卸载功能可显著提升应用性能,尤其是在高负载期间。

编者注:NGINX Plus Release 5及更高版本还可以对基于TCP的应用进行负载均衡。Release 6新增了健康检查、动态重新配置、SSL终止等功能,显著扩展了TCP负载均衡功能。在NGINX Plus Release 7<.htmla>及更高版本中,TCP负载均衡器与HTTP负载均衡器的功能完全一致。UDP负载均衡支持于Release 9中推出。

TCP和UDP负载均衡应在 stream上下文中配置,而不是在http上下文中配置。由于HTTP与TCP/UDP存在固有差异,可用的指令和参数也有所不同;有关详细信息,请参阅HTTP和TCP Upstream模块的文档。

NGINX Plus通过增加更多负载均衡功能扩展了NGINX的能力,包括:健康检查、会话持久性、实时活动监控,以及负载均衡服务器组的动态配置。

本篇博文将逐步介绍如何配置NGINX,以便在一组Web服务器之间对流量进行负载均衡,并重点介绍NGINX Plus的一些附加功能。

如需进一步了解,还可以参阅《NGINX Plus 管理指南》以及本文的后续文章《使用 NGINX 和 NGINX Plus 实现负载均衡(第 2 部分)》。

使用NGINX代理流量

首先,将流量代理到两台上游Web服务器。以下NGINX配置可终止发往端口80的所有HTTP请求,并以轮询方式将这些请求转发到上游组中的各台Web服务器:

http {    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }

    upstream backend {
        server web-server1:80;
        server web-server2:80;
    }
}

通过这一简单配置,NGINX会将端口 80 上收到的每个请求依次转发到web-server1和web-server2,并为每次转发建立新的HTTP连接。

设置负载均衡方法

默认情况下,NGINX 使用轮询方法在服务器之间均匀分配流量,并可根据为每台服务器分配的可选“权重”进行调整,以反映其相对容量。

The IP Hash方法根据源IP地址的哈希值分配流量。来自同一客户端IP地址的请求始终会发送到同一上游服务器。这是一种较为简单的会话持久性方法。每当服务器发生故障或恢复,或者上游组被修改时,系统都会重新计算哈希值;如果需要会话持久性,NGINX Plus可提供更合适的解决方案。

“最少连接”方法会将每个请求路由到活动连接数最少的上游服务器。此方法非常适合处理简单请求与复杂请求并存的情况。

所有负载均衡方法都可以通过在weight参数上设置可选的server指令进行调整。当服务器的处理能力不同时,这种设置很有用。在以下示例中,NGINX分配给web-server2的请求数量是web-server1的4倍:

upstream backend {    zone backend 64k;
    least_conn;

    server web-server1 weight=1;
    server web-server2 weight=4;
}

在NGINX中,每个工作进程独立管理权重。NGINX Plus使用共享内存区存储上游数据(通过zone指令配置),因此各工作进程可以共享权重,从而更准确地分配流量。

故障检测

如果NGINX在尝试连接服务器、向其传递请求或读取响应标头时发生错误或超时,NGINX会使用另一台服务器重试连接请求。(可以在配置中添加proxy_next_upstream指令,以定义重试请求的其他条件。)此外,NGINX可以将发生故障的服务器从候选服务器集中移除,并偶尔向其发送请求,以检测该服务器何时恢复。max_fails和fail_timeout参数用于控制server指令的此行为。

NGINX Plus新增了一组带外健康检查,可对每个上游服务器执行复杂的HTTP测试,以确定其是否处于活动状态;此外还新增了慢启动机制,可将已恢复的服务器逐步重新加入负载均衡组:

server web-server1 slow_start=30s;

一个常见的“坑”:修复Host标头

上游服务器通常会使用请求中的Host标头来确定要提供的内容。如果服务器返回意外的404错误,或出现任何其他表明其提供了错误内容的情况,应首先检查此标头。然后在配置中添加proxy_set_header指令,为该标头设置适当的值:

location / {
    proxy_pass http://backend;

    # Rewrite the 'Host' header to the value in the client request
    # or primary server name
    proxy_set_header Host $host;

    # Alternatively, put the value in the config:
    #proxy_set_header Host www.example.com;
}

使用NGINX Plus实现高级负载均衡

NGINX Plus提供一系列高级功能,非常适合作为上游服务器集群前端的负载均衡器:

有关高级负载均衡和代理的详细信息,请参阅本系列的后续文章《使用NGINX和NGINX Plus实现负载均衡(第2部分)》。

要试用NGINX Plus,立即开始30天免费试用,或联系我们,讨论您的负载均衡用例。


分享

关于作者

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。