NGINX.COM
Web Server Load Balancing with NGINX Plus

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

编者按 — NGINX Plus Release 5 及更高版本还可以对基于 TCP 的应用进行负载均衡。Release 6 通过增添健康检查、动态重新配置、SSL 终止等功能,显著扩展了 TCP 负载均衡。在 NGINX Plus Release 7 及更高版本中,TCP 负载均衡器具备与 HTTP 负载均衡器一样的功能。Release 9 中引入了对 UDP 负载均衡的支持。

您可以在 stream 上下文(而非 http 上下文)中配置 TCP 和 UDP 负载均衡。由于 HTTP 和 TCP/UDP 之间的固有差异,可用指令和参数略有不同;详情请参阅 HTTPTCP 上游模块文档。

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-server1web-server2,并分别建立新的 HTTP 连接。

设置负载均衡方法

默认情况下,NGINX 采用轮询方法在服务器之间均匀地分配流量,并基于分配给每台服务器的可选“权重”来表示其相对容量。

IP 哈希方法根据源 IP 地址的哈希值分配流量。来自同一客户端 IP 地址的请求始终发送到同一上游服务器。这是一种粗略的会话保持方法,每当服务器出现故障或恢复时,或者每当上游组被修改时,它都会被重新计算。对于需要会话保持的场景,NGINX Plus 提供了更好的解决方案。

最少连接方法将每个请求路由到活动连接最少的上游服务器,适用于处理快速且复杂的请求。

所有负载均衡方法均可使用 server 指令中的可选 weight 参数进行调整。当服务器的处理能力不同时,这一调整很有必要。在下面的示例中,NGINX 定向到 web-server2 的请求数是定向到 web-server1 的请求数的四倍:

upstream backend {
    zone backend 64k;
    least_conn;

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

在 NGINX 中,权重由每个 worker 进程独立管理。NGINX Plus 使用共享内存分段处理上游数据(通过 zone 指令进行配置),因此 worker 之间可以共享权重,而且流量分配也更精确。

 

故障检测

如果 NGINX 在尝试连接服务器、向服务器发送请求或读取响应头时出现错误或超时,NGINX 便会向另一台服务器重试连接请求。(您可将 proxy_next_upstream 指令添加到配置中,以定义重试请求的其他条件。) 此外,NGINX 还可以将故障服务器从潜在服务器组中移除,并不定期尝试对其发出请求以检测它是否已恢复。server 指令的 max_failsfail_timeout 参数控制这一行为。

NGINX Plus 不仅添加了一组带外健康检查,可对每台上游服务器执行复杂的 HTTP 测试,以确定其是否处于活动状态,而且还采用了一种慢启动机制,能够逐步将恢复的服务器重新引入负载均衡组:

server web-server1 slow_start=30s;

 

常见问题 — 修复 Host 请求头

通常,上游服务器使用请求中的 Host 请求头来确定要提供的内容。如果服务器意外返回 404 错误或其他任何提示服务器提供错误内容的信息,那么首先要检查该请求头。然后,将 proxy_set_header 指令添加到配置中,为请求头设置相应的值:

location / {
    proxy_pass http://backend;

    # 将“Host”请求头重写为客户端请求中的值
    # 或主服务器名称
    proxy_set_header Host $host;

    # 或者,将值写入配置:
    #proxy_set_header Host www.example.com;
} 

 

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

NGINX Plus 具有一系列高级功能,是部署在上游服务器群之前的理想负载均衡器

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

如欲试用 NGINX Plus,请立即下载 30 天免费试用版,或与我们联系以讨论您的负载均衡用例

Hero image
免费 O'Reilly 电子书:
《NGINX 完全指南》

更新于 2022 年,一本书了解关于 NGINX 的一切

关于作者

Owen Garrett

产品管理高级总监

Owen is a senior member of the NGINX Product Management team, covering open source and commercial NGINX products. He holds a particular responsibility for microservices and Kubernetes‑centric solutions. He’s constantly amazed by the ingenuity of NGINX users and still learns of new ways to use NGINX with every discussion.

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。