NGINX Full Version

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

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 天免费试用版,或与我们联系以讨论您的负载均衡用例