未来往事

Nginx upstream模块 不指定

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

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

Nginx upstream的分配方式:
1、后端服务器
通过 upstream 可以设定后端服务器,指定的方式可以是 IP 地址与端口、域名、UNIX 套接字(socket)。其中如果域名可以被解析为多个地址,则这些地址都作为 backend。例如:
upstream realserver {
    server a.fity.cn;
    server b.fity.cn:8001;
}

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

B、weight(指定权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream pollll{
 server 192.168.2.200 weight=10;
 server 192.168.2.210 weight=10;
}

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

3、重试策略:
可以为每个 realserver指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails 和 fail_timeout。如下所示:
upstream realserver{
    server proxy.fity.cn weight=5;
    server proxy.fity.cn:8085 max_fails=3 fail_timeout=30s;
}
在上例中,最大失败次数为 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 多写几次:
upstream realserver{
    server  proxy.fity.cn max_fails fail_timeout=30s;
    server  proxy.fity.cn max_fails fail_timeout=30s;
    server  proxy.fity.cn max_fails fail_timeout=30s;
}

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

5、扩展策略:
A、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream realserver{
 server 192.168.2.200:8001;
 server 192.168.2.210:8002;
 fair;
}

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

至此,你应该对Nginx upstream有个基本的了解了,例如如下反向代理写法:
upstream realBackServer{
            server a.fity.cn:8001 weight=4 max_fails=2 fail_timeout=30s;
            server a.fity.cn:8002 weight=4 max_fails=2 fail_timeout=30s;
}

server{
            listen 80;
            server_name  fity.cn;
            index index.php index.html index.htm;       #默认首页
            location / {
                    sub_filter_once off; #搜索替换全部行
                    proxy_pass http://realBackServer;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Accept-Encoding ""; #清除编码
            }
    }


作者:Rinald @『未来往事 | 记录生活,存储回忆!
原文地址:http://fity.cn/post/549/
本站采用「署名 4.0 国际(CC BY 4.0)」创作共享协议。通俗地讲,只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作,允许商业性使用。除非在文章正文内单独说明,本站欢迎各种形式的转载。互联网技术更新很快,本站很多文章都具有实效性,我会及时更新原文,但转载的文章无法通知更新。为了不给读者造成困惑或误导,请大家在转载时保留此出处信息。
发表评论
  昵称 [注册]
  密码 (游客无需密码)
  网址
  电邮(电子邮件地址不会被公开, 仅用于接收评论回复提醒使用)
OpenID登入 权限选项 表情