如何部署Nginx的负载均衡upstream模块?

Load balancing

1 Nginx的upstream模块

1.1 模块名称

ngx_http_upstream_module
注:该模块主要提供负载均衡能力,实现上游服务器(后端服务器)横向扩展

1.2 模块指令

– upstream
– server
– zone
– state
– hash
– ip_hash
– keepalive
– ntlm
– least_conn
– least_time
– queue
– sticky
– sticky_cookie_insert

1.2.1 upstream指令

1.2.1.1 指令的使用

语 法:

upstream name {...}

默认值:-
上下文:http
作 用:指令定义一组上游服务器(后端服务器)
注:服务器可以使用不同的端口

1.2.1.2 定义范例

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;
}

注:
第1个server,该行使用weight关键字声明该服务器使用加权轮询平衡的方法定义
第3个server,该行使用直接使用倾听套接字的方法定义

1.2.2 server指令

1.2.2.1 指令的使用

语 法:

server address [parameters];

默认值:-
上下文:upstream
作 用:指令定义具体的上游服务器以及参数(parameters)
注:
– address后支持指定上游服务器的域名或IP地址且端口可选,默认为80
– address后支持指定套接字的路径
– server指令可以定义多行,代表多台服务器

1.2.2.2 upstream指令支持定义的参数(parameters)

1.2.2.2.1 参数-权重

格式:weight=number
– 指定服务器的权重
– 默认值为1

1.2.2.2.2 参数-最大连接数

格式:max_conns=number
– 限制代理服务器到上游服务器的最大连接数量(活动的)
– 默认值为0,表示不限制
– 该参数出现于1.5.9和1.11.5版
– 该参数需要商业订阅方可使用

1.2.2.2.3 参数-最大失败尝试

格式:max_fails=number
– 定义负载均衡服务器与上游服务器通讯失败的重试次数
– 默认情况下建议设置为1
– 设置为0则禁用失败尝试

1.2.2.2.4 参数-最大重试时间与不可用时段

格式:fail_timeout=time
– 定义负载均衡服务器与上游服务器的最大重试时间
– 定义负载均衡服务器与上游服务器的最大不可用时段
– 默认情况下,该参数建议设置为10秒

1.2.2.2.5 参数-标记为备用服务器

格式:backup
– 该参数将上游服务器标记为备用的上游服务器
– 当有服务器故障时,该备用服务器被自动启用

1.2.2.2.6 参数-标记服务器为不可用

格式:down
– 该参数将服务器标记为永久不可用
– 该参数需要商业订阅方可使用

1.2.2.2.7 参数-自动DNS解析修正

参数格式: resolve
– 自动监视上游服务器的域名的DNS解析,并自动修正(不需要重启Nginx)
使用范例:

