Nginx(三)------nginx 反向代理
Nginx服务器的反向代理服务是其最常用的重要功能,有反向代理服务器也可以衍生出很多与此相关的Nginx服务器重要功能,比如后面介绍的负载均衡.本篇博客我们首先会介绍Nginx的反向代理,当然在了解反向代理之前,我们需要首先知道什么是代理以及什么是反向代理。
代理
以现实生活中的一个例子来进行说明:比如我们要买一间二手房,虽然我们可以自己去找房源,但是这太花费时间精力了,而且房屋质量检测以及房屋过户等一系列手续也都得我们去办,再说现在这个社会,等我们找到房源,说不定房子都已经涨价了,那么怎么办呢?最简单快捷的方法就是找二手房中介公司(为什么?别人那里房源多啊),于是我们就委托中介公司来给我找合适的房子,以及后续的质量检测过户等操作,我们只需要选好自己想要的房子,然后交钱就行了。
代理简单来说,就是如果我们想做什么,但又不想直接去做,那么这时候就找另外一个人帮我们去做。那么这个例子里面的中介公司就是给我们做代理服务的,我们委托中介公司帮我们找房子。
Nginx主要能够代理如下几种协议,其中用到最多的就是Http代理服务器。
正向代理
弄清楚什么是代理了,那么什么又是正向代理呢?
这里我再举一个例子:大家都知道,现在国内是访问不了 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地址。
下面我们通过两张图来对比正向代理和方向代理:
理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。
总结起来还是一句话:正向代理代理客户端,反向代理代理服务器。
Nginx反向代理
范例:使用Nginx反向代理www.123.com直接跳转到127.0.0.1:80
- 1、启动一个tomcat,浏览器输入127.0.0.1:80,出现如下界面
-2、通过修改本地host文件,将www.123.com映射到127.0.0.1
127.0.0.1 www.123.com
将上面代码添加到 Windows 的host 文件中,该文件位置在:
配置完成之后,我们便可以通过www.123.com:80访问到第一步出现的Tomcat初始化界面。
那么如何只需要输入www.123.com便可以转到Tomcat初始化界面呢?便用到nginx的反向代理。
- 在nginx.conf配置中增加如下配置
1 server {
2 listen 80;
3 server_name www.123.com;
4
5 location / {
6 proxy_pass http://127.0.0.1:8080;
7 index index.html index.htm index.jsp;
8 }
9 }
如上配置,我们监听80端口,访问域名www.123.com,不加端口号时默认为80端口,故访问该域名时会跳转到127.0.0.1:8080的路径下:
- 4、总结
其实这里更贴切的说是通过nginx代理端口,原先访问的是8080端口,通过nginx代理之后,通过80端口就可以访问了。
Nginx反向代理相关指令介绍
listen
1 listen *:80 | *:8080 #监听所有80端口和8080端口,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。
2 listen IP_address:port #监听指定的地址和端口号
3 listen IP_address #监听指定ip地址所有端口
4 listen port #监听该端口的所有IP连接
server_name
该指令用于虚拟主机的配置。通过分为以下两种:
基于名称的虚拟主机
语法格式如下:
server_name name ...;
- 1、对于name来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字有两段或三段组成,每段之间用
.
隔开。
server_name 123.com www.123.com
- 2、可以使用通配符
*
,但通配符只能用在有三段字符组成的首端或者尾端,或者有两端字符组成的尾端。
server_name *.123.com www.123.*
-3、还可以使用正则表达式,用~
作为正则表达式字符串的开始标记。
server_name ~^www\d+\.123\.com$;
该表达式“”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个09之间的数字,在紧跟着“.123.co”,最后跟着“m”($表示结尾)
以上匹配的顺序优先级如下:
①、准确匹配 server_name
②、通配符在开始时匹配 server_name 成功
③、通配符在结尾时匹配 server_name 成功
④、正则表达式匹配 server_name 成功
基于IP地址的虚拟主机配置
语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。
server_name 192.168.1.1
location
该指令用于匹配URL
语法如下
1 location [ = | ~ | ~* | ^~] uri {
2
3 }
- 1、
=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 - 2、
~
:用于表示 uri 包含正则表达式,并且区分大小写。 - 3、
~*
:用于表示 uri 包含正则表达式,并且不区分大小写。 - 4、
^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
proxy_pass
该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。
语法结构如下:
proxy_pass URL;
URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。
proxy_pass http://www.123.com/uri;
index
该指令用于设置网站的默认首页。
语法为:
index filename ...;
后面的文件名称可以有多个,中间用空格隔开。
index index.html index.jsp;
通常该指令有两个作用:第一个是用户在请求访问网站时,请求地址可以不写首页名称;第二个是可以对一个请求,根据请求内容而设置不同的首页
上一篇nginx(二)------nginx.conf 配置文件
下一篇Nginx(四)------nginx 负载均衡