Nginx实现反向代理和负载均衡

正向代理和反向代理的概念

代理(Proxy)服务,通常也称为正向代理服务。如果把局域网外Internet想象成一个巨大的资源库,那么资源就分布在Internet的各个站点上,局域网内的客户端要访问这个库里的资源必须统一通过代理服务器才能对各个站点进行访问。

局域网内的机器借助代理服务访问局域网外的网站,这主要是为了增强局域网内部网络的安全性,使得外网的威胁因素不容易影响到网外,这里代理服务器起到了一部分防火墙的功能。同时,利用代理服务器也可以对局域网对外网的访问进行必要的监控和管理。正向代理服务器不支持外部对内部网络的访问请求。

与正向代理服务相反,如果局域网向Internet提供资源,让Internet上的其他用户可以访问局域网内的资源,也可以设置使用一个代理服务器,它提供的服务就叫做反向代理(Reverse Proxy)服务。

正向代理服务器用来让局域网客户机接入外网以访问外网资源,反向代理服务器用来让外网的客户端接入局域网中的站点以访问站点中的资源。在正向代理服务器中,我们的角色是客户端,目的是要访问外网的资源;在反向代理服务器中,我们的角色是站点,目的是把站点的资源发布出去让其他客户端能够访问。

Nginx实现正向代理

很少用。。。

Nginx服务器的反向代理服务

它能够同时接收的客户端连接由worker_processes指令和worker_connections指令决定,计算方法为:worker_processes*worker_connections/4。

proxy_pass指令

该指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。

proxy_pass URL;

URL为要设置的被代理服务器的地址,包含传输协议、主机名称或IP地址加端口号、URI等要素。传输协议通常是“http”或者“https://”。指令同时还接受以“unix”开始的UNIX-domain套接字路径。

proxy_pass http://www.myweb.name/uri;
proxy_pass http://localhost:8000/uri/;
proxy_pass http://unix:/tmp/backend.socket:/uri/;

如果被代理服务器是一组服务器的话,可以使用upstream指令配置后端服务器组。

...
upstream proxy_svrs{                   #配置后端服务器组
  server http://192.168.1.1:8001/uri/;
  server http://192.168.1.2:8001/uri/;
  server http://192.168.1.3:8001/uri/;
}

server{
  ...
  listen 80;
  server_name www.myweb.name;
  location /{
    proxy_pass proxy_svrs;           #使用服务器组的名称
  }
}

在组内的各个服务器中都指明了传输协议“http://”,而在proxy_pass指令中就不需要指明了。如果将upstream指令的配置该为:

upstream proxy_svrs{
  server 192.168.1.1:8001/uri/;
  server 192.168.1.2:8001/uri/;
  server 192.168.1.3:8001/uri/;
}

我们就需要在proxy_pass指令中指明传输协议“http://”

proxy_pass http://proxy_svrs;

在使用该指令的过程中还要注意,URL中是否包含有URI,Nginx服务器的处理方式是不同的。如果URL中不包含URI,Nginx服务器不会改变原地址的URI;但是如果包含了URI,Nginx服务器将会使用新的URI替代原来的URI。

...
server{
  ...
  listen 80;
  server_name www.myweb.name;
  location /server/ {
    ...
    proxy_pass http://192.168.1.1;
  }
}

如果客户端使用“http://www.myweb.name/server”发起请求,由于proxy_pass指令的URL变量不含有URI,所以转向的地址为“http://192.168.1.1/server”。

...
server{
  ...
  listen 80;
  server_name www.myweb.name;
  location /server/ {
    ...
    proxy_pass http://192.168.1.1/loc/;
  }
}

proxy_pass指令的URI包含了URI“/loc/”。如果客户端使用“http://www.myweb.name/server”发起请求,将会把地址转向“http://192.168.1.1/loc/”。

在使用proxy_pass指令时,如果不想改变原地址中的URI,就不要在URL变量中配置URI。

问题:proxy_pass指令的URL变量末尾是否加斜杠“/”

#配置1: proxy_pass http://192.168.1.1;
#配置2: proxy_pass http://192.168.1.1/;

配置1和配置2的区别在于,配置2中proxy_pass指令的URL变量末尾添加了斜杠“/”,这意味着配置2中proxy_pass指令的URL变量包含了URI“/”,而配置1中proxy_pass指令的URL变量不包含URI。

...
server{
  ...
  listen 80;
  server_name www.myweb.name;
  location / {
    ...
    #配置1: proxy_pass http://192.168.1.1;
    #配置2: proxy_pass http://192.168.1.1/;
  }
}

在该配置中,location使用“/”作为uri变量的值来匹配不包含URI的请求URL。由于请求URL中不包含URI,因此配置1和配置2的效果是一样的。比如,客户端的请求URL为“http://www.myweb.name/index.htm”,其将会被实例1中的location块匹配成功并进行处理。不管使用配置1还是配置2,转向的URL都为:“http://192.168.1.1/index.htm”。

...
server{
  ...
  listen 80;
  server_name www.myweb.name;
  location /server/ {
    ...
    #配置1: proxy_pass http://192.168.1.1;
    #配置2: proxy_pass http://192.168.1.1/;
  }
}

该配置中,location块使用“/server/”作为uri变量的值来匹配包含URI“/server/”的请求URL。这时,使用配置1和配置2的转向结果就不相同了。使用配置1的时候,proxy_pass指令中的URL变量不包含URI,Nginx服务器将不改变原地址的URI;使用配置2的时候,proxy_pass指令中的URL变量包含URI“/”,Nginx服务器会将原地址的URI替换为“/”。

