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 之间的固有差异,可用指令和参数略有不同;详情请参阅 HTTP 和 TCP 上游模块文档。
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 采用轮询方法在服务器之间均匀地分配流量,并基于分配给每台服务器的可选“权重”来表示其相对容量。
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_fails
和 fail_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 具有一系列高级功能,是部署在上游服务器群之前的理想负载均衡器:
- 负载均衡和会话保持 – 对 worker 进程进行更合理的负载均衡并采用会话保持方法,以识别并支持应用会话
- HTTP 健康检查和服务器慢启动 – 通过异步“综合事务”探测每台上游服务器的正常运行情况,并在服务器恢复时以优雅的“慢启动”方式重新引入服务器
- 实时活动监控 – 即时报告活动和性能
- 动态配置的上游服务器组 – 用于执行一些常见上游管理任务(例如安全地临时移除服务器)的工具
有关高级负载均衡和代理的详细信息,请参阅本文的后续文章《使用 NGINX 和 NGINX Plus 实现负载均衡(第 2 部分)》。
如欲试用 NGINX Plus,请立即下载 30 天免费试用版,或与我们联系以讨论您的负载均衡用例。