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_http_upstream_module

该ngx_http_upstream_module模块用于定义可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令引用的服务器组。

二. 语法

句法:

上游名称{…}

默认:


语境:

HTTP

定义一组服务器。服务器可以侦听不同的端口。另外,侦听TCP和UNIX域套接字的服务器可以混合使用。

例:

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

默认情况下,使用加权轮询平衡方法在服务器之间分配请求。在上面的例子中,每7个请求将分配如下:5个请求转到backend1.example.com一个请求并且对每个第二和第三个服务器发出一个请求。如果在与服务器进行通信期间发生错误,则该请求将被传递到下一个服务器,并依此类推,直到所有正在运行的服务器都将被尝试。如果无法从任何服务器获得成功响应,则客户端将收到与最后一个服务器通信的结果。

句法:

服务器地址参数;

默认:


语境:

upstream

定义服务器address和其他parameters服务器。该地址可以指定为域名或IP地址,可选端口或指定为“ unix:”前缀之后指定的UNIX域套接字路径。如果未指定端口,则使用端口80。解析为多个IP地址的域名一次定义多个服务器。

以下参数可以定义:

weight= number设置服务器的权重,默认情况下为1. max_conns= number限制number到代理服务器的同时活动连接的最大数量(1.11.5)。默认值为零,这意味着没有限制。如果服务器组不驻留在共享内存中,则每个工作进程都有限制。

为了使这个参数起作用,必须在http块中指定解析器指令。例:

http {
    resolver 10.0.0.1;

    upstream u {
        zone ...;
        ...
        server example.com resolve;
    }
}

route= string设置服务器路由名称。service= name启用解析DNS SRV记录并设置服务name(1.9.13)。为了使此参数起作用,有必要指定服务器的解析参数并指定一个不带端口号的主机名。

如果服务名称不包含点(“ .”),则会构造符合RFC的名称,并将TCP协议添加到服务前缀中。例如,要查找_http._tcp.backend.example.comSRV记录,有必要指定指令:

服务器backend.example.com服务= http解析;

如果服务名称包含一个或多个点,则通过加入服务前缀和服务器名称来构造名称。例如,要查找_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服务器将其重量从零恢复到正常值的时间,当不健康的服务器变得健康时,或者服务器在一段时间后变得可用时认为不可用。默认值为零,即慢启动被禁用。

该参数不能与hash和ip_hash负载平衡方法一起使用。如果组中只有一台服务器max_fails,fail_timeout并且slow_start参数被忽略,并且这样的服务器永远不会被视为不可用。

句法:

区域名称大小

默认:


语境:

upstream

定义name和size其保持组的配置和运行时被工作者进程之间共享状态中的共享存储器区。几个小组可能共享相同的区域。在这种情况下,size仅指定一次就足够了。

对于FastCGI服务器,需要设置fastcgi_keep_conn以使Keepalive连接正常工作:

upstream fastcgi_backend {
    server 127.0.0.1:9000;

    keepalive 8;
}

server {
    ...

    location /fastcgi/ {
        fastcgi_pass fastcgi_backend;
        fastcgi_keep_conn on;
        ...
    }
}

使用默认循环方法以外的负载均衡器方法时,需要在keepalive指令之前激活它们。SCGI和uwsgi协议没有保持连接的概念。

句法:

NTLM;

默认:


语境:

upstream

允许使用NTLM身份验证进行代理请求。一旦客户端发送具有以“ Negotiate”或“ NTLM” 开头的“授权”报头字段值的请求,上游连接就绑定到客户端连接。进一步的客户端请求将通过相同的上游连接进行代理,保持认证上下文。

为了使NTLM身份验证正常工作,有必要启用与上游服务器的保持连接。proxy_http_version指令应设置为“ 1.1”,并且应清除“连接”标题字段:

upstream http_backend {
    server 127.0.0.1:8080;

    ntlm;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

三. 示例

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}