http {
    resolver 10.0.0.1;

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

注:使用该指令必须在http{}中指定dns服务器

1.2.2.2.8 参数-制定路由名称

参数格式:route=string
– 该参数指定服务器路由名称

1.2.2.2.9 参数-某域名下提供的服务解析

参数格式:service=name
– 该参数可以解析DNS的SRV记录并设置服务名称
– 该参数建议指定resolve参数并指定没有端口的主机名
注:SRV记录的作用是指明某域名下提供哪些服务
服务名称不包括点的使用范例(符合RFC的名称构造):

server backend.example.com service=http resolve;

服务名称包括点的使用范例(符合RFC的名称构造):
例如,要表达以下SRV记录,

_http._tcp.backend.example.com
server1.backend.example.com

则应当按照如下方式书写,

server backend.example.com service=_http._tcp resolve;
server example.com service=server1.backend resolve;
1.2.2.2.10 参数-延迟时间标记为可用

参数格式:

slow_start=time

– 该参数指当上游服务器恢复健康,负载均衡服务器多长时间后将其权重由零恢复到正常值
– 该参数默认值为0,即服务器即可恢复可用
注:该参数不能与hash和ip_hash负载均衡算法一起使用

1.2.2.2.11 参数-排水模式

参数格式:drain
– 该参数标记服务器进入“排水”模式
– 此模式下,只有绑定到上游服务器的请求才会被处理
– 1.13.6之前,只能使用API模块更改该参数

1.2.3 zone指令

1.2.3.1 指令的使用

语 法:

zone name [size];

默认值:-
上下文:upstream
作 用:该参数定义小组间可共享相同的存储区域大小
注:该参数需要商业订阅方可使用

1.2.4 state指令

1.2.4.1 指令的使用

语 法:

state file;

默认值:-
上下文:upstream
作 用:该文件用于动态地加载服务组(多个服务列表)
注:
– 该参数需要商业订阅方可使用
– 该参数出现于1.9.7版
使用范例:

state /var/lib/nginx/state/servers.conf; # path for Linux
state /var/db/nginx/state/servers.conf;  # path for FreeBSD

1.2.5 hash指令

1.2.5.1 指令的使用

语 法:

hash key [consistent];

默认值:-
上下文:upstream
作 用:负载均衡的一种算法,该方法基于哈希键值将不同的客户端分配到不同的上游的服务器
注:
– key的参数可以是文本、变量以及两者组合
– key的参数指定后从组中添加或删除服务器可能会导致大多数的哈希键重新映射到不同的服务器
– consistent指定参数,则将使用ketama一致性散列方法,删除服务器则重新映射的服务器数量只有少量

1.2.6 ip_hash指令

1.2.6.1 指令的使用

语 法:

ip_hash;

默认值:-
上下文:upstream
作 用:负载均衡的一种算法,该算法基于客户端IP地址将不同的客户端分配到不同的上游的服务器
注:
– 客户端的IPv4地址的前三个八位字节或整个IPv6地址作为哈希键
– 该方法确保来自于同一客户端请求始终传递到同一台服务器(有利于保持session)
– 从1.3.2和1.2.2开始支持IPv6地址

1.2.6.2 使用方法

如果其中一台服务器需要临时移除,则应该使用down参数标记以保留客户端IP地址的当前哈希键值

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

1.2.7 keepalive指令

1.2.7.1 指令的使用

语 法:

keepalive connections;

默认值:-
上下文:upstream
作 用:该参数定义负载均衡服务器与上游服务器之间保留在每个辅助进程的缓存的空闲连接数
注:
– 该参数出现于1.1.4版
– 该参数不限制工作进程可以打开的上游服务器的连接总数
– 该参数推荐配置足够小的值,以便上游服务器也处理新的传入连接

1.2.7.2 memcached的配置示例

upstream memcached_backend {
    server 127.0.0.1:11211;
    server 10.0.0.2:11211;

    keepalive 32;
}

server {
    ...

    location /memcached/ {
        set $memcached_key $uri;
        memcached_pass memcached_backend;
    }

}

1.2.7.3 HTTP的配置示例

upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

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

注:
– 该范例要求proxy_http_version的值配置为1.1
– 要求proxy_set_header Connection的值配置为空(清除连接头字段)

1.2.7.4 FastCGI配置示例

upstream fastcgi_backend {
    server 127.0.0.1:9000;

    keepalive 8;
}

server {
    ...

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

注:需要配置fastcgi_keep_conn的参数为on

1.2.8 ntlm指令

1.2.8.1 指令的使用

语 法:

ntlm;

默认值:-
上下文:upstream
作 用:该参数启用NTLM身份验证协议与上游服务器进行身份验证
注:
– 一旦认证成功,负载均衡服务器与上游服务器的连接将被绑定
– 该指令出现在1.9.2版
1.2.8.2 使用范例

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 "";
        ...
    }
}

注:
– 建议启用与上游服务器保持连接
– proxy_http_version的参数应该设置为1.1
– proxy_set_header Connectino的参数应该设置为空(清除连接头字段)
– 除了使用默认循环的负载均衡方法外,必须在使用ntlm指令之前激活他们
– 该指令需要商业订阅方可使用

1.2.9 least_conn指令

1.2.9.1 指令的使用

语 法:

least_conn;

默认值:-
上下文:upstream
作 用:负载均衡的一种算法,该算法会将户端的请求分配到活动连接数最少的上游服务器
注:
– 该方法同时考虑权重,如果有多台加权服务器,会根据加权循环平衡方法尝试
– 该指令出现在1.3.1和1.2.2版

1.2.10 least_time指令

1.2.10.1 指令的使用

语 法:

least_time header | last_byte [inflight];

默认值:-
上下文:upstream
作 用:负载均衡的一种算法,该算法会将户端的请求分配到响应最快且活动连接数最少的上游服务器
注:
– 该方法同时考虑权重,如果有多台加权服务器,会根据加权循环平衡方法尝试
– 该指令出现在1.7.10版
– 如果header中指定参数,则使用接收响应头的时间
– 如果last_byte中指定参数,则使用完整响应的时间
– 如果inflight中指定参数,则不完整的请求也会被考虑在内
– 该指令需要商业订阅方可使用

1.2.11 queue指令

1.2.11.1 指令的使用

语 法:

queue number [timeout=time];

默认值:-
上下文:upstream
作 用:该指令指定多长时间无法将请求递给上游服务器则向客户端返回502(错误网关)
注:
– 该参数的默认值是60秒
– 除了使用默认循环的负载均衡方法外,必须在使用queue指令前激活他们。
– 该指令需要商业订阅方可使用

1.2.12 sticky指令

1.2.12.1 指令的使用

语 法:

sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];
sticky route $variable ...;
sticky learn create=$variable lookup=$variable zone=name:size [timeout=time] [header];

