模块 ngx_stream_upstream_module
示例配置 指令 上游 服务器 区域 状态 哈希 最少连接 最短时间 随机 解析器 解析器超时 嵌入变量 |
ngx_stream_upstream_module
模块 (1.9.0) 用于定义服务器组,这些服务器组可以通过 proxy_pass 指令进行引用。
示例配置
upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server backend2.example.com:12345; server unix:/tmp/backend3; server backup1.example.com:12345 backup; server backup2.example.com:12345 backup; } server { listen 12346; proxy_pass backend; }
动态可配置的组,并具有定期 健康检查 功能,作为我们 商业订阅 的一部分提供。
resolver 10.0.0.1; upstream dynamic { zone upstream_dynamic 64k; server backend1.example.com:12345 weight=5; server backend2.example.com:12345 fail_timeout=5s slow_start=30s; server 192.0.2.1:12345 max_fails=3; server backend3.example.com:12345 resolve; server backend4.example.com service=http resolve; server backup1.example.com:12345 backup; server backup2.example.com:12345 backup; } server { listen 12346; proxy_pass dynamic; health_check; }
指令
语法 |
upstream |
---|---|
默认值 | — |
上下文 |
stream |
定义一组服务器。服务器可以监听不同的端口。此外,还可以混合监听 TCP 和 UNIX 域套接字的服务器。
示例
upstream backend { server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend2; server backend3.example.com:12345 resolve; server backup1.example.com:12345 backup; }
默认情况下,连接使用加权轮询平衡方法在服务器之间分配。在上面的示例中,每 7 个连接将按如下方式分配:5 个连接到 backend1.example.com:12345
,一个连接到第二个和第三个服务器。如果与服务器通信时发生错误,连接将传递到下一个服务器,依此类推,直到尝试所有正常工作的服务器。如果与所有服务器的通信都失败,则连接将关闭。
语法 |
server |
---|---|
默认值 | — |
上下文 |
上游 |
定义服务器的 address
和其他 parameters
。地址可以指定为域名或带端口的 IP 地址,也可以指定为在“unix:
”前缀之后指定的 UNIX 域套接字路径。解析为多个 IP 地址的域名会同时定义多个服务器。
可以定义以下参数
-
weight
=number
- 设置服务器的权重,默认为 1。
-
max_conns
=number
- 限制与代理服务器同时连接的最大
number
(1.11.5)。默认值为零,表示没有限制。如果服务器组不驻留在 共享内存 中,则每个工作进程的限制都会生效。在 1.11.5 版本之前,此参数作为我们 商业订阅 的一部分提供。
-
max_fails
=number
- 设置在
fail_timeout
参数设置的持续时间内,与服务器通信的失败尝试次数,如果达到此次数,则认为服务器在fail_timeout
参数设置的持续时间内不可用。默认情况下,失败尝试次数设置为 1。零值禁用尝试计数。此处,失败尝试是指与服务器建立连接时发生的错误或超时。 -
fail_timeout
=time
- 设置
- 在该时间段内,如果与服务器通信的失败尝试次数达到指定次数,则认为服务器不可用;
- 以及服务器被认为不可用的时间段。
-
backup
- 将服务器标记为备份服务器。当主服务器不可用时,连接将传递到备份服务器。
此参数不能与 hash 和 random 负载均衡方法一起使用。
-
down
- 将服务器标记为永久不可用。
此外,以下参数作为我们 商业订阅 的一部分提供
-
resolve
- 监视与服务器域名相对应的 IP 地址的变化,并在无需重启 Nginx 的情况下自动修改上游配置。服务器组必须驻留在 共享内存 中。
-
service
=name
- 启用 DNS SRV 记录的解析,并设置服务
name
(1.9.13)。为了使此参数生效,需要为服务器指定 resolve 参数,并指定没有端口号的主机名。如果服务名称不包含点(“
.
”),则构建符合 RFC 的名称,并将 TCP 协议添加到服务前缀。例如,要查找_http._tcp.backend.example.com
SRV 记录,需要指定以下指令server backend.example.com service=http resolve;
如果服务名称包含一个或多个点,则通过连接服务前缀和服务器名称来构建名称。例如,要查找
_http._tcp.backend.example.com
和server1.backend.example.com
SRV 记录,需要指定以下指令server backend.example.com service=_http._tcp resolve; server example.com service=server1.backend resolve;
最高优先级的 SRV 记录(具有相同最低优先级值的记录)被解析为主服务器,其余的 SRV 记录被解析为备份服务器。如果为服务器指定了 backup 参数,则高优先级 SRV 记录将被解析为备份服务器,其余的 SRV 记录将被忽略。
-
slow_start
=time
- 设置服务器从零恢复到标称值所需的时间,当不健康的服务器变为 健康 时,或者当服务器在被认为 不可用 的一段时间后变为可用时。默认值为零,即慢启动被禁用。
此参数不能与 hash 和 random 负载均衡方法一起使用。
如果组中只有一个服务器,则忽略max_fails
、fail_timeout
和slow_start
参数,并且此类服务器将永远不会被认为不可用。
语法 |
zone |
---|---|
默认值 | — |
上下文 |
上游 |
定义共享内存区域的 name
和 size
,该区域保存组的配置和运行时状态,这些状态在工作进程之间共享。多个组可以共享同一个区域。在这种情况下,只需指定一次 size
即可。
此外,作为我们 商业订阅 的一部分,此类组允许更改组成员资格或修改特定服务器的设置,而无需重启 Nginx。可以通过 API 模块 (1.13.3) 访问配置。
在 1.13.3 版本之前,只能通过由 upstream_conf 处理的特殊位置访问配置。
语法 |
state |
---|---|
默认值 | — |
上下文 |
上游 |
此指令出现在 1.9.7 版本中。
指定一个 file
,用于保存动态可配置组的状态。
示例
state /var/lib/nginx/state/servers.conf; # path for Linux state /var/db/nginx/state/servers.conf; # path for FreeBSD
目前,状态仅限于包含其参数的服务器列表。在解析配置时读取该文件,并在每次修改上游配置时更新该文件 更改。应避免直接更改文件内容。此指令不能与 server 指令一起使用。
在 重新配置 或 二进制升级 期间进行的更改可能会丢失。
此指令作为我们 商业订阅 的一部分提供。
语法 |
hash |
---|---|
默认值 | — |
上下文 |
上游 |
为服务器组指定负载均衡方法,其中客户端-服务器映射基于哈希后的 key
值。key
可以包含文本、变量及其组合 (1.11.2)。用法示例
hash $remote_addr;
请注意,向组中添加或删除服务器可能会导致大多数密钥重新映射到不同的服务器。此方法与 Cache::Memcached Perl 库兼容。
如果指定了 consistent
参数,则将使用 ketama 一致性哈希方法。此方法确保在向组中添加或删除服务器时,只有少数密钥会被重新映射到不同的服务器。这有助于提高缓存服务器的缓存命中率。此方法与 Cache::Memcached::Fast Perl 库兼容,前提是 ketama_points
参数设置为 160。
语法 |
最少连接; |
---|---|
默认值 | — |
上下文 |
上游 |
指定组应使用负载均衡方法,其中连接将传递到活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则使用加权轮询平衡方法依次尝试它们。
语法 |
least_time |
---|---|
默认值 | — |
上下文 |
上游 |
指定组应使用负载均衡方法,其中连接将传递到平均时间最短且活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则使用加权轮询平衡方法依次尝试它们。
如果指定了 connect
参数,则使用连接到上游服务器的 时间。如果指定了 first_byte
参数,则使用接收数据 第一个字节 的时间。如果指定了 last_byte
,则使用接收数据 最后一个字节 的时间。如果指定了 inflight
参数 (1.11.6),则还会考虑未完成的连接。
在 1.11.6 版本之前,默认情况下会考虑未完成的连接。
此指令作为我们 商业订阅 的一部分提供。
语法 |
random [ |
---|---|
默认值 | — |
上下文 |
上游 |
此指令出现在 1.15.1 版本中。
指定组应使用负载均衡方法,其中连接将传递到随机选择的服务器,同时考虑服务器的权重。
可选的 two
参数指示 Nginx 随机选择 两个 服务器,然后使用指定的 method
选择一个服务器。默认方法是 least_conn
,它将连接传递到活动连接数最少的服务器。
least_time
方法将连接传递到平均时间最短且活动连接数最少的服务器。如果指定了 least_time=connect
参数,则使用连接到上游服务器的 时间。如果指定了 least_time=first_byte
参数,则使用接收数据 第一个字节 的时间。如果指定了 least_time=last_byte
,则使用接收数据 最后一个字节 的时间。
least_time
方法作为我们 商业订阅 的一部分提供。
语法 |
resolver |
---|---|
默认值 | — |
上下文 |
上游 |
此指令出现在 1.17.5 版本中。
配置用于将上游服务器的名称解析为地址的名称服务器,例如
resolver 127.0.0.1 [::1]:5353;
地址可以指定为域名或 IP 地址,并可以包含可选端口。如果未指定端口,则使用端口 53。名称服务器以循环方式查询。
默认情况下,nginx 会在解析时查找 IPv4 和 IPv6 地址。如果不需要查找 IPv4 或 IPv6 地址,则可以指定 ipv4=off
(1.23.1) 或 ipv6=off
参数。
默认情况下,nginx 使用响应的 TTL 值缓存答案。可选的 valid
参数允许覆盖它。
resolver 127.0.0.1 [::1]:5353 valid=30s;
为了防止 DNS 欺骗,建议在安全可靠的本地网络中配置 DNS 服务器。
可选的 status_zone
参数启用在指定的 zone
中 收集 DNS 服务器请求和响应的统计信息。
此指令作为我们 商业订阅 的一部分提供。
语法 |
resolver_timeout |
---|---|
默认值 |
resolver_timeout 30s; |
上下文 |
上游 |
此指令出现在 1.17.5 版本中。
设置名称解析超时时间,例如
resolver_timeout 5s;
此指令作为我们 商业订阅 的一部分提供。
嵌入变量
ngx_stream_upstream_module
模块支持以下嵌入变量
$upstream_addr
- 保留上游服务器的 IP 地址和端口,或到 UNIX 域套接字的路径 (1.11.4)。如果在代理期间联系了多个服务器,则它们的地址用逗号分隔,例如“
192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock
”。如果无法选择服务器,则变量保留服务器组的名称。 $upstream_bytes_received
- 从上游服务器接收的字节数 (1.11.4)。来自多个连接的值用逗号分隔,类似于 $upstream_addr 变量中的地址。
$upstream_bytes_sent
- 发送到上游服务器的字节数 (1.11.4)。来自多个连接的值用逗号分隔,类似于 $upstream_addr 变量中的地址。
$upstream_connect_time
- 连接到上游服务器的时间 (1.11.4);时间以秒为单位,并具有毫秒精度。多个连接的时间用逗号分隔,类似于 $upstream_addr 变量中的地址。
$upstream_first_byte_time
- 接收第一个数据字节的时间 (1.11.4);时间以秒为单位,并具有毫秒精度。多个连接的时间用逗号分隔,类似于 $upstream_addr 变量中的地址。
$upstream_session_time
- 会话持续时间,以秒为单位,并具有毫秒精度 (1.11.4)。多个连接的时间用逗号分隔,类似于 $upstream_addr 变量中的地址。