Nginx负载均衡与高可用的实现

当生产环境里有很大的流量产生时,通常需要用负载均衡技术来做优化,并确保容错配置。Nginx不光可以实现Web Server,还可以作为HTTP负载均衡来分发流量给后端的应用程序服务器,以此来提高性能。Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。

Nginx常用负载均衡算法:

轮询(默认算法)——每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力

加权轮询——权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况

IP HASH——当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站SESSION共享问题

upstream模块常用参数说明:

server 192.168.0.100:80    负载均衡后端RealServer的IP或者域名,口不写的话默认80。高并发场景用域名,再通过DNS进行负载均衡  
 weight=5    权重,默认为1,权重越大接收的请求越多  
 max_fails=2    最大尝试的失败次数,默认为1,0表示禁止失败尝试  
 fail_timeout=10s    失败超时时间,默认是10秒,通常3s左右比较合适  
 backup    热备配置,前段RealServer出现问题后会自动上线backup服务器  
 down    标志务器不可用,这个参数通常配合IP_HASH使用  

Nginx负载均衡设置:

默认的负载均衡配置

http {        #upstream模块包含在http模块下
    upstream  linuxidc{        #定义upstream名字,下面会引用
        server 192.168.1.100;        #指定后端服务器地址
        server 192.168.1.110;        #指定后端服务器地址
        server 192.168.1.120;        #指定后端服务器地址
    }

server {
        listen 80;
        server name ;
        location / {
            proxy_pass ;        #引用upstream
        }
    }
}

在上面的例子中,当用户访问站点时,Nginx会负载平衡分配给后端的三个服务器。

加权负载均衡

http {     
    upstream  linuxidc{       
        server 192.168.1.100 weight=3;        #指定后端服务器地址,权重为3
        server 192.168.1.110;     
    }

server {
        listen 80;
        server name ;
        location / {
            proxy_pass ;       
        }
    }
}

在上面配置中,每3个请求分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去。

IP HASH负载均衡

upstream linuxidc {
    ip_hash;        #采用IP HASH算法
    server 192.168.1.100;
    server 192.168.1.110;
    server 192.168.1.120;
}

如果需要将客户与后端一台服务器“绑定”起来,可以使用ip-hash负载平衡机制。这样可以确保来自相同客户机的请求总是指向相同的服务器除非该服务器不可用。

Nginx高可用的实现,利用backup标签,可以实现高可用,当主服务挂掉后,backup服务器会自动接管服务,当主服务恢复后,backup也会自动放弃服务

http {     
    upstream  linuxidc{       
        server 192.168.1.100
        server 192.168.1.110 backup; 
    }
    server {
        listen 80;
        server name ;
        location / {
            proxy_pass ;       
        }
    }
}

Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器。

http_proxy_module模块常用参数:

proxy_set_header:让后端服务器能获取到前端用户真实IP,而不只是代理服务器的IP

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b64eb6199b1e891f68b4720f1d892873.html