vlambda博客
学习文章列表

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.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 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.xin8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin8012 server response
//hash模块根据参数username返回固定数据[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=c8012 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=a8011 server response[root@iZwz9he4lwjhlld6pjd1yaZ sbin]# curl blog.zhanghq.xin?username=a8011 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_名称:从上游服务的响应尾部取到的值