Py学习  »  NGINX

nginx实现负载均衡

塞亚猫 • 4 年前 • 358 次点击  

一个网站要保持高可用,绝对要避免单点故障,即只有一台服务器提供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;
}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31359
 
358 次点击