一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux环境下Nginx 通过upstream如何配置负载均衡以及实现

时间:2016-09-20 编辑:简简单单 来源:一聚教程网

一,服务器准备情况,四台:

1,前段服务器:
192.168.1.112  hosts定向测试域名nginx.21yunwei.com
192.168.1.113 备用前端服务器。
后端web服务器池web_pools:
192.168.1.102
192.168.1.103

2,环境:统一centos 6

前端服务器安装nginx。环境安装这里就不写了,可以参考文章《linux下如何安装nginx环境配置》部署nginx环境。
后端web服务器 池统一安装apache:yum install httpd -y 并关闭防火墙。否则会出现前端服务器无法请求web池情况。

二,nginx负载均衡配置。

1,修改nginx配置文件。

egrep  -v  "#| ^$" nginx.conf.default > nginx.conf
处理配置文件并输出到nginx.conf,这里清除了注释行和空行,方便直观查看nginx配置文件。
我们知道nginx负载均衡是通过ngx_http_upstream_module这个模块来实现的,详情可以查看官网http://nginx.org/en/docs/http/ngx_http_upstream_module.html介绍。
修改后的配置文件如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
upstream web_pools {
    server 192.168.1.102:80      weight=5;  //192.168.1.102web节点服务器,权重5.权重越大,越优先分配。
    server 192.168.1.103:80      weight=5;  //192.168.1.103web节点服务器,权重5.测试使用,可以根据实际环境进行权重分配。
    server 192.168.1.104:80      weight=5   backup; // 备用节点服务器,如果之前启用的web节点挂了,备用服务器将进行启用访问。

}
 
    server {
        listen       80;
        server_name  nginx.21yunwei.com;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://web_pools;
        }
    }
}


Nginx模块upstream_module详细介绍以及调度算法

一,upstream模块介绍
nginx负载均衡就是依赖于ngx_http_upstream_module模块,支持代理方式有proxy_pass(前边我们用到的)  、fastcgi_pass、  memcached_pass。运行原理是前端访问的时候,请求到哪个主机,执行到后边定义的比如proxy_pass(单独笔记知识点),就会按照我们定义的upstream 名称执行对应的模块,比如《Linux环境下Nginx 通过upstream如何配置负载均衡以及实现》定义的web_pools这个web池。然后按照upstream定义的服务器以及设置好的算法进行分发执行。
二,upstream语法
以我们之前定义的文件为例:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
upstream web_pools {
    server 192.168.1.102:80      weight=5  max_fails=3 fail_timeout=3;
    server 192.168.1.103:80      weight=5  max_fails=3 fail_timeout=3;
    server 192.168.1.104:80      weight=5   backup;
    keepalive 500;
}
 
    server {
        listen       80;
        server_name  nginx.21yunwei.com;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://web_pools;
        }
    }
}
三,upstream模块说明
1,upstream必须放到http{}标签中。
2,默认算法是wrr,权重轮训。
3,upstream内部参数说明:
  server 192.168.1.102:80      weight=5;  定义的真实服务器,可以是IP也可以是域名,端口可以不写,默认80。如改成其他端口需要指定。
  weight:表示当前指定server负载权重,权重越大,被请求的几率越大。默认权重为1.
  down:表示当前server已停用
  backup:表示当前server是备用服务器,非backup服务器挂了以后该服务器将会启用。注意:当服务器都down才会启用备用服务器。
  max_fails:最大尝试失败次数,默认1。如设置0,则表示禁止尝试。根据实际需要来配置,一般配置2-3或更高。
  fail_timeout:失败超时时间。默认10s,一般配置2-3秒就可以了。常于max_fails结合使用。
  max_conns:并发连接数。保护节点服务器参数。
keepalive 300; 长连接最大连接数。
四,upstream模块调度算法方式。
        Nginx的upstream支持5种分配方式。其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、rr轮询    
        轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。按照1:1轮询。
        upstream backend {
            server 192.168.1.101:88;
            server 192.168.1.102:88;
        }
2、wrr轮询。      
        轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
        upstream backend {
            server 192.168.1.101 weight=1;
            server 192.168.1.102 weight=2;
            server 192.168.1.103 weight=3;
        }
3、ip_hash       
        每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
        upstream backend {
            ip_hash;
            server 192.168.1.101:81;
            server 192.168.1.102:82;
            server 192.168.1.103:83;
        }
4、fair       
        fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。
        upstream backend {
            server 192.168.1.101;
            server 192.168.1.102;
            fair;
        }
5、url_hash
        与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
        upstream backend {
            server 192.168.1.101;
            server 192.168.1.102;
            hash $request_uri;
            hash_method crc32;
        }
hash_method为使用的hash算法,需要注意的是:server语句中不能加weight等参数。后边两种目前作了解即可。

热门栏目