• 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";
  • 相关阅读:
    纹理贴图的模式设置
    vs debug或者release文件夹下的 .exe文件
    subpixel的概念
    点乘
    设置开机时自动开启和关闭的软件
    CF553E Kyoya and Train
    CF960G Bandit Blues
    玩游戏
    「SWTR03」Counting Trees
    CF623E Transforming Sequence
  • 原文地址:https://www.cnblogs.com/syavingcs/p/7907447.html
Copyright © 2020-2023  润新知