反向代理从传输上分能够分为2种:html
1:同步模式(apache-mod_proxy和squid)nginx
2:异步模式(lighttpd 和 nginx)web
在nginx的文档说明中,提到了异步传输模式并提到它能够减小后端链接数和压力,这是为什么?apache
下面就来说解下传统的代理(apache/squid)的同步传输和lighttpd,nginx的异步传输的差别。后端
看图:浏览器
同步传输:浏览器发起请求,然后请求会马上被转到后台,因而在浏览器和后台之间就创建了一个通道。在请求发起直到请求完成,这条通道都是一直存在的。
异步传输:浏览器发起请求,请求不会马上转到后台,而是将请求数据(header)先收到nginx上,而后nginx再把这个请求发到后端,后端处理完以后把数据返回到nginx上,nginx将数据流发到浏览器,这点和lighttpd有点不一样,lighttpd是将后端数据彻底接收后才发送到浏览器。服务器
小结:apache和squid的反向会增长后端web的负担,由于每一个用户请求都会在proxy上与后端server创建的长久连接,知道数据取完前,链接都不会消失。由于wan速度与lan速度的不一样,虽然lan之间的速度是极度快的,可是用户的wan链接决定了这个时间长。而lighttpd和nginx的异步模式,是无论你用户要求的数据有多大,都是先收下来,再与后端联系,这是很是迅速的速度,因此proxy与后端链接时间也会很短,几十M的东西也是几秒内。后端不须要维护这么多链接。而lighttpd也和nginx不一样的异步,lighttpd是先收完再转向客户浏览器,而nginx是边收数据边转向用户浏览器。负载均衡
那么这到底有什么好处呢?异步
1. 假设用户执行一个上传文件操做,由于用户网速又比较慢,所以须要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台创建了链接,半小时后文件上传结束,因而可知,后台服务器链接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,所以仅仅是nginx和用户保持了半小时链接,后台服务器在这半小时内没有为这个请求开启链接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽是很充裕的,因此只花了一秒钟就将请求发送到了后台,因而可知,后台服务器链接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化程度很大。post
2. 在上面这个例子中,假如后台服务器由于种种缘由重启了,上传文件就天然中断了,这对用户来讲是很是恼火的一件事情,想必各位也有上传文件传到一半被中断的经历。用nginx代理以后,后台服务器的重启对用户上传的影响减小到了极点,而nginx是很是稳定的并不须要常去重启它,即便须要重启,利用kill -HUP就能够作到不间断重启nginx。
3. 异步传输能够令负载均衡器更有保障,为何这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每一个请求都是只有一次机会的,假如用户发起一个请求,结果该请求分到的后台服务器恰好挂掉了,那么这个请求就失败了;而nginx由于是异步的,因此这个请求能够从新发往下一个后台,下一个后台返回了正常的数据,因而这个请求就能成功了。仍是用用户上传文件这个例子,假如不但用了nginx代理,并且用了负载均衡,nginx把上传文件发往其中一台后台,但这台服务器忽然重启了,nginx收到错误后,会将这个上传文件发到另外一台后台,因而用户就不用再花半小时上传一遍。
4. 假如用户上传一个10GB大小的文件,然后台服务器没有考虑到这个状况,那么后台服务器岂不要崩溃了。用nginx就能够把这些东西都拦在nginx上,经过nginx的上传文件大小限制功能来限制,另外nginx性能很是有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。
用异步传输会形成问题:
后台服务器有提供上传进度的功能的话,用了nginx代理就没法取得进度,这个须要使用nginx的一个第三方模块来实现。