Nginx是一个高性能的HTTP和反向代理web服务器 这句话有两点需要注意,1.Nginx是HTTP服务。2.Nginx常用用途是用来做反向代理。
在探讨我们为什么要使用Nginx,使用Nginx的场景之前,我们先来了解什么是代理,什么是正向代理,什么又是反向代理这三个概念,和它们的使用的场景。
# 一.代理 {#一-代理}
狭义上讲代理就是一个中介,它可以帮助被代理的对象完成某一个特定的功能,例如租客通过租房中介从房东那里租到房子,用来居住。又例如房东通过租房中介把房子租给租客,赚取到佣金。 这里租客和房东并没有直接建立起联系,而是通过中介来联系起来的。这样租客可以通过中介从众多的房源信息中快速的找到满足自己需要的房子。而房东也不需要亲自联系租客看房,节省了自己的时间。 刚开始的时候,代理多数是帮助内网client访问外网server用的,后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器, 这是一个从外到内的过程。
# 二.正向代理 {#二-正向代理}
正向代理类似一个跳板机,内部众多客户端通过配置正向代理服务器的地址链接到正向代理服务器,并通过正向代理服务器来访问外部资源, 此时的正向代理服务器对外部互联网上的服务器来说表现为一个客户端。有这样一个场景,你加入了一家新公司,你想访问谷歌,直接访问是访问不了的, 这时候公司提供了一台直连美国的正向代理服务器,在你的机器上配置了这台正向代理服务器后,你发出的请求会先被发送到这台正向代理服务器上, 正向代理服务器再去访问谷歌的服务器,然后把获取的信息再返回给你的机器,这样你就可以访问谷歌了,对于谷歌的服务器来说,它不知道你的存在, 它只知道这台正向代理服务器的存在。
使用正向代理服务器的目的主要有有三点
- 1.通过正向代理服务器访问原来原客户端无法访问,但是正向代理服务器能够访问的资源,例如访问谷歌。
- 2.对内部的客户端访问授权,上网进行认证,例如在公司不能访问某些视频网站。
- 3.代理可以记录用户访问记录,从而进行上网行为管理,同时对外隐藏内部客户端的信息,例如对于谷歌的服务器并不知道是内部的哪一个客户端访问了自己 只知道是正向代理服务器访问了自己。
# 三.反向代理服务器 {#三-反向代理服务器}
反向代理实际运行方式是以代理服务器接收互联网上的访问请求,然后将请求转发给内部的server处理,并将从内部server得到的结果返回给互联网上 发送请求的客户端,此时反向代理服务器对表现为一台服务器,互联网上发送请求的客户端只知道该代理服务器的存在,并不知道内部server的情况。
前面我们提到Nginx是作为HTTP请求的反向代理服务器,那么Nginx作为反向代理服务的作用是什么呢?
-
- 保护内网的安全。通常情况下反向代理作为公网访问地址,外部客户端只能通过公网访问反向代理然后由反向代理转发请求到内部server, 防火墙将阻止外部访问直接访问内部server。而反向代理也屏蔽了内部server的具体情况,从而保护了内部server的安全。
-
- 限流。 对于商业项目来说限流是分多级的,而反向代理作为网关层是限流的第一步,在这一步限流的粒度是比较粗的,具体场景例如限制 那些高频访问的外部客户端的访问,或者当访问流量峰值超过内部server的处理能力,系统有被压垮的风险,这时候反向代理会限制一部分外部访问, 从而维持整个系统的正常运行。
-
- 负载均衡。内部server例如java服务的Tomcat,nodejs服务的pm2,python的gunicorn等它们的并发能力是很有限的,如果访问量很高 将会影响到这些内部server的正常运行,而由于nginx反向代理具有高并发的特性,所以用它来做负载均衡,内部server做集群部署,nginx反向代理 把请求按比率分发到集群中的某一台server上,这样通过集群的处理能力从而提高了正常处理的最大并发量。
-
- 作为虚拟主机。虚拟主机就是把一台运行在互联网上的物理服务器划分成多个虚拟服务器,也就是用同一个反向代理(Nginx)部署多个服务。 例如你需要部署C端用户接口的服务和数据管理后台的服务,这时候并不需要去买两台服务器去部署,因为在同一台服务器上通过Nginx反向代理就可以配置 多个虚拟主机。
正向代理和反向代理总结:
- 从使用场景的角度看,正向代理一般用来作为跳板机,而反向代理常用来做网关。正向代理的代理对象一般是客户端的角色,而反向代理的代理对象一般是服务端的角色。
- "正向"还是"反向"是针对被代理对象来说的,从被代理对象的角度看,正向代理是被代理对象主动发请求到代理,而反向代理是被代理对象被动的接受代理转发过来的请求。
至此我们已经清楚了Nginx作为反向代理的使用场景,我们为什么选择使用Nginx呢?除了Nginx所适用的场景以外,Nginx所具备的高并发高性能高稳定性,良好的扩展性, 开源可商用这些都是我们选择它的理由。