nginx是如何实现负载均衡的,nginx的upstream目前支持以下几种方式的分配:



1、轮询(默认)



每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。



 



2、weight



指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。



 



2、ip_hash



每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。



 



3、fair(第三方)



按后端服务器的响应时间来分配请求,响应时间短的优先分配。



 



4、url_hash(第三方)



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



 



一、准备环境如下:



1、我们配置四个nginx的虚拟主机,分别如下:



www.site.com
127.0.0.1:8081
127.0.0.1:8082
127.0.0.1:8083



site1.conf的配置如下:



server {
    #监听的端口号
    listen       8081;
    #虚拟主机名
    server_name  127.0.0.1;
    #编码
    charset utf-8;
    #访问日志
    access_log  logs/site1.access.log combined;
    
    location / {
        #网站路径
        root   /data/wwwroot/site1;
        #默认首页文件
        index  index.html index.htm index.php;
    }

    #在http中加入fastcgi_intercept_errors on;
    #配置404信息
    error_page 404 /404.html;
    #配置500信息
    error_page 500 502 503 504 /50x.html;

    #缓存图片资源
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 15d;
    } 

    #缓存js、css资源
    location ~ .*\.(js|css)$ {
        expires 1d;
    }

    #对php的支持
    location ~ \.php$ {
        root           /data/wwwroot/site1;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}



 



2、三个站点下分别创建index.html,方便查看访问了哪个虚拟主机



<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    我是站点一
</body>
</html>



二、配置好上述三台虚拟主机后,我们需要在nginx.conf的http{}节点中设置upstream



#注意这里的myserver,可自定义
upstream myserver {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    server 127.0.0.1:8083;
}



三、在需要负载的虚拟主机配置文件中添加



proxy_pass http://myserver;



server {
    #监听的端口号
    listen       80;
    #虚拟主机名
    server_name  www.site.com;
    
    location / {
        #注意这里的myserver要与你upstream中的命名一致
        proxy_pass http://myserver;
 
        proxy_redirect off;

        #注意,如果是本地反向代理并且端口不区分时(比如:都是用的80端口)
        #需要把下面这行注释,不然会产生死循环
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        #后端服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}



四、我们重启nginx,通过浏览器访问www.site.com。



我们刷新浏览器,可以看到,网站出现的内容,会随着你的刷新,轮询显示站点一,站点二,站点三。



 



五、upstream中的配置



upstream myserver {
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=2;
    server 127.0.0.1:8083 weight=3;
}



weight默认为1,weight越大,负载的权重就越大。



upstream myserver {
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=1;
    server 127.0.0.1:8083 down;
}



down表示当前的server暂时不参与负载



upstream myserver {
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=1;
    server 127.0.0.1:8083 backup;
}

backup其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。


upstream myserver {
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=1;
    server 127.0.0.1:8083 max_fails=3 fail_timeout=30s;
}

max_fails允许请求失败的次数默认为1,当超过最大次数时返回proxy_next_upstream 模块定义的错误


fail_timeout当max_fails 次失败后,暂停的时间。