首页 > 技术文章 > Nginx反向代理

renlinsen 2021-01-11 15:28 原文

一、代理

  在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。

  可能大家不太明白这句话,再举一个现实生活中的例子:比如我们要买一套二手房,虽然我们可以自己去找房源,但是这太花费时间精力了,而且房屋质量检测以及房屋过户等一系列手续也都得我们去办,再说现在这个社会,等我们找到房源,说不定房子都已经涨价了,那么怎么办呢?最简单快捷的方法就是找二手房中介公司(为什么?别人那里房源多啊),于是我们就委托中介公司来给我们找合适的房子,以及后续的质量检测过户等操作,我们只需要选好自己想要的房子,然后交钱就行了。

  代理简单来说,就是如果我们想做什么,但又不想直接去做,那么这时候就找另外一个人帮我们去做。那么这个例子里面的中介公司就是给我们做代理服务的,我们委托中介公司帮我们找房子。

 

二、代理服务器

1、什么是代理服务器

  代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。 

 

 

 2、为什么要使用代理服务器 

  1)提高访问速度 

  由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户端再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。 

  2)防火墙作用 

  由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。 

  3)通过代理服务器访问不能访问的目标站点 

  互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的FQ浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。 

 

三、正向代理

  正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。

 

 

   举一个例子:大家都知道,现在国内是访问不了 Google的,那么怎么才能访问 Google呢?我们又想,美国人不是能访问 Google吗(这不废话,Google就是美国的),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问 Google了。你很聪明,VPN 就是这样产生的。我们在访问 Google 时,先连上 VPN 服务器将我们的 IP 地址变成美国的 IP 地址,然后就可以顺利的访问了。这里的 VPN 就是做正向代理的。

  PS:这里介绍一下什么是 VPN,VPN 通俗的讲就是一种中转服务,当我们电脑接入 VPN 后,我们对外 IP 地址就会变成 VPN 服务器的公网 IP,我们请求或接受任何数据都会通过这个VPN 服务器然后传入到我们本机。这样做有什么好处呢?比如 VPN 游戏加速方面的原理,我们要玩网通区的 LOL,但是本机接入的是电信的宽带,玩网通区的会比较卡,这时候就利用 VPN 将电信网络变为网通网络,然后在玩网通区的LOL就不会卡了(注意:VPN 是不能增加带宽的,不要以为不卡了是因为网速提升了)。

 

四、反向代理

  反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

  作用:现在许多大型web网站都用到反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。 

 

 

   理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。

  总结起来还是一句话:正向代理代理客户端,反向代理代理服务器。

 

五、Nginx 反向代理

  Nginx作为近年来较火的反向代理服务器,安装在服务器端,主要用于转发客户端请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台服务器来处理当前请求。

  Nginx 主要能够代理如下几种协议,其中用到的最多的就是做Http代理服务器。

 

 

   Nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。

  下面演示如何进行配置使Nginx发挥作用。 

  1、模拟n个http服务器作为目标主机 

    用作测试,简单的使用2个tomcat实例模拟两台http服务器,分别将tomcat的端口改为8081和8082 。

  2、配置IP域名 

    192.168.72.49  test8081.com 
    192.168.72.49  test8082.com 

  3、配置nginx.conf

#upstream表示负载服务器池,定义名字为tomcatserver1 的服务器池
upstream tomcatserver1 {  
    server 192.168.72.49:8081;  
}  
upstream tomcatserver2 {  
    server 192.168.72.49:8082;  
}  
server {  
        listen       80;  
        server_name  test8081.com;  
  
        #charset koi8-r;  
  
        #access_log  logs/test8081.com.log  main;  
  
        location / {  
            #反向代理服务器的地址        
proxy_pass http:
//tomcatserver1;
index index.html index.htm;
#下面这两条配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。 proxy_set_header Host $host;    proxy_set_header X
-Real-IP $remote_addr; } } server { listen 80; server_name test8082.com; #charset koi8-r; #access_log logs/test8082.com.log main; location / { proxy_pass http://tomcatserver2; index index.html index.htm; } }

  4、重启Nginx服务,验证结果

  命令:service nginx restart

  使用浏览器访问,由于nginx反向代理接受客户机请求,找到server_name为的server节点, 根据proxy_pass对应的http路径,将请求转发到upstream tomcatserver1上,即端口号为8081的tomcat服务器。

 

六、Nginx 反向代理相关指令介绍

1、listen

  该指令用于配置网络监听。主要有如下三种配置语法结构:

  1)配置监听的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];

  2)配置监听端口

listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];

  3)配置 UNIX Domain Socket

listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ssl];

  上面的配置看似比较复杂,其实使用起来是比较简单的:

1 listen  *:80 | *:8080     #监听所有80端口和8080端口
2 listen  IP_address:port   #监听指定的地址和端口号
3 listen  IP_address        #监听指定ip地址所有端口
4 listen  port              #监听该端口的所有IP连接

  下面分别解释每个选项的具体含义:

  ①address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。

  ②port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。

  ③path:socket文件路径,如 var/run/nginx.sock等。

  ④default_server:标识符,将此虚拟主机设置为 address:port 的默认主机(在 nginx-0.8.21 之前使用的是 default 指令)。

  ⑤setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。

  ⑥backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511。

  ⑦rcvbuf=size:设置监听socket接收缓存区大小。

  ⑧sndbuf=size:设置监听socket发送缓存区大小。

  ⑨deferred:标识符,将accept()设置为Deferred模式。

  ⑩accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready。

  ⑪bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的所有连接。

  ⑫ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。

2、server_name

  该指令用于虚拟主机的配置。通常分为以下两种:

  1)基于名称的虚拟主机配置

  语法格式如下:

server_name   name ...;

  ①对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。

server_name 123.com www.123.com

  ②可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。

server_name *.123.com www.123.*

  ③还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。

server_name ~^www\d+\.123\.com$;

  该表达式“~”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个0~9之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)

  以上匹配的顺序优先级如下:

1 准确匹配 server_name
2 通配符在开始时匹配 server_name 成功
3 通配符在结尾时匹配 server_name 成功
4 正则表达式匹配 server_name 成功

2)基于 IP 地址的虚拟主机配置

  语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。

server_name 192.168.1.1

3、location

  该指令用于匹配 URL。

  语法如下:

1  location [ = | ~ | ~* | ^~] uri {
2 
3  }

  1)= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

  2)~:用于表示 uri 包含正则表达式,并且区分大小写。

  3)~*:用于表示 uri 包含正则表达式,并且不区分大小写。

  4)^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

  注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

4、proxy_pass

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

  语法结构如下:

proxy_pass URL;

  URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。

proxy_pass  http://www.123.com/uri;

5、index

  该指令用于设置网站的默认首页。

  语法为:

index  filename ...;

  后面的文件名称可以有多个,中间用空格隔开。

index  index.html index.jsp;

  通常该指令有两个作用:

    第一个是用户在请求访问网站时,请求地址可以不写首页名称;

    第二个是可以对一个请求,根据请求内容而设置不同的首页。

 

七、通过分析我们不难得出,以百度为例,如果客户机的IP和百度服务器(目标主机)的IP在同一个网段,那就形同局域网内部发送请求,速度极快。 但如果满足不了这种需求还想到达到一个较好的请求响应时,百度服务器就可以对外提供一个与目标服务器在一个网段的公网IP,也就是反向代理服务的IP,通过代理服务器转发客户机请求,决定幕后的N台服务器谁来处理这个请求,并且由于反向代理服务器与目标主机在一个网段,访问速度也会很快。 
Nginx用作反向代理服务器时,它就是众多反向代理服务器中的一种,通过简单的配置,指定到服务器IP或域名地址便可将客户机请求转发给指定服务器处理请求。

 

 

转自:https://www.cnblogs.com/ysocean/p/9392908.htmlhttps://www.cnblogs.com/jmao/p/9908559.html

 

推荐阅读