使用反向代理做缓存

转载

使用反向代理做缓存

原创: 007程序员 007程序员 今天

接着上篇来说负载层做缓存,在这之前我们先普及下概念:

1. 什么是正向代理?

在NAT技术(Network Address Translation)出现之前,所有主机无法直接与外网相连,要想上网,需要连接到一台能够访问外网的Web服务器,再通过这台服务器访问外网。而这台Web服务器就叫做“正向代理服务器”。

现在的“*”技术也是如何,我们把请求发给一台可以连接外面世界的Web服务器,由它转发我们的请求,再将结果返回给我们。这台Web服务器就是“正向代理服务器”。

综上所述:正向代理服务器是客户端和目的服务器之间的一个中介,客户端通过正向代理服务器访问客户端原本无法访问的目标服务器。

2. 什么是反向代理?

客户端向一个服务器A提交请求后,服务器A偷偷地去服务器B上获取资源,并返回给客户端。客户端天真地以为数据是服务器A给他的。在这过程中,服务器A称为“反向代理服务器”,服务器B称为反向代理服务器的“后端服务器”。

3.“正向代理”与“反向代理”的区别?

两者最直观的区别是在用户的角度。“正向代理”是用户使用的技术。用户首先是知道自己要访问的目标服务器是谁,但由于某种原因无法直接访问该目标服务器,因此选择使用正向代理服务器帮忙转发请求。

而“反向代理”是服务器使用的技术。用户向服务器发送请求后,服务器在用户不知情的情况下去其他服务器上获取资源并返回给用户。

4. 什么是反向代理服务器?

反向代理服务器用于存储静态数据和缓存数据,它处于Web服务器之前。当用户发起请求时,请求首先被反向代理服务器截获,若请求的是静态数据或缓存数据,则反向代理服务器直接将数据返回;若请求的是动态数据,且缓存中不存在,则反向代理服务器将请求转发给后端的Web服务器,在获取后端服务器的数据后再返回给用户。简单说就是在网站服务器机房部署代理服务器,实现负载均衡、数据缓存、安全控制等功能。

5. 反向代理服务器有何作用?

反向代理服务器能够分担后端服务器的压力。在请求数很高的情况下,即使服务器使用了缓存,但仍然无法应对巨大的并发数,因此需要反向代理服务器的帮忙。反向代理服务器收到请求后,如果请求的是缓存数据或静态数据,则直接返回给用户,而无需再劳驾后端服务器了,从而缓解后端服务器的压力。

6. 如何选择反向代理服务器?

反向代理服务器有多种选择,常用的代理缓存有Varnish,Squid,Ngnix,ATS。简单比较如下:

(1)varnish和squid是专业的cache服务,nginx需要第三方模块支持。

(2) Varnish采用内存型缓存,避免了频繁在内存、磁盘中交换文件,性能比Squid高,但是内存缓存也限制了其容量,缓存页面和图片一般是挺好的。由于是内存cache,所以对小文件如css,js,小图片啥的支持很棒,后端的持久化缓存可以采用的是Squid或ATS。

(3)Squid功能全而大,适合于各种静态的文件缓存,一般会在前端挂一个HAProxy或nginx做负载均衡跑多个实例,但是架构太老,性能不咋的。

(4)Nginx 本来是反向代理/web服务器,用了插件可以做做这个副业,但是本身不支持特性挺多,可以实现简单的缓存。

(5)ATS 目前是一个不错的选择。

 究竟哪一个反向代理服务器适合你,知乎上的讨论可以参考: varnish / squid / nginx cache 有什么不同?

简单说下Squid

Squid 反向代理一般只缓存静态资源,动态程序默认不缓存。根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:

Last-Modified:告诉反向代理页面什么时间被修改

Expires:告诉反向代理页面什么时间应该从缓冲区中删除

Cache-Control:告诉反向代理页面是否应该被缓冲

Pragma用来包含实现特定的指令,最常用的是 Pragma:no-cache使用反向代理做缓存

Squid 反向代理加速网站实例

1. 通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理;2. 如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户;3. 否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理;这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。

7. 分配多大的缓存空间较为合适?

首先,我们需要通过压力测试来估算网站的最大并发数。 然后观察反向代理服务器中缓存空间的使用率与命中率。 如果缓存空间长时间处于满载,并且缓存的命中率很低,并且后端服务器的实际并发数接近最大并发数,那么我们就需要考虑增加缓存的存储空间。增加缓存空间后,一方面能提高缓存命中率,一方面能减轻后端服务器的压力。

8. 设置多长的缓存有效期较为合适?

若缓存有效期过长,虽然能够大大减轻后端服务器的压力,但数据的实时性将大大降低;若缓存有效期过短,那么虽然数据实时性大大提高,但后端服务器的压力也增加。

所以缓存有效期的确定需要根据实际的业务情况,如果你的网站对实时性要求很高,那么就需要设置较短的缓存有效期,如果对实时性要求不高,那么可以将缓存设置长一些,从而减轻后端服务器压力。

当然,如果你网站平实的并发数达不到服务器所能承受的最大并发数,那完全可以不用考虑缓存,用户每次请求都让后端服务器直接处理,一切都不用那么麻烦了。

如果有些页面中大部分地方都不需要实时更新,而局部对实时性要求较高,那么可以使用ESI技术,对页面不同的地方设置不同的缓存有效期。

9. 将后端服务器缓存和反向代理缓存一起使用

讲到这里,也许有的人要问,反向代理服务器实现了缓存的功能,那么后端服务器还需要缓存吗?答案是:当然需要! 原因主要有如下两点:

1. 反向代理服务器有时会漏掉一些原本需要缓存的数据,后端服务器的缓存能避免用户请求这部分数据时消耗太多时间;

2. 反向代理服务器的数据缓存是在用户第一次请求时进行的,而后端服务器的数据缓存是在服务器启动时完成的。因此,如果使用了后端服务器的缓存,当用户请求尚未被反向代理服务器缓存的数据时,后端服务器可以直接将这部分缓存数据返回给用户,从而节约了用户等待时间,也减少了后端服务器的开销。

10. 反向代理服务器与后端服务器的网络环境搭建

由于反向代理服务器和后端服务器是通过TCP进行数据通信,因此为了降低他们之间的通信时延,需要将这两台服务器放在内部网络下,并通过交换机相连。

 

阅读 36

 在看2