默认值:-
上下文:upstream
作 用:该指令将来自同一客户端的请求传递到一组服务器中的同一台服务(会话关联)
注:
– 该指令包含三种方法,分别为cookie/route/learn
– 该指令出现于1.5.7版
注:
– name参数指定cookie的名称
– expites=time参数设置cookie过期时间
– domain=domain参数定义cookie的域
– httponly参数将HttpOnly属性添加到cookie(该属性可防止XSS攻击)
– secure参数将Secure属性添加到cookie
– path=path参数定义cookie的设置路径
– 如果参数省略,表示不设置响应的参数

1.2.12.2 cookie方法的使用

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

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

方法的作用:
– 该方法指定服务器信息将由Nginx生成的HTTP cookie来传递
该方法下,
– cookie对应的值由IP地址和端口的MD5散列值的十六进制表示
– cookie对应的值或由UNIX域套接字路径的十六进制表示
– 以下是cookie方法的使用的参数例外

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

注:如果server指令指定了”route”参数,srv_id的cookie值将是a或者b

1.2.12.3 route方法的使用

map $cookie_jsessionid $route_cookie {
    ~.+\.(?P\w+)$ $route;
}

map $request_uri $route_uri {
    ~jsessionid=.+\.(?P\w+)$ $route;
}

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky route $route_cookie $route_uri;
}

方法的作用:
– 该方法在负载均衡服务器收到第一个请求时分配一个路由给客户端
– 客户端后续的所有请求都路由信息携带在cookie或URL中
执行细节:
– 该参数将与server指令的route参数进行比较,以识别请求应该代理到的服务器
– 如果server指令指定了route参数,则路由名称将是IP地址和端口的MD5散列值的十六进制表达
– 如果server指令指定了route参数,则路由名称将是UNIX域套接字路径的十六进制表达
– 如果指定的服务器不能请求,则按照配置的均衡方法去选择新的服务器(负略路由)

1.2.12.4 learn方法的使用

upstream backend {
   server backend1.example.com:8080;
   server backend2.example.com:8081;

   sticky learn
          create=$upstream_cookie_examplecookie
          lookup=$cookie_examplecookie
          zone=client_sessions:1m;
}

方法的作用:
– 该方法会分析上游服务器的响应,并学习服务器启动的会话
– 该方法服务器信息通常由Nginx生成的HTTP cookie来传递
执行细节:
– 上游服务器通过响应设置的cookie_examplecookie来创建会话
– 进一步地该cookie将被传递到同一台服务器
– 改服务器如无法处理请求,则选择新的服务器

参数作用:
– create参数用于创建新会话
– lookup参数用于搜索现有会话
– zone参数包含会话的name与size两部分
注:
– 会话参数存储在共享存储区
– 一个兆字节的区域可存储约8000个会话
– timeout参数指定的时间内没有会话则存储的会话参数会被删除(默认是10分钟)
– 该指令需要商业订阅方可使用

1.2.13 sticky_cookie_insert指令

1.2.13.1 指令的使用

语 法:

sticky_cookie_insert name [expires=time] [domain=domain] [path=path];

默认值:-
上下文:upstream
注:从1.5.7版开始,该指令已经过时,请使用以下指令代替,

sticky cookie name [expires=time] [domain=domain] [path=path]

1.3 模块的嵌入式变量

ngx_http_upstream_module模块支持一下嵌入式变量

1.3.1 变量upstream_addr

1.3.1.1 变量格式

$upstream_addr

1.3.1.2 变量的作用

– 保存上游服务器的IP地址与端口
– 保存上游服务器的UNIX域套接字路径

1.3.1.3 变量的说明

– 多台服务器使用逗号分隔,如”192.168.1.1:80,192.168.1.2:80,unix:/tmp/sock”
– 如果有服务器组间重定向的情况,则组之间使用冒号分隔,如”192.168.1.1:80,192.168.1.2:80,unix:/tmp/sock:192.168.10.1:80,192.168.10.2:80″
– 如果不能选择服务器,则变量存储的是服务器组名称

1.3.2 变量upstream_bytes_received

1.3.2.1 变量的格式

$upstream_bytes_received

1.3.2.2 变量的作用

– 从上游服务器收到的字节数
– 来自多个连接的值由逗号或冒号分隔(类似IP地址变量的分隔方式)

1.3.3 变量upstream_cache_status

1.3.3.1 变量的格式

$upstream_cache_status

1.3.3.2 变量的作用

– 保存访问响应的缓存状态
– 状态包括”MISS”,”BYPASS”,”EXPIRED”,”STALE”,”UPDATING”,”REVALIDATED”,”HIT”

1.3.4 变量upstream_connect_time

1.3.4.1 变量的格式

$upstream_connect_time

1.3.4.2 变量的作用

