• Nginx(六):Nginx HTTP负载均衡和反向代理的配置与优化


    一、什么是负载均衡和反向代理

    随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须釆用多台服务器协同工作,以提高计算机系统的处理能力和计算强度,满足当前业务量的需求。而如何在完成同样功能的多个网络设备之间实现合理的业务量分配,使之不会出现一台设备过忙、而其他 的设备却没有充分使用的情况。要解决这一问题,可以釆用负载均衡的方法。 .

    二、负载均衡

    负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地 位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来 的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请 求。均衡负载能够平均分配客户请求到服务器阵列,藉此快速获取重要数据,解决大量并发访问 .服务问题。这种群集技术可以用最少的投资获得接近于大型主机的性能。

    Nginx负载均衡之upstream分配方式介绍

    Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:

    1、轮询         

            轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。

    upstream backend {
                server 192.168.1.101:8888;
                server 192.168.1.102:8888;
                server 192.168.1.103:8888;
            }

    2、weight        

            轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。

    upstream backend {
                server 192.168.1.101 weight=1;
                server 192.168.1.102 weight=2;
                server 192.168.1.103 weight=3;
            }

    3、ip_hash        

            每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题

    upstream backend {
                ip_hash;
                server 192.168.1.101:7777;
                server 192.168.1.102:8888;
                server 192.168.1.103:9999;
            }

    4、fair        

            fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。

    upstream backend {
                server 192.168.1.101;
                server 192.168.1.102;
                server 192.168.1.103;
                fair;
            }

    5、url_hash

            与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下

    upstream backend {
                server 192.168.1.101;
                server 192.168.1.102;
                server 192.168.1.103;
                hash $request_uri;
                hash_method crc32;
            }

            其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数

    三、反向代理

    反向代理(Reverse Proxy)是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此 时代理服务器对外就表现为一个服务器。

    通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器, 并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并 不会配置并使用这个代理服务器,普通代理服务器也被设计为在Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务 器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服 务器没有保存任何网页的真实数据,所有的静态网页或CGI程序,都保存在内部的Web服务器上。 因此对反向代理服务器的攻击并不会使网页信息遭到破坏,这样就增强了 Web菔务器的安全性。

    反向代理方式和包过滤方式或普通代理方式并无冲突,因此可以在防火墙设备中同时使用这两种 方式,其中反向代理用于外部网络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访 问方式并提供内部网络对外部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。

    四、常见的Web负载均衡方法

    Web负载均衡的方法有很多,下面介绍几种常见的负载均衡方式。

    常见的web负载均衡方法总结

    五、Nginx负载均衡与反向代理配置实例

    环境准备

    在服务器192.168.3.43上准备两台tomcat server,端口分别是8080和8082

    通过访问不同的域名访问运行在tomcat不同端口的服务器,中间使用nginx反向代理服务器

    8080.zcinfo.com 访问运行8080端口的tomcat

    8082.zcinfo.com 访问运行8081端口的tomcat

    反向代理示例

       upstream tomcatserver1 {
        server 192.168.3.43:8080;
        }
        upstream tomcatserver2 {
        server 192.168.3.43:8082;
        }
       server {
            listen       80;
            server_name  8080.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver1;
                index  index.html index.htm;
            }  
        }
        server {
            listen       80;
            server_name  8082.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver2;
                index  index.html index.htm;
            }
        }
    测试
     
    恭喜,nginx反向代理成功。

    负载均衡配置

      upstream tomcatserver1 {
        server 192.168.3.43:8080;
            server 192.168.3.43:8082; #多加了此台服务器
     }
        upstream tomcatserver2 {
        server 192.168.3.43:8082;
        }
       server {
            listen       80;
            server_name  8080.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver1;
                index  index.html index.htm;
            }  
        }
        server {
            listen       80;
            server_name  8082.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver2;
                index  index.html index.htm;
            }
        }

    如果两台服务器性能差不多这样设置重启nginx就行了,但是现在假如两台服务器性能不一样,还需要设置性能权重,让性能高服务器做更多事情。只需要加入weight=?就行了,如下:

    upstream tomcatserver1 {
        server 192.168.3.43:8080 weight=2;
        server 192.168.3.43:8082 weight=1; 
     }
        upstream tomcatserver2 {
        server 192.168.3.43:8082;
        }
       server {
            listen       80;
            server_name  8080.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver1;
                index  index.html index.htm;
            }  
        }
        server {
            listen       80;
            server_name  8082.zcinfo.com;
     
            #charset koi8-r;
     
            #access_log  logs/host.access.log  main;
     
            location / {
                proxy_pass   http://tomcatserver2;
                index  index.html index.htm;
            }
        }

    重新启动nginx,会发现8080出现了两次,8082出现一次这样轮循。

    ps:关于nginx负载均衡的一些参数介绍例子

    节点说明:
    在http节点里添加:
     
    #定义负载均衡设备的 Ip及设备状态 
    upstream myServer {   
     
        server 127.0.0.1:9090 down; 
        server 127.0.0.1:8080 weight=2; 
        server 127.0.0.1:6060; 
        server 127.0.0.1:7070 backup; 
    }
     
    在需要使用负载的Server节点下添加
     
    proxy_pass http://myServer;
     
    upstream 每个设备的状态:
     
    down 表示当前的server暂时不参与负载 
    weight  默认为1.weight越大,负载的权重就越大。 
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
    fail_timeout:max_fails 次失败后,暂停的时间。 
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

    测试

    恭喜,nginx反向代理和负载均衡搭建成功。

    更多参阅:Nginx+tomcat组合实现高并发场景的动静分离和负载均衡方案

  • 相关阅读:
    Assembly介绍
    How to be a Programmer
    (转) 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
    ClientScript.RegisterStartupScript()
    sql server日期时间转字符串
    GridView 全选
    C# 获取xml里的值
    web 点击按钮,根据点击确认进行下一步操作
    字符串宽相同
    FormClosing
  • 原文地址:https://www.cnblogs.com/shamo89/p/10174366.html
Copyright © 2020-2023  润新知