美文网首页程序员
nginx实现负载均衡

nginx实现负载均衡

作者: 闲睡猫 | 来源:发表于2019-04-05 11:35 被阅读0次

    一个网站要保持高可用,绝对要避免单点故障,即只有一台服务器提供web服务,当这台服务器宕机时,流量进不来,意味着白花花的钱就丢了。

    负载均衡方案

    负载均衡就是为了解决单点故障而出现的方案,分为两种:

    • GSLB

    举个例子:同一个网址,文泰来在北京访问,骆冰在杭州访问,并非直接访问到web服务器,而是访问调度中心,调度中心会根据ip所在地,分配一个与请求者最近的web服务器ip,再去访问该web服务器

    这种方式能最大限度地提高请求者的访问速度,但成本大,搭建也不容易,对于中小企业要弄这样一套负载均衡并不划算。通常是直接使用第三方提供的服务,如阿里云的付费负载均衡

    • SLB

    对于没什么流量,关键是没什么钱的个人、中小企业,自然是玩不起GSLB,直接用nginx搭建免费的SLB就是最佳选择。

    这个原理很简单,nginx通过proxy_pass,根据配置在upstream_server的web服务器,进行调度分配

    nginx实现负载均衡

    image

    在服务器不多的情况下,可以用一台服务器开不同的端口来模拟负载均衡,如用8001,8002,8003三个端口模拟三台服务器,nginx的配置如下:

    upstream_test.conf

    upstream test  {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
    server {
        listen 80;
        server_name www.test.com;
        access_log /var/log/nginx/test_proxy.access.log main;
    
        location / {
            proxy_pass http://test;
            include proxy_params;
        }
    }
    

    检测配置是否正确:

    nginx -tc /etc/nginx/nginx.conf
    

    重启nginx后,访问域名,每次刷新都会访问不同的服务器,因为默认是采用了轮询策略

    那么问题来了,当其中一台服务器宕机了,会不会当指派到这台服务器时,就报服务器错误呢?

    使用iptable模拟一台服务器宕机:

    iptables -I INPUT -p tcp --dport 8002 -j DROP
    

    此时再访问,发现负载均衡策略会智能地忽略掉宕机的服务器

    upstream语法

    upsteam backend {
    server backend1.example.com weight=5;
    server backend2.exmaple.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080 backup;
    server backup2.example.com:8080 backup;
    }

    状态说明:

    • down 当前的server不参与负载均衡

    • backup 预留的备份服务器,当其他服务器宕机后,会自动启用

    • max_fails 允许请求失败的次数

    • fali_timeout 经过max_falis失败后,服务暂停的时间

    • max_conns 限制最大的接收的连接数

    调度算法

    算法 说明
    轮询 按时间顺序逐一分配到不同的后端服务器
    加权轮询 weight值越大,分配到的访问几率越高
    ip_hash 每个请求按访问ip的hash结果分配,同一个ip固定访问一个web服务器
    url_hash 按url的hash结果分配
    least_conn 优先分配给连接少的机器
    hash 数值 按自定义的hash值

    实例:

    upstream test  {
        hash $request_uri;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
    

    相关文章

      网友评论

        本文标题:nginx实现负载均衡

        本文链接:https://www.haomeiwen.com/subject/hwphiqtx.html