linux 下 nginx的负载均衡

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;
    }
}
site2.conf和site3.conf的配置同site1.conf,只是端口、日志文件和目录地址需要修改。
 
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;
修改后的site.conf文件如下:
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 次失败后,暂停的时间。

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...