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组合实现高并发场景的动静分离和负载均衡方案

posted @ 2018-12-24 21:46  那啥快看  阅读(...)  评论(...编辑  收藏