Nginx 负载均衡模块 ngx_http_upstream_module ngx_http_upstream_module 模块用于定义可以被 proxy_pass、fastcgi_pass 以及memcached_pass 等指令引用的服务器群。
配置示例:
复制代码代码示例:
upstream backend {
server backup1.example.com:8080 backup;
server {
动态可配置群,仅作为我们商业订阅的一部分:
复制代码代码示例:
upstream appservers {
server appserv1.example.com weight=5;
server reserve1.example.com:8080 backup;
server {
location /upstream_conf {
指令
复制代码代码示例:
upstream backend {
server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; }
默认情况下,请求是使用一个加权重的循环负载方法分配给各个主机的。在上面的例子中,每七个请求会以以下方案进行分配:五个请求分给 backend1.example.com 而另外两个请求分别分配给第二和第三个主机。如果在连接一台主机时发生错误,当前请求会被传给下一台主机,如此这般知道所有运行中的服务器都被尝试。如果没有任何主机成功返回,客户端会受到从最后一台主机返回的通信结果。
复制代码代码示例:
upstream backend {
server backup1.example.com:8080 backup;
如果群里面只有一台主机,那么 max_fails、 fail_timeout 和 slow_start 参数将被忽略,而且这样的主机也永远不会被认为不可用。
复制代码代码示例:
upstream backend {
server backend1.example.com;
在 Nginx 1.3.1 和 1.2.2 版本之前的版本是无法使用 ip_hash 负载均衡方式定义服务器权重的。
复制代码代码示例:
upstream memcached_backend {
keepalive 32;
server {
location /memcached/ { }
对于 HTTP,proxy_http_version 指令应该设置为 "1.1",并且清空 "Connection" 头字段:
复制代码代码示例:
upstream http_backend {
keepalive 16;
server {
location /http/ {
作为一种选择,HTTP/1.0 持久连接可以通过传递 "Connection: Keep-Alive" 头字段到 upstream 服务器来使用,虽然这种方法并不被推荐。
复制代码代码示例:
upstream fastcgi_backend {
server {
当使用 round-robin 之外的负载均衡方法时,需要在 keepalive 指令之前将他们激活。
例如,
复制代码代码示例:
location / {
proxy_pass http://backend; health_check; }
将会每隔五秒钟发送 "/" 到 backend 群的每个服务器。如果有任何通信错误或者超时发生,或者代理服务器返回为 2XX 或者 3XX 之外的状态码,健康检查失败,这台服务器就被认为是不健康的了。来自客户端的请求不会被传递给不健康的服务器。
复制代码代码示例:
http {
match welcome {
这一配置说明了健康检查通过的条件是,健康检查请求应该成功返回,拥有状态码 200,Content-Type 是为 "text/html",并且在正文中包含 "Welcome to nginx!"。
status 200;
状态码为 200。 status ! 500; 状态码不是 500。 status 200 204; 状态码为 200 或者 400。 status ! 301 302; 状态码既不是 301 也不是 302。 status 200-399; 状态码在 200 - 399 之间。 status ! 400-599; 状态码不在 400 - 599 之间。 status 301-303 307; 状态码是 301,302,303,或者 307。 header Content-Type = text/html; 头包含字段 "Content-Type" 值为 text/html。 header Content-Type != text/html; 头包含字段 "Content-Type" 值不是 text/html。 header Connection ~ close; 头包含字段 "Connection" 值匹配正则表达式 close。 header Connection !~ close; 头包含字段 "Connection" 值不匹配正则表达式 close。 header Host; 头包含字段 "Host"。 header ! X-Accel-Redirect; 头没有 "X-Accel-Redirect" 字段。 body ~ "Welcome to nginx!"; 正文匹配正则表达式 "Welcome to nginx!"。 body !~ "Welcome to nginx!"; 正文不匹配正则表达式 "Welcome to nginx!"。
如果以上有些被定义,那么返回必须全都匹配时才能说明它测试通过。
复制代码代码示例:
# status is 200, content type is "text/html",
# and body contains "Welcome to nginx!" match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; } # status is not one of 301, 302, 303, or 307, and header does not have "Refresh:" match not_redirect { status ! 301-303 307; header ! Refresh; } # status ok and not in maintenance mode match server_ok { status 200-399; body !~ "maintenance mode"; }
这个指令仅作为我们的商业订阅的一部分。
复制代码代码示例:
upstream backend {
sticky_cookie_insert srv_id expires=1h domain=example.com path=/;
没有绑定到特定服务器的客户端请求会被传递到由配置的负载均衡方法选中的服务器。这个客户端的而后的请求将被传递到同一台服务器。如果指定服务器无法处理请求,一台新的服务器会被选中绑定,就像这个客户端的这次请求前没有绑定到任何服务器一样。
配置命令可以用于:
正如在 server 指令中提到的那样,指定一个服务器作为一个域名可能导致多个服务器被添加到群。因为地址在一群不需要是独特的,单个服务器在一个群可以被唯一引用的话只有用他们的 ID。服务器的 ID 会被自动分配,并在群配置中显示。
upstream=name
选择一群。这一参数是强制必须的。 backup= 如果没有设置,选中一群中的主要服务器。如果设置了,则选中一群中的备用服务器。 id=number 选中一群中特定的主要服务器或者备用服务器。 remove= 移调一群中一台特定的主要服务器或者备用服务器。 add= 添加一台主要服务器或者备用服务器到群。 server=address 同 server 指令中的 "address" 参数。 weight=number 同 server 指令中的 "weight" 参数。 max_fails=number 同 server 指令中的 "max_fails" 参数。 fail_timeout=time 同 server 指令中的 "fail_timeout" 参数。 slow_start=time 同 server 指令中的 "slow_start" 参数。 down= 同 server 指令中的 "down" 参数。 up= 同 server 指令中的 "down" 参数相反。 前三个参数用于选择命令适用的对象。 比如,查看群组里头的主服务器,发送: http://127.0.0.1/upstream_conf?upstream=appservers 查看群组里头的备用服务器,发送: http://127.0.0.1/upstream_conf?upstream=appservers&backup= 查看群组里头特定的主服务器,发送: http://127.0.0.1/upstream_conf?upstream=appservers&id=42 查看群组里头特定的备用服务器,发送: http://127.0.0.1/upstream_conf?upstream=appservers&backup=&id=42 要添加一台主服务器或者备用服务器到群组,在 "server=" 参数中定义其地址即可。如果没有定义其他参数,该服务器添加后,其他参数设置为默认值(参见 server 指令)。 例如,添加一台新的主服务器到群组,发送: http://127.0.0.1/upstream_conf?add=&upstream=appservers&server=127.0.0.1:8080 添加一台新的从服务器到群组,发送: http://127.0.0.1/upstream_conf?add=&upstream=appservers&backup=&server=127.0.0.1:8080 添加一台主服务器到群组,设置其参数非默认值,且将其标记为 "down",发送: http://127.0.0.1/upstream_conf?add=&upstream=appservers&server=127.0.0.1:8080&weight=2&max_fails=3&fail_timeout=3s&down= 移除群组中的一台特定主服务器或者备用服务器,可以使用 id= 参数将其选择。 例如,移除群组中的一台特定主服务器,发送: http://127.0.0.1/upstream_conf?remove=&upstream=appservers&id=42 移除群组中的一台特定从服务器,发送: http://127.0.0.1/upstream_conf?remove=&upstream=appservers&backup=&id=42 修改群组中的一台特定的主服务器或从服务器,也使用 id= 参数将其选中。 例如,修改群组中一台特定主服务器为 "down",发送: http://127.0.0.1/upstream_conf?upstream=appservers&id=42&down= 修改群组里头的一台备用服务器地址,发送: http://127.0.0.1/upstream_conf?upstream=appservers&backup=&id=42&server=192.0.2.3:8123 修改群组里头的一台主服务器的其他参数,发送: http://127.0.0.1/upstream_conf?upstream=appservers&id=42&max_fails=3&weight=4 这个指令仅作为我们的商业订阅的一部分。
嵌入式变量
$upstream_addr
(责任编辑:IT)为 UNIX-domain socket 保存服务器地址及端口号。如果请求处理时涉及多台服务器,使用逗号将他们的地址进行分隔,比如 "192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock"。如果一个由 "X-Accel-Redirect" 或者错误页面 发出的从一个服务器群组到另一个群组的重定向发生时,不同群组之间的服务器地址使用冒号分隔,比如 "192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80"。 $upstream_cache_status 保存访问响应缓存的状态(版本 0.8.3)。这一状态可以是 "MISS","BYPASS","EXPIRED","STALE","UPDATING" 或者 "HIT"。 $upstream_response_length 保存从 upstream 服务器获得的响应体长度(版本 0.7.27)字节的长度。几个响应长度的话使用逗号和冒号分隔,就像 $upstream_addr 中的地址那样。 $upstream_response_time 保存从 upstream 服务器获得的响应次数,长度以毫秒的分辨率保存,单位是秒。几个响应次数的话使用逗号和冒号分隔,就像 $upstream_addr 中的地址那样。 $upstream_status 保存从 upstream 服务器获得的响应码。几个响应码的话使用逗号和冒号分隔,就像 $upstream_addr 中的地址那样。 $upstream_http_... 保存服务器响应头。比如,"Server" 响应头可以使用 $upstream_http_server 参数激活。将头信息转化为参数名字的规则和以 "$http_" 前缀开始的参数规则一样。只保存最后一个响应头。 |