Nginx upstream模块指令用法详解

14 min read

Nginx upstream 模块是 Nginx 的一个核心模块,用于配置 Nginx 作为负载均衡器时要使用的后端服务器列表。

Nginx upstream 模块提供了多个指令,用于配置后端服务器列表的各种选项。下面是一些常用的指令及其用法:

  1. upstream:定义一个 upstream 块,用于配置后端服务器列表及其各种选项。语法如下:

    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        ...
    }
    
  2. 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;
    }
    
  3. ip_hash:使用一致性哈希算法,使同一个客户端的请求都被发送到同一个后端服务器上。语法如下:

    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        ...
    }
    

    使用ip_hash可以解决后端服务器间session不共享的问题。

  4. keepalive:开启 keepalive 连接,用于复用 TCP 连接,加快请求响应时间。语法如下:

    upstream backend {
        keepalive 32;
        server backend1.example.com;
        server backend2.example.com;
        ...
    }
    

    其中,数字 32 指定了 Nginx 与后端服务器之间的最大 keepalive 连接数。

  5. 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 就不需要为每个后端服务器单独分配内存,而可以使用一个共享内存区域,提高了性能。

  6. hash:使用一致性哈希算法,在选择后端服务器时使用指定的 key。语法如下:

    upstream backend {
        hash $remote_addr;
        server backend1.example.com;
        server backend2.example.com;
        ...
    }
    

    在这里,使用 $remote_addr 作为 key,Nginx 将使用一致性哈希算法从后端服务器列表中选择一个后端服务器。这样,对于同一个远程地址,Nginx 将一直选择相同的后端服务器。

还有其他指令,如least_conn用于选择连接数最少的服务器,zone用于开辟共享内存块,通过共享内存实现所有的 Nginx工作进程之间进行数据共享等。