怎么使用nginx进行负载均衡

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

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

怎么使用nginx进行负载均衡

常见软件的支持

怎么使用nginx进行负载均衡

常见的负载均衡算法

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

怎么使用nginx进行负载均衡

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

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

怎么使用nginx进行负载均衡

事前准备

事前在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进行负载均衡

修改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; >   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 ~]#

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享