Nginx upstream 模块是 Nginx 的一个核心模块,用于配置 Nginx 作为负载均衡器时要使用的后端服务器列表。
Nginx upstream 模块提供了多个指令,用于配置后端服务器列表的各种选项。下面是一些常用的指令及其用法:
-
upstream:定义一个 upstream 块,用于配置后端服务器列表及其各种选项。语法如下:
upstream backend { server backend1.example.com; server backend2.example.com; ... }
-
server:定义一个后端服务器及其地址,可以使用 IP 地址或域名。在一个 upstream 块中可以定义多个 server。语法如下:
server backend1.example.com; server 192.168.0.10:8080;
使用 server 可以配置多个后端服务器及其地址,可用格式为“server address [parameters]”。其中 address 可以为 IP 地址或域名,接口也可以指定。
server 后面的参数有以下4种:
- weight=number:用于指定该服务器的权重,默认为1;
- backup:指定该服务器为备用服务器,即仅在所有其他服务器都不可用时才使用该服务器;
- max_fails=number:指定在某段时间内服务器失败的最大次数,默认为1,超过该次数则认为该服务器失败,Nginx 将停止向该服务器发送请求,时间段由 fail_timeout 确定;
- fail_timeout=time:指定在 max_fails 次失败之后暂停服务的时间,默认为10s。如果该时间内服务器恢复,Nginx 将重新发送请求到该服务器。
例如:
upstream backend { server backend1.example.com weight=10; server backend2.example.com max_fails=3 fail_timeout=15s; server 192.168.0.10:8080 backup; }
-
ip_hash:使用一致性哈希算法,使同一个客户端的请求都被发送到同一个后端服务器上。语法如下:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; ... }
使用ip_hash可以解决后端服务器间session不共享的问题。
-
keepalive:开启 keepalive 连接,用于复用 TCP 连接,加快请求响应时间。语法如下:
upstream backend { keepalive 32; server backend1.example.com; server backend2.example.com; ... }
其中,数字 32 指定了 Nginx 与后端服务器之间的最大 keepalive 连接数。
-
zone:使用共享内存的方式为 Nginx upstream 模块分配空间,可以为整个 upstream 块或其中的 server 定义。语法如下:
upstream backend { zone backend_zone 64k; server backend1.example.com; server backend2.example.com; ... }
在这里,zone 指令为一个名为 backend_zone 的共享内存区域分配了64K空间。可在 upstream、server 配置操作。它也可以用于在配置 upstream 前定义共享内存。可以把它放在http部分,如下:
http { upstream backend { server backend1.example.com; server backend2.example.com; ... } ... zone backend_zone 64k; }
在这里,zone 指令为整个 upstream 块定义了一个名为 backend_zone 的共享内存区域。这样,Nginx 就不需要为每个后端服务器单独分配内存,而可以使用一个共享内存区域,提高了性能。
-
hash:使用一致性哈希算法,在选择后端服务器时使用指定的 key。语法如下:
upstream backend { hash $remote_addr; server backend1.example.com; server backend2.example.com; ... }
在这里,使用 $remote_addr 作为 key,Nginx 将使用一致性哈希算法从后端服务器列表中选择一个后端服务器。这样,对于同一个远程地址,Nginx 将一直选择相同的后端服务器。
还有其他指令,如least_conn用于选择连接数最少的服务器,zone用于开辟共享内存块,通过共享内存实现所有的 Nginx工作进程之间进行数据共享等。