负载均衡的基本知识以及使用nginx进行负载均衡的简单例子

nginx一般可以用于七层的负载均衡,这篇文章将介绍一些负载均衡的基本知识以及使用nginx进行负载均衡的简单的例子。

四层负载均衡 vs 七层负载均衡

经常会说七层负载均衡还是四层负载均衡,其实根据ISO的OSI网络模型的所在层的叫法而决定的,nginx因为在使用http协议在应用层进行负载均衡的操作,所以被称为七层负载均衡。而诸如LVS在TCP层进行负载均衡操作的则被称为四层负载均衡。一般来说,有如下层的负载均衡分类:

负载均衡的基本知识以及使用nginx进行负载均衡的简单例子 nginx 第1张

常见软件的支持

负载均衡的基本知识以及使用nginx进行负载均衡的简单例子 nginx 第2张

常见的负载均衡算法

负载均衡常见有如下几种算法:

负载均衡的基本知识以及使用nginx进行负载均衡的简单例子 nginx 第3张

负载均衡演示实例:普通轮询

接下来使用nginx来演示一下如何进行普通轮询:

负载均衡的基本知识以及使用nginx进行负载均衡的简单例子 nginx 第4张

事前准备

事前在7001/7002两个端口分别启动两个服务,用于显示不同信息,为了演示方便,使用tornado做了一个镜像,通过docker容器启动时传递的参数不同用于显示服务的不同。

  [root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7001"  ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57  [root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7002"  95deadd795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951  [root@kong ~]#   [root@kong ~]# curl http://192.168.163.117:7001  Hello, Service :User Service 1: 7001  [root@kong ~]#   [root@kong ~]# curl http://192.168.163.117:7002  Hello, Service :User Service 1: 7002  [root@kong ~]# 

启动nginx

  [root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx   9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74  [root@kong ~]# docker ps |grep nginx-lb  9d53c7e9a45e    nginx           "nginx -g 'daemon ..."  11 seconds ago   Up 10 seconds    0.0.0.0:9080->80/tcp                         nginx-lb  [root@kong ~]#

nginx代码段

准备如下nginx代码段将其添加到nginx的/etc/nginx/conf.d/default.conf中

  http {  upstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;  }  server {    listen    80;    server_name www.liumiao.cn 192.168.163.117;    location / {      proxy_pass http://nginx_lb;    }  }

修改default.conf的方法

可以通过在容器中安装vim达到效果,也可以在本地修改然后通过docker cp传入,或者直接sed修改都可。如果在容器中安装vim,使用如下方式即可

  [root@kong ~]# docker exec -it nginx-lb sh  # apt-get update  ...省略  # apt-get install vim  ...省略

修改前

  # cat default.conf  server {    listen    80;    server_name localhost;    #charset koi8-r;    #access_log /var/log/nginx/host.access.log main;    location / {      root  /usr/share/nginx/html;      index index.html index.htm;    }    #error_page 404       /404.html;    # redirect server error pages to the static page /50x.html    #    error_page  500 502 503 504 /50x.html;    location = /50x.html {      root  /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ .php$ {    #  proxy_pass  http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ .php$ {    #  root      html;    #  fastcgi_pass  127.0.0.1:9000;    #  fastcgi_index index.php;    #  fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;    #  include    fastcgi_params;    #}    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /.ht {    #  deny all;    #}  }  #

修改后

  # cat default.conf  upstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;  }  server {    listen    80;    server_name www.liumiao.cn 192.168.163.117;    #charset koi8-r;    #access_log /var/log/nginx/host.access.log main;    location / {      #root  /usr/share/nginx/html;      #index index.html index.htm;      proxy_pass http://nginx_lb;    }    #error_page 404       /404.html;    # redirect server error pages to the static page /50x.html    #    error_page  500 502 503 504 /50x.html;    location = /50x.html {      root  /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ .php$ {    #  proxy_pass  http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ .php$ {    #  root      html;    #  fastcgi_pass  127.0.0.1:9000;    #  fastcgi_index index.php;    #  fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;    #  include    fastcgi_params;    #}    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /.ht {    #  deny all;    #}  }  #

重启nginx容器

  [root@kong ~]# docker restart nginx-lb  nginx-lb  [root@kong ~]#

确认结果

可以清晰地看到按照顺序,进行轮询:

[root@kong ~]# curl
Hello, Service :User Service 1: 7001
[root@kong ~]# curl
Hello, Service :User Service 1: 7002
[root@kong ~]# curl
Hello, Service :User Service 1: 7001
[root@kong ~]# curl
Hello, Service :User Service 1: 7002
[root@kong ~]#

负载均衡演示实例:权重轮询

而在此基础上,进行权重轮询只需要加上weight即可

负载均衡的基本知识以及使用nginx进行负载均衡的简单例子 nginx 第5张

修改default.conf

按照如下修改default.conf

  # cp default.conf default.conf.org  # vi default.conf  # diff default.conf default.conf.org  2,3c2,3  <   server 192.168.163.117:7001 weight=100;  <   server 192.168.163.117:7002 weight=200;  ---  >   server 192.168.163.117:7001;  >   server 192.168.163.117:7002;  #

重启nginx容器

  [root@kong ~]# docker restart nginx-lb  nginx-lb  [root@kong ~]#

确认结果

可以看到轮询结果按照1/3和2/3的比重在进行了:

[root@kong ~]# curl
Hello, Service :User Service 1: 7001
[root@kong ~]# curl
Hello, Service :User Service 1: 7002
[root@kong ~]# curl
Hello, Service :User Service 1: 7002
[root@kong ~]#

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

参与评论