基本概念
Nginx是一个高性能轻量级的HTTP和反向代理Web服务器,同时提供了IMAP/POP3/STMP服务。其特点是占用内存少,并发能力强,理想情况下能提供高达5W个并发连接。
代理
提到反向代理,就不得不说说正向代理,两者有什么区别的呢?
正向代理:
正向代理是客户端和其他所有服务器(重点:所有)的代理者。
对于正向代理,任何客户端只要连接到该代理服务器,就可以通过代理访问任何的其他服务器,然后把数据返回给客户端,这里代理服务器只对客户端负责。
反向代理:
反向代理是客户端和所要代理的服务器之间的代理者。
对于反向代理,如果他反向代理了两个服务,那么之后客户端访问这两个服务器的时候,该代理服务器才会给它代理,也就是说,这里的代理服务器只对该代理服务器所代理的服务器负责。
对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。
总结:
正向代理:代理客户端去请求资源,对客户端负责。如认证、翻墙等。正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理:代理服务端去响应请求,对所代理的服务器负责。如负载均衡、缓冲、心跳等。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
无论正向还是反向,都是处于客户端和服务器之间,起桥梁作用。
举例:
在图中,正向代理就是 Client 把自己的请求用 ss 作为代理发出去;而反向代理是 Server 端的 nginx 把请求转发给真正处理消息的 Server,然后再 response。
负载均衡
前言
均衡,不能狭义的理解为分配给所有实际服务器一样多的工作量。因为可能多台服务器的承载能力各不相同,如硬件配置、网络带宽、某些服务器身兼多职的差异。均衡的实际思想是希望所有的服务器都不要过载,并能最大程度的发挥作用。
实现负载均衡的手段有很多种,比如:HTTP重定向、DNS负载均衡、反向代理负载均衡、IP负载均衡(LVS-NAT)、直接路由(LVS-DR)、IP隧道(LVS-TUN)等。欲全了解的可点击此处浏览,本文就HTTP重定向和反向代理负载均衡作一些简单总结。
HTTP重定向
当http代理(比如浏览器)向web服务器请求某个URL后,web服务器可以通过http响应头信息中的Location标记来返回一个新的URL。这意味着HTTP代理需要继续请求这个新的URL,完成自动跳转。
性能缺陷:
1、吞吐率限制
主站点服务器的吞吐率平均分配到了被转移的服务器。现假设使用RR(Round Robin)调度策略,现有三台子服务器,子服务器的最大吞吐率为1000reqs/s,那么主服务器的吞吐率要达到3000reqs/s才能完全发挥三台子服务器的作用。如果主服务的吞吐率达到6000reqs/s,那么平均分配到子服务器的吞吐率为2000reqs/s,而现子服务器的最大吞吐率为1000reqs/s,因此就得增加子服务器的数量,增加到6个才能满足。
2、重定向访问深度不同
有的重定向一个静态页面,有的重定向相比复杂的动态页面,那么实际服务器的负载差异是不可预料的,而主站服务器却一无所知。因此整站使用重定向方法做负载均衡不太好。我们需要权衡转移请求的开销和处理实际请求的开销,前者相对于后者越小,那么重定向的意义就越大,例如下载。
反向代理负载均衡
其核心工作是转发HTTP请求,反向代理的调度器扮演的是用户和实际服务器中间人的角色。特性如下:
(1)任何对于实际服务器的HTTP请求都必须经过调度器。
(2)调度器必须等待实际服务器的HTTP响应,并将它反馈给用户(HTTP重定向不需要经过调度反馈,是由实际服务器直接发送给用户)。
(3)调度策略丰富。例如可以为不同的实际服务器设置不同的权重,以达到能者多劳的效果。
(4)对反向代理服务器的并发处理能力要求高,因为它工作在HTTP层面,即应用层。
(5)反向代理服务器进行转发操作本身也是需要一定开销的。比如创建线程、与后端服务器建立TCP连接、接收后端服务器返回的处理结果、分析HTTP头部信息、用户空间和内核空间的频繁切换等;虽然这部分时间并不长,但是当后端服务器处理请求的时间非常短时,转发的开销就显得尤为突出。
(6)反向代理服务器可以监控后端服务器,比如系统负载、响应时间、是否可用、TCP连接数、流量等,从而根据这些数据调整负载均衡的策略。
(7)反射代理服务器可以让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上(粘滞会话),这样的好处一是保持session的本地访问,二是防止后端服务器的动态内存缓存的资源浪费。
Q:LVS + NGINX架构必要性
A:lvs 最主要的还是用来分流(参考:[参考资料][负载均衡][大白话由浅入深解释什么是负载均衡(“码海”的帖)]),请求量经过lvs,但是响应却是后端服务器返回,采用的是同步请求转发,有个缺点如果请求的服务器出现问题,那么这次请求就失败了。
nginx采用的是异步转发,可以做到一个失败,立即切换服务器,直到成功或者最后一台服务器为止。但是缺点就是,请求和响应都经过nginx,导致量大的时候,网络和带宽会成为瓶颈。
终上所述:结合使用,互取长处,就出现了lvs+nginx的模式。
参考资料
代理
https://baijiahao.baidu.com/s?id=1677770814186358219&wfr=spider&for=pc
http://tengine.taobao.org/book/chapter_02.html
http://tengine.taobao.org/book/index.html
负载均衡
https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/application/introduction.html
https://www.sohu.com/a/282042670_236714
https://www.zhihu.com/question/61783920 (大白话由浅入深解释什么是负载均衡)
https://help.aliyun.com/document_detail/27544.html?spm=a2c4g.11174283.2.25.4c144c07kEqZ0C
https://www.cnblogs.com/arjenlee/p/9262737.html#auto_id_1 (LVS+NGINX实操)