– 保存与上游服务器建立连接的时间
– 时间以毫秒的细粒度保存
– SSL情况下,该时间包含握手的时间
– 多个连接时间使用逗号或冒号分隔(类似IP地址变量的分隔方式)

1.3.5 变量upstream_cookie_name

1.3.5.1 变量的格式

$upstream_cookie_name

1.3.5.2 变量的作用

– 该变量保存上游服务器具有指定名称cookie值(上游服务器通过set-cookie发送)
– 该变量只保存最后一台服务的响应cookie

1.3.6 变量upstream_cookie_name

1.3.6.1 变量的格式

$upstream_cookie_name

1.3.6.2 变量的作用

– 该变量保存从上游服务器接收的cookie值
– 该变量具有指定名称
– 该变量由上游服务器通过set-cookie发送
– 该变量只保存最后一台服务的响应cookie

1.3.7 变量upstream_header_time

1.3.7.1 变量的格式

$upstream_header_time

1.3.7.2 变量的作用

– 该变量保存从上游服务器接收的响应头时间
– 该变量以毫秒细粒度保存
– 多个响应时间将使用逗号或冒号分隔(类似IP地址变量的分隔方式)

1.3.8 变量upstream_http_name

1.3.8.1 变量的格式

$upstream_http_name

1.3.8.2 变量的作用

– 该变量保存从上游服务器接收的响应头字段
– 该变量只保存最后一台服务的响应头字段

1.3.9 变量upstream_response_length

1.3.9.1 变量的格式

$upstream_response_length

1.3.9.2 变量的作用

– 该变量保存从上游服务器接收的响应头字段长度
– 多个响应头字段长度将使用逗号或冒号分隔(类似IP地址变量的分隔方式)

1.3.10 变量upstream_response_time

1.3.10.1 变量的格式

$upstream_response_time

1.3.10.2 变量的作用

– 该变量保存从上游服务器接收的响应时间
– 该变量以毫秒细粒度保存
– 多个响应头时间将使用逗号或冒号分隔(类似IP地址变量的分隔方式)

1.3.11 变量upstream_status

1.3.11.1 变量的格式

$upstream_status

1.3.11.2 变量的作用

– 该变量保存从上游服务器接收的响应状态码
– 多个响应状态码将使用逗号或冒号分隔(类似IP地址变量的分隔方式)
– 如果服务器无响应,变量将保存502(Bad Gateway)

2 配置一个负载均衡器

2.1 基础配置

2.1.1 环境信息

LBSer:
IP Address = 10.168.0.80
Operating System = CentOS 7.x x86_64

upstreamSer[1-2]:
IP Address = 10.168.0.8[1-2] Operating System = CentOS 7.x x86_64

2.1.2 yum源配置

In LBSer & upstreamSer[1-2]

yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.1.3 安装基础包

In LBSer & upstreamSer[1-2]

yum install -y nginx

2.1.4 启动服务器并配置自启动

In LBSer & upstreamSer[1-2]

systemctl start nginx
systemctl enable nginx

2.1.5 配置服务端口

firewall-cmd --permanent --add-service http
firewall-cmd --reload
firewall-cmd --list-all

2.1.6 检查主配置文件

In LBSer

grep include /etc/nginx/nginx.conf

检查是否包含如下行:

include /etc/nginx/conf.d/*.conf

2.2 配置上游服务器

In upstreamSer[1-2]

mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.default

In upstreamSer1

echo upstreamSer1 > /usr/share/nginx/html/index.html

In upstreamSer2

echo upstreamSer2 > /usr/share/nginx/html/index.html

2.3 配置负载均衡

2.3.1 增加基于域名识别的负载均衡器配置

In LBSer

vim /etc/nginx/conf.d/www.cmdschool.org_80.conf

添加如下配置:

upstream www.cmdschool.org {
  server 10.168.0.81:80 weight=3;
  server 10.168.0.82;
}

server {
  listen 80;
  server_name www.cmdschool.org;
  location / {
    proxy_pass http://www.cmdschool.org;
  }
}

2.3.2 重启服务使配置生效

systemctl restart nginx

2.3.3 浏览器测试检查

http://www.cmdschool.org
注:请不断刷新,你会发现访问的服务器会变更。

参阅文档:
============================
官方模块链接:
———————
http://nginx.org/en/docs/http/ngx_http_upstream_module.html

配置范例链接:
——————–
https://www.nginx.com/resources/wiki/start/topics/examples/loadbalanceexample/

Nginx安装包地址:
———————
http://nginx.org/packages/

SRV的概念解析:
———————
http://blog.csdn.net/njzhy_diandian/article/details/1998849

没有评论

发表回复

Load balancing
如何用HAProxy代理sftp?

1 前言 一个问题,一篇文章,一出故事。 笔者今天需要实现HAProxy代理sftp,因此整理此文。 …

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …