Nginx之反向代理和负载均衡(一)
一、基础使用
指令
upstream name {...},Context http
server address [parameters],Context upstream
通用参数:
backup:指定当前server为备份服务,仅当非备份server不可用时,请求才会转发到该server。
down:标识某台服务已经下线,不在服务。
upstream name {
server 127.0.0.1 8081;
server 127.0.0.1 backup;
server 127.0.0.1 8080 down;
}
二、加权Round-Robin负载均衡算法
功能:在加权轮询的方式访问server指令指定的上游服务,集成在Nginx的upstream框架中
指令
weight:服务访问的权重,默认是1
max_conns:server的最大并发连接数,仅作用于单worker进程。默认是0,表示没有限制
max_fails:在fail_timeout时间段内,最大的失败次数。当达到最大失败时,会在fail_timeout秒内这台server不允许再次被选择。
fail_timeout:单位为秒,默认值为10秒。具有2个功能:
指定一段时间内,最大的失败次数max_fails
到达max_fails后,该server不能访问的时间
对上游服务使用keepalive长连接
功能:通过复用连接,降低nginx与上游服务器建立、关闭连接的消耗,提升吞吐量的同时降低时延。
模块,ngx_http_upstream_keepalive_module,默认编译进nginx,通过--without-http_upstream_keepalive_module移除。
对上游连接的http头部设定(后续会详细说明)
proxy_http_version 1.1;
proxy_set_header_Connection "";
指令:
keepalive connections;
keepalive_requests number;
keepalive_timeout timeout;
//示例
server {
listen 8011;
default_type text/plain;
return 200 '8011 server response\n';
}
server {
listen 8012;
return 200 '8012 server response\n';
}
upstream rrups {
server 127.0.0.1:8011 weight=2;
server 127.0.0.1:8012;
}
server {
server_name blog.zhanghq.xin;
location / {
proxy_pass http://rrups;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
//用不同的端口号来模拟多台服务器,8011加了权重weight=2,轮询算法
//会按8011两次8012一次的顺序响应。
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
三、负载均衡哈希算法:ip_hash和hash模块
模块:ngx_http_upstream_ip_hash_module,通过--without-http_upstream_ip_hash_module禁用模块。
指令
语法:ip_hash;
Context:upstream
基于任意关键字实现Hash算法:upstream_hash模块
功能:通过指定关键字作为hash key,基于hash算法映射到特定的上游服务器中
关键字可以含有变量、字符串
模块:ngx_http_upstream_hash_module,通过--without-http_upstream_ip_hash_module禁用模块
指令
语法:hash key [consistent];
Context:upstream
//上述的负载均衡配置加了ip_hash或hash后
upstream rrups {
ip_hash;
#hash user_$arg_username;
server 127.0.0.1:8011 weight=2;
server 127.0.0.1:8012;
}
//ip_hash返回示例
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin
8012 server response
//hash模块根据参数username返回固定数据
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c
8012 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=a
8011 server response
[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=a
8011 server response
四、一致性哈希算法:hash模块
hash算法在宕机或者扩容时,会引发大量路由变更,可能导致缓存大范围时效。
如图所示,假设原先有4个节点(还没有node5),均匀分布在一个环上,红色节点表示请求的hash值落的点,将会交由最近的服务器节点处理,比如现在node4压力比较大,可以新增一个node5,这样就可以帮node4分担一些压力,而不会造成大范围的缓存失效等问题。
只要在hash key [consistent]后面加个consistent即可。
五、upstream_least_conn模块
功能:从所有上游服务器中,找出当前并发连接数最少的一个,将请求转发到它
如果出现多个最少连接服务器的连接数都是一样的,使用round-robin算法
模块:ngx_http_upstream_least_conn_module,通过--without-http_upstream_ip_hash_module禁用模块。
指令:
语法:least_conn;
Context:upstream
六、upstream_zone模块
功能:分配出共享内存,将其他upstream模块定义的负载均衡策略数据、运行时每个上游服务器的状态数据存放在共享内存上,以对所有nginx worker进程生效
模块:ngx_http_upstream_zone_module,通过--without-http_upstream_zone_module禁用。
指令
语法:zone name [size];
Context:upstream
upstream模块间的顺序
ngx_http_upstream_hash_module
ngx_http_upstream_ip_hash_module
ngx_http_upstream_lease_conn_module
ngx_http_upstream_random_module
ngx_http_upstream_keepalive_module
ngx_http_upstream_zone_module
upstream提供的变量(不含cache)
upstream_connect_time:与上游服务器建立连接消耗的时间,单位为秒,精确到毫秒
upstream_header_time:接收上游服务器发回响应中http头部所消耗的时间,单位为秒,精确到毫秒
upstream_response_time:接收完整的上游服务响应所消耗的时间,单位为秒,精确到毫秒
upstream_http_名称:从上游服务返回的响应头部的值
upstream_bytes_received:从上游服务接收到的响应长度,单位字节
upstream_response_length:从上游服务返回的响应包体长度,单位字节
upstream_status:上游服务返回的HTTP响应中的状态码,如果未连接上,该变量值是502
upstream_cookie_名称:从上游服务发回的响应头Set-Cookie中取出的cookie值
upstream_trailer_名称:从上游服务的响应尾部取到的值