比如,客户端的请求URL为“http://www.myweb.name/server/index.htm”,使用配置1的使用,转向的URL为“http://192.168.1.1/server/index.htm”,原地址的URI“/server/”未被改变;但使用配置2时,转向的URI为“http://192.168.1.1/index.htm”,可以看到,原地址的URI“/server/”被替换为“/”。

Proxy Buffer和Proxy Cache的配置

在Nginx服务器中,Proxy Buffer和Proxy Cache都与代理服务相关,主要用来提供客户端与被代理服务器之间的交互效率。Proxy Buffer实现了被代理服务器响应数据的异步传输,Proxy Cache则主要实现Nginx服务器对客户端数据请求的快速响应。Nginx服务器在接收到被代理服务器的响应数据之后,一方面通过Proxy Buffer机制将数据传递给客户端,另一方面根据ProxyCache的配置将这些数据缓存到本地硬盘。当客户端下次要访问相同的数据时,Nginx服务器直接从硬盘检索到相应的数据返回给用户,从而减少与被代理服务器交互的时间。

Proxy Cache机制依赖于Proxy Buffer机制,只有在Proxy Buffer机制开启的情况下Proxy Cache的配置才发挥作用。

。。。

Nginx服务器的负载均衡

网络负载均衡技术的大致原理是利用一定的分配策略将网络负载平衡地分摊到网络集群的各个操作单元上,使得单个重负载任务能够分担到多个单元上并行处理,或者使得大量并发访问或数据流量分担到多个单元上分别处理。

在实际应用中,负载均衡会根据网络的不同层次(一般按照OSI的七层参考模型)进行划分。负载均衡技术主要实现和作用于网络的第四层或第七层,完全独立与网络基础硬件设备,称为单独的技术设备。Nginx服务器实现的负载均衡一般认为是七层负载均衡。

负载均衡主要通过专门的硬件设备实现或者通过软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本比较高,比如F5。通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性。

Nginx服务器负载均衡配置

主要使用的配置是proxy_pass指令和upstream指令。

配置实例一:对所有请求实现一般轮询规则的负载均衡

upstream backend{             #配置后端服务器组
  server 192.168.1.1:8001;
  server 192.168.1.2:8001;
  server 192.168.1.3:8001;    #默认weight=1
}

server{
  listen 80;
  server_name www.myweb.name;
  index index.html index.htm;

  location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    ...
  }
  ...
}

配置实例二:对所有请求实现加权轮询规则的负载均衡

权重越大,分配的请求越多

upstream backend{             #配置后端服务器组
  server 192.168.1.1:8001 weight=5;
  server 192.168.1.2:8001 weight=2;
  server 192.168.1.3:8001;    #默认weight=1
}

server{
  listen 80;
  server_name www.myweb.name;
  index index.html index.htm;

  location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    ...
  }
  ...
}

配置实例三:对特定资源实现负载均衡

upstream videobackend{
    server 192.168.1.1:8001;
    server 192.168.1.2:8001;
    server 192.168.1.3:8001;
}

upstream filebackend{
    server 192.168.1.5:8001;
    server 192.168.1.6:8001;
    server 192.168.1.7:8001;
}

server{
  listen 80;
  server_name www.myweb.name;
  index index.html index.htm;

  location /video/ {
    proxy_pass http://videobackend;
    proxy_set_header Host $host;
    ...
  }

  location /file/ {
    proxy_pass http://filebackend;
                                     #保留客户端的真实信息    
    proxy_set_header Host $host;
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    ...
  }
  ...
}

Nginx实现反向代理

两个域名指向同一台nginx服务器,用户访问不同的域名显示不同的网页内容。

两个域名是www.sina.com.cn和www.sohu.com

nginx服务器的地址为192.168.110.128

修改hosts,添加

192.168.110.128 www.sina.com.cn
192.168.110.128 www.sohu.com

安装两个tomcat一个端口号为8080,一个为8081。分别修改其index.jsp

<h1>${pageContext.servletContext.serverInfo}-sina</h1>
<h1>${pageContext.servletContext.serverInfo}-souhu</h1>

然后修改nginx.conf,添加

    upstream sina{
        server 192.168.110.128:8080;
    }
    server {
        listen       80;
        server_name  www.sina.com.cn;

        location / {
            proxy_pass   http://sina;
            index  index.html index.htm;
        }

    }

    upstream sohu{
        server 192.168.110.128:8081;
    }
    server {
        listen       80;
        server_name  www.sohu.com;

        location / {
            proxy_pass   http://sohu;
            index  index.html index.htm;
        }

    }   

然后重新加载配置文件

./nginx -s reload

之后访问http://www.sina.com.cn/http://www.sohu.com/就可以看到各自tomcat里边的东西了。

实现负载均衡

如果一个服务由多个服务器提供,需要把负载分配到不同的服务器处理,需要负载均衡。

我再复制一个tomcat3-8082,修改其server.xml

<Server port="7082" shutdown="SHUTDOWN">
 <Connector port="8082" protocol="HTTP/1.1"
 <Connector port="9082" protocol="AJP/1.3" redirectPort="8443" />

设置其index.jsp

<h1>${pageContext.servletContext.serverInfo}-souhu2</h1>

暴露8082端口号,设置开机启动,启动这个tomcat。

修改nginx.conf

    upstream sohu{
        server 192.168.110.128:8081;
        server 192.168.110.128:8082;
    }

然后重新加载配置文件

然后访问http://www.sohu.com/会发现有的时候页面为souhu,有的时候为sohu2。

可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,默认为1

    upstream sohu{
        server 192.168.110.128:8081;
        server 192.168.110.128:8082 weight=2;
    }

记得重新加载配置文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值