1. 什么是反向代理

这里,对于何谓反向代理和正向代理,简单说明一下。



nginx目录转发到二级域名且浏览器网址不变 nginx转发到另一个nginx_反向代理


比如当前有10000个用户请求web服务器时,nginx作为一个负载均衡服务器会把接收到外网的这10000个请求,均衡分发给内部网络中的web服务器,然后web服务器处理这些请求把结果返回给用户。

整个过程中,用户作为使用者,根本不知道他访问的web服务器是哪一个,也感知不到代理服务器的存在,而是通过nginx代理外网用户的请求根据负载均衡算法分发给内部网络的服务器,然后由web服务器把最终结果返回给用户,在整个请求过程中,Nginx主要就是作为一个反向代理服务器的角色提供转发请求服务,这就叫反向代理。

2. 正向代理

在了解了反向代理后,我们有必要再了解下正向代理



nginx目录转发到二级域名且浏览器网址不变 nginx转发到另一个nginx_代理服务器_02


所谓正向代理就是,如果用户要访问web服务器的资源时,用户不会直接发送请求到web服务器,而是先把请求发送给代理服务器,让代理服务器代理用户去访问web服务器的资源,然后web服务器把资源返回给代理服务器,代理服务器再把资源返回给用户。

也就是说,正向代理就是用户和web服务器之间的一个代理服务器,在这个请求过程中用户必须知道代理服务器的ip地址和端口等这些信息(反向代理正好相反),用户和代理服务器是处于同一个网络,而web服务器是另一个网络。

3. nginx作为反向代理服务器

nginx作为反向代理服务器,如下图所示:



nginx目录转发到二级域名且浏览器网址不变 nginx转发到另一个nginx_反向代理_03


当客户端发来http请求时,nginx并不会立刻转发到后台服务器,而是先把用户请求(包括http包体)完整的接收到nginx服务器的硬盘或内存中,然后再向后台服务器发起连接,把缓存的客户端请求转发到后台服务器。

nginx这种工作方式好处是降低了后台服务器的负载,尽量把请求压力负载到nginx,缺点是延长了一个请求的处理时间,并增加了用户缓存请求内容的内存和磁盘空间。

通常,客户端和代理服务器之间的网络环境比较复杂,多半是 “走” 公网,网速平均下来较慢,因此一个请求可能持续很久才能完成。而代理服务器和后台服务器是 ”走“ 内网,或者有专线,传输速度较快。

相信大家都有下载文件的体会,特别是动不动就十几个G的大文件,在局域网下载文件和在internet网络下载文件的速度明显是不一样的。因为在局域网下,数据传输的距离很近,数据在传输过程中不需要经过太多的路由寻址转发,也不用担心网络拥塞,带宽的限制等一些问题。而在公网下,由于都是使用的NAT方式上网,一个公网ip对应着多个内网ip,数据在传输过程中要经过多次的路由寻址转发,还有带宽的限制,网络延迟等这些问题,下载速度相对就慢得多了。

nginx在接收客户端请求(如1GB的文件)后,会直接转发请求给后台服务器,由于是内网,所以这个转发过程非常快。这样,一个客户端的请求的连接时间很短,也就是说,nginx这种反向代理方式主要是为了解决后台服务器的压力。对于nginx转发响应给客户端也有许多种方式。

4nginx作为静态web服务器和反向代理服务器

其实nginx不光还可以作为反向代理服务器,还可以既作为web服务器,又可以作为反向代理服务器。如下图所示:



nginx目录转发到二级域名且浏览器网址不变 nginx转发到另一个nginx_web服务器_04


nginx拥有很强悍的高并发负载能力,因此一般会作为前端页面的服务器直接向客户端提供静态文件服务。对于一些复杂,多变的业务并不适合由nginx直接提供服务,这时会用到apache,tomcat等服务器向客户端提供服务。

于是nginx通常会配置成一个既是静态web服务器,又是一个反向代理服务器来处理。不适合nginx服务器处理的请求会直接转发到后台业务的服务器来处理。

在上图蓝色箭头是静态请求的整个过程:client发出静态文件请求时,nginx作为一个静态web服务器会直接向client提供静态文件服务,而不需要让nginx转发请求到后台业务服务器来提供静态文件内容。省去了nginx的转发流程,从而提高效率。

绿色箭头是动态请求的过程:当client发出动态请求时,该请求不适合由nginx来提供服务,于是nginx会作为反向代理服务器转发动态请求给后台的服务器,由后台服务器提供动态内容并返回。再由nginx转发动态应答给client。