nginx 反向代理原理解析

面试一个很纠结的问题,原本老师给讲过这个原理,而且讲的很是详细,面试现场,我居然不知如何回答,好悲催nginx

如今记录一下,顺便和squid对比记忆 web

squid同步传输:浏览器发起请求,然后请求会马上被转到后台,因而在浏览器和后台之间就创建了一个通道。在请求发起直到请求完成,这条通道都是一直存在的。
nginx异步传输:浏览器发起请求,请求不会马上转到后台,而是将请求数据(header)先收到nginx上,而后nginx再把这个请求发到后端, 后端处理完以后把数据返回到nginx上,nginx将数据流发到浏览器,这点和lighttpd有点不一样,lighttpd是将后端数据彻底接收后才发 送到浏览器。
那么这到底有什么好处呢?
面试

1) 假设用户执行一个上传文件操做,由于用户网速又比较慢,所以须要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台创建了连 接,半小时后文件上传结束,因而可知,后台服务器链接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,所以仅仅是nginx和用户 保持了半小时链接,后台服务器在这半小时内没有为这个请求开启链接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽 是很充裕的,因此只花了一秒钟就将请求发送到了后台,因而可知,后台服务器链接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化 程度很大。apache

2) 在上面这个例子中,假如后台服务器由于种种缘由重启了,上传文件就天然中断了,这对用户来讲是很是恼火的一件事情,想必各位也有上传文件传到一半被中断的 经历。用nginx代理以后,后台服务器的重启对用户上传的影响减小到了极点,而nginx是很是稳定的并不须要常去重启它,即便须要重启,利用kill -HUP就能够作到不间断重启nginx。后端

3) 异步传输能够令负载均衡器更有保障,为何这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每一个请求都是只有一次机会的,假如用 户发起一个请求,结果该请求分到的后台服务器恰好挂掉了,那么这个请求就失败了;而nginx由于是异步的,因此这个请求能够从新发往下一个后台,下一个 后台返回了正常的数据,因而这个请求就能成功了。仍是用用户上传文件这个例子,假如不但用了nginx代理,并且用了负载均衡,nginx把上传文件发往 其中一台后台,但这台服务器忽然重启了,nginx收到错误后,会将这个上传文件发到另外一台后台,因而用户就不用再花半小时上传一遍。浏览器

4) 假如用户上传一个10GB大小的文件,然后台服务器没有考虑到这个状况,那么后台服务器岂不要崩溃了。用nginx就能够把这些东西都拦在nginx上, 经过nginx的上传文件大小限制功能来限制,另外nginx性能很是有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。
用异步传输会形成问题:
后台服务器有提供上传进度的功能的话,用了nginx代理就没法取得进度,这个须要使用nginx的一个第三方模块来实现。
服务器

相关文章
相关标签/搜索