Loading

Nginx系列之负载均衡和反响代理

NGINX介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
实现Nginx负载均衡的组件主要有两个:

ngx_http_proxy_module proxy     代理模块,用于把请求后抛给服务器节点或upstream服务器池
ngx_http_upstream_module        负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

upstream模块

upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,

具体写法为:proxy_pass http://syaving;
其中syaving就是一个upstream节点服务器组名字,例如

upstream syaving {
          server 172.16.7.1:8080 weight=1  max_fails=1 fail_timeout=10s;
          server 172.16.7.2:8080 weight=2  max_fails=1 fail_timeout=10s;
          server 172.16.7.3:8080 weight=5  max_fails=1 fail_timeout=10s;
}

server {
            listen 80;
            server_name www.syaving.com;
            access_log /data/logs/nginx/xtapi_accese.log combined;

   location / {
            proxy_pass http://syaving;
            include    proxy.conf;
            }
}

配置说明:

  • upstream模块的内容应放于nginx.conf配置的http标签内,默认调度节点算法是wrr(权重轮询,weighted round-robin)
  • server:负载均衡后面的rs配置,可以是ip或域名
  • weight:服务器的权重,默认值为1,越大表示接受的请求比例越大
  • max_fails:nginx尝试连接后端主机失败的次数,这个数值是配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用的,当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503 backup:热备配置(rs节点的高可用),当前面激活的rs都失败后会自动启动用热备rs,这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求;当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup
  • fail_timeout:在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s
  • down:表示服务器永远不可用,可配合ip_hash使用

upstream模块调度算法
调度算法一般分为两类:
第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如rr,wrr,ip_hash等

第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获的请求,响应时间短的优先获得请求,例如:least_conn,fair等

常见的调度算法
rr轮询:round-robin,默认调度算法,静态调度算法,按照客户端请求顺序逐一分配到不同的后端节点服务器,宕机的服务器会被自动从节点服务器池中剔除。

rr权重轮询:静态调度算法,在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多

ip_hash:静态调度算法,每个请求按客户端IP的Hash值分配,当新的请求到达时,先将其客户端IP通过哈希算法计算出一个值,在随后的客户端请求中,客户端IP的哈希值只要相同,就会被分配到同一台服务器,可以解决动态网页的session共享问题,但也会引起分配不均的弊端

fair:动态调度算法,此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配,可以依据页面大小和加载时间舱段智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。需要下载Nginx的相关模块upstream_fair

least_conn:根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发

url_hash:根据访问URL的hash结果来分配请求的,让每个URL定向到同一个后端服务器,后端服务器为缓存服务器时效果显著,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包

一致性hash:一般用于代理后端业务为缓存服务(squid,memcached)的场景,通过将用户请求的uri或者指定字符串进行计算,然后调度到后端的服务器上,此后任何用户查找同一个uri或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的,一致性hash算法可以解决后端某个或者几个节点宕机后,缓存的数据动荡最小

http_proxy_module模块

proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过location功能匹配指定的uri,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池
简单配置实例

   location / {
            proxy_pass http://10.0.0.1:8080;
            include    proxy.conf; #这里我把所有的proxy放到一个文件里面进行include调用,下面有介绍
            }

模块参数
proxy_set_header:设置http请求header项传给后端服务器节点,例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址
client_body_buffer_size:用于指定客户端请求主题缓冲区大小
proxy_connect_timeout:表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout:表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接
proxy_read_timeout:设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx等待后端服务器的响应时间,其实是nginx已经后端的排队之中等候处理的时间
proxy_buffer_size:设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers:设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区
proxy_busy_buffers_size:用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2
proxy_temp_file_write_size:指定proxy缓存临时文件的大小

proxy.conf文件如下

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;                  #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;                 #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout   300;                  #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout      30;                   #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout      30;                   #连接成功后,后端服务器响应时间(代理接收超时)
proxy_next_upstream    http_502 http_504 http_404 error timeout invalid_header;
proxy_buffer_size       4k;            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers           4 32k;         #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;           #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;        #设定缓存文件夹大小,大于这个值,将从upstream服务器传

#proxy_cache cache;
#proxy_cache_valid 200 304 1h;
#proxy_cache_valid 404 1m;
#proxy_cache_key $uri$is_args$args;
#add_header  Nginx-Cache "$upstream_cache_status";


#proxy_http_version 1.1;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "Upgrade";

 

posted @ 2017-12-05 19:25  宋某人  阅读(528)  评论(0编辑  收藏  举报