rinald_未来往事

Nginx upstream模块

Apache/Nginx
Nginx upstream模块使用及介绍:

Nginx upstream模块主要提供数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发使nginx有能力构建一个网络应用的关键组件。当然,一个网络应用的关键组件往往一开始都会考虑通过高级开发语言编写,因为开发比较方便,但系统到达一定规模,需要更重视性能的时候,这些高级语言为了达成目标所做的结构化修改所付出的代价会使nginx的upstream模块就呈现出极大的吸引力,因为他天生就快。作为附带,nginx的配置提供的层次化和松耦合使得系统的扩展性也可能达到比较高的程度。如果你对Nginx反向代理感兴趣,可以查看本博客另外一篇文章《Nginx反向代理安装配置》。

言归正传,下面介绍upstream的用法:

每个设备的状态设置为:
1.down 表示当前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup:其它所有非backup机器down、忙的时候或不可用的时候,请求会转发到backup机器,所以这台机器一般压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
client_body_in_file_only 设置为On 可以将client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

Nginx upstream的分配方式:

1、后端服务器
通过 upstream 可以设定后端服务器,指定的方式可以是 IP 地址与端口、域名、UNIX 套接字(socket)。其中如果域名可以被解析为多个地址,则这些地址都作为 backend。例如:

  1. upstream realserver {
  2. server a.fity.cn;
  3. server b.fity.cn:8001;
  4. }

2、负载均衡策略:
Nginx 提供轮询(round robin)、用户 IP 哈希(client IP)和指定权重 3 种方式。
A、轮询(round robin 默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

B、weight(指定权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:

  1. upstream pollll{
  2.  server 192.168.2.200 weight=10;
  3.  server 192.168.2.210 weight=10;
  4. }

C、ip_hash(用户ip哈希 client IP)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
再介绍一个和 ip_hash 配合使用的关键字:down。当某个一个 server 暂时性的宕机(down)时,你可以使用“down”来标示出来,并且这样被标示的 server 就不会接受请求去处理。要注意的是 weight 与 ip_hash 是不能同时使用的,原因很简单,他们是不同且彼此冲突的策略。
例如:

  1. upstream pollserver{
  2.  ip_hash;
  3.  server 192.168.2.200:8001;
  4.  server 192.168.2.210:8002;
  5.  server proxy.fity.cn:8005 down;
  6. }

3、重试策略:
可以为每个 realserver指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails 和 fail_timeout。如下所示:

  1. upstream realserver{
  2. server proxy.fity.cn weight=5;
  3. server proxy.fity.cn:8085 max_fails=3 fail_timeout=30s;
  4. }

在上例中,最大失败次数为 3,也就是最多进行 3 次尝试,且超时时间为 30秒。max_fails 的默认值为 1,fail_timeout 的默认值是 10s。传输失败的情形,由 proxy_next_upstream 或 fastcgi_next_upstream 指定。而且可以使用 proxy_connect_timeout 和 proxy_read_timeout 控制 upstream 响应时间。
有一种情况需要注意,就是 upstream 中只有一个 server 时,max_fails 和 fail_timeout 参数可能不会起作用。导致的问题就是 nginx 只会尝试一次 upstream 请求,如果失败这个请求就被抛弃了,解决的方法,比较取巧,就是在 upstream 中将你这个可怜的唯一 server 多写几次:

  1. upstream realserver{
  2. server proxy.fity.cn max_fails fail_timeout=30s;
  3. server proxy.fity.cn max_fails fail_timeout=30s;
  4. server proxy.fity.cn max_fails fail_timeout=30s;
  5. }

4、备机策略:
从 Nginx 的 0.6.7 版本开始,可以使用“backup”关键字。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。举例如下:

  1. upstream realserver{
  2. server proxy.fity.cn;
  3. server proxy.fity.cn:8001 backup;
  4. server proxy.fity.cn:8005;
  5. }

5、扩展策略:
A、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  1. upstream realserver{
  2.  server 192.168.2.200:8001;
  3.  server 192.168.2.210:8002;
  4.  fair;
  5. }

B、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

至此,你应该对Nginx upstream有个基本的了解了,例如如下反向代理写法:

  1. upstream realBackServer{
  2. server a.fity.cn:8001 weight=4 max_fails=2 fail_timeout=30s;
  3. server a.fity.cn:8002 weight=4 max_fails=2 fail_timeout=30s;
  4. }
  5. server{
  6. listen 80;
  7. server_name fity.cn;
  8. index index.php index.html index.htm; #默认首页
  9. location / {
  10. sub_filter_once off; #搜索替换全部行
  11. proxy_pass http://realBackServer;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. proxy_set_header Accept-Encoding ""; #清除编码
  15. }
  16. }
原文作者:rinald
原文地址:http://fity.cn/post/549.html
互联网技术更新较快,本站很多文章具有实效性,我会及时更新原文,但转载的文章无法通知更新。为了不给读者造成困惑或误导,请您在转载时保留此出处信息,尊重别人也是尊重自己。

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。