本专栏非常感谢大家得关注和支持,本人开源项目站点https://erosbt.com 将自己热爱与信仰的技术,持续不辍地传递。
Nginx专栏
- 手把手教你Nginx常用模块详解之ngx_http_access_module(一)
- 手把手教你Nginx常用模块详解之ngx_http_addition_module(二)
- 手把手教你Nginx常用模块详解之ngx_http_api_module(三)
- 手把手教你Nginx常用模块详解之ngx_http_gzip_module(四)
- 手把手教你Nginx常用模块详解之ngx_http_limit_conn_module(五)
- 手把手教你Nginx常用模块详解之ngx_http_upstream_module(六)
- 手把手教你Nginx常用模块详解之ngx_stream_ssl_module(七)
- 手把手教你Nginx常用模块详解之ngx_stream_upstream_module(八)
- 手把手教你Nginx常用模块详解之ngx_http_perl_module(九)
- 手把手教你Nginx常用模块详解之ngx_http_rewrite_module(十)
- 手把手教你Nginx常用模块详解之ngx_http_status_module(十一)
一. 指令
ngx_stream_upstream_module
二. 语法
句法: | 上流名称{…} |
默认: | — |
语境: | 流 |
定义一组服务器。服务器可以侦听不同的端口。另外,侦听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并且连接到第二和第三服务器。如果在与服务器通信期间发生错误,则连接将被传递到下一个服务器,等等,直到所有正在运行的服务器都将被尝试。如果与所有服务器通信失败,连接将被关闭。
句法: | 服务器地址参数; |
默认: | — |
语境: | upstream |
定义服务器address和其他parameters服务器。该地址可以指定为具有强制端口的域名或IP地址,或指定为“ unix:”前缀后面指定的UNIX域套接字路径。解析为多个IP地址的域名一次定义多个服务器。
以下参数可以定义:
- weight= number设置服务器的权重,缺省max_conns值为1. = number限制number同时连接到代理服务器的最大数量(1.11.5)。默认值为零,这意味着没有限制。如果服务器组不驻留在共享内存中,则每个工作进程都有限制。
在版本1.11.5之前,此参数作为我们商业订阅的一部分提供。
-max_fails= number设置在fail_timeout参数设置的持续时间内应该发生的与服务器通信失败的次数,以便在参数设置的持续时间内将服务器视为不可用fail_timeout。默认情况下,不成功尝试的次数设置为1.零值将禁用尝试的计费。在这里,尝试失败是在与服务器建立连接时发生错误或超时。fail_timeout= time集合
指定数量的尝试与服务器通信失败的时间应该发生在考虑服务器不可用的时间内;
以及服务器将被视为不可用的时间段。
默认情况下,该参数设置为10秒。backup将服务器标记为备份服务器。主服务器不可用时,将连接到备份服务器。down将服务器标记为永久不可用。
此外,以下参数可作为我们商业订阅的一部分:
resolve监视与服务器的域名对应的IP地址的变化,并自动修改上游配置而不需要重新启动nginx。服务器组必须驻留在共享内存中。
为了使此参数起作用,必须在流程块中指定解析器指令。例:
stream { resolver 10.0.0.1; upstream u { zone ...; ... server example.com:12345 resolve; } }
service= name启用解析DNS SRV记录并设置服务name(1.9.13)。为了使此参数起作用,有必要指定服务器的解析参数并指定一个不带端口号的主机名。
如果服务名称不包含点(“ .”),则会构造符合RFC的名称,并将TCP协议添加到服务前缀中。例如,要查找_http._tcp.backend.example.comSRV记录,有必要指定指令:
server backend.example.com service=http resolve;
如果服务名称包含一个或多个点,则通过加入服务前缀和服务器名称来构造名称。例如,要查找_http._tcp.backend.example.com和server1.backend.example.comSRV记录,有必要指定指令:
server backend.example.com service=_http._tcp resolve; server example.com service=server1.backend resolve;
最高优先级的SRV记录(具有相同的最低优先级值的记录)被解析为主服务器,其余的SRV记录被解析为备份服务器。如果为服务器指定了备份参数,则将高优先级SRV记录解析为备份服务器,其余SRV记录将被忽略。
slow_start= time设置time服务器将其重量从零恢复到正常值的时间,当不健康的服务器变得健康时,或者服务器在一段时间后变得可用时认为不可用。默认值为零,即慢启动被禁用。
该参数不能与散列负载平衡方法一起使用。如果组中只有一台服务器max_fails,fail_timeout并且slow_start参数被忽略,并且这样的服务器永远不会被视为不可用。
句法: | 区域名称大小; |
默认: | — |
语境: | 上游 |
定义name和size其保持组的配置和运行时被工作者进程之间共享状态中的共享存储器区。几个小组可能共享相同的区域。在这种情况下,仅指定一次区域大小就足够了。
此外,作为我们的商业订阅的一部分,此类组允许更改组成员身份或修改特定服务器的设置,而无需重新启动nginx。配置可以通过upstream_conf处理的特殊位置访问。
句法: | 状态文件; |
默认: | — |
语境: | upstream |
指定file保持动态可配置组的状态。
例子:
state /var/lib/nginx/state/servers.conf; # path for Linux state /var/db/nginx/state/servers.conf; # path for FreeBSD
目前状态仅限于具有参数的服务器列表。解析配置时会读取该文件,并且每次上游配置更改时都会更新。应该避免直接更改文件内容。该指令不能与服务器指令一起使用。
配置重新加载或二进制升级期间所做的更改可能会丢失。该指令可作为我们商业订阅的一部分。
句法: | 散列键一致; |
默认: | — |
语境: | upstream |
指定客户端 - 服务器映射基于散列key值的服务器组的负载平衡方法。该key可以包含文本,变量,以及它们的组合(1.11.2)。用法示例:
hash $remote_addr;
请注意,从组中添加或删除服务器可能导致将大多数密钥重新映射到不同的服务器。该方法与Cache :: Memcached Perl库兼容。
如果consistent指定了参数,则将使用ketama一致性哈希方法。该方法可确保在向组中添加或删除服务器时,只有少数密钥将重新映射到不同的服务器。这有助于为高速缓存服务器实现更高的高速缓存命中率。该方法与参数设置为160 的Cache :: Memcached :: Fast Perl库兼容ketama_points。
句法: | least_conn; |
默认: | — |
语境: | 上游 |
指定服务器组应使用负载平衡方法,其中考虑到服务器权重,将连接传递给活动连接数最少的服务器。如果有多个这样的服务器,则依次使用加权循环平衡方法尝试它们。
句法: | least_time connect & first_byte & last_byte机上; |
默认: | — |
语境: | 上游 |
指定组应该使用负载平衡方法,其中考虑到服务器的权重,将连接传递给平均时间最少且活动连接数最少的服务器。如果有多个这样的服务器,则依次使用加权循环平衡方法尝试它们。
如果connect指定了参数,则使用连接到上游服务器的时间。如果first_byte指定了参数,则使用接收数据第一个字节的时间。如果last_byte指定,则使用接收数据的最后一个字节的时间。如果inflight参数被指定(1.11.6),则不完整的连接也被考虑在内。
在版本1.11.6之前,默认情况下会考虑不完整的连接。该指令可作为我们商业订阅的一部分。
嵌入式变量
该ngx_stream_upstream_module模块支持以下嵌入式变量:
$ upstream_addr保留IP地址和端口,或上游服务器(1.11.4)的UNIX域套接字的路径。如果在代理期间联系了几台服务器,则其地址用逗号分隔,例如“ 192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock”。如果无法选择服务器,则该变量将保留服务器组的名称。$ upstream_bytes_sent发送到上游服务器的字节数(1.11.4)。来自多个连接的值由逗号分隔,如$ upstream_addr变量中的地址。$ upstream_bytes_received从上游服务器收到的字节数(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变量中的地址。
三. 示例
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; }
以上更多详解请大家关注nginx官方网站https://nginx.org/en/docs/