1、Varnish 反向代理服务器(外网client向内网server请求资源)
模式:
代理缓存,外网client在varnish找不到请求的资源,varnish会向上游的apache请求资源,然后传给client,并同时缓存该资源;
旁路缓存,外网client在varnish找不到请求的资源,varnish将client的请求路由到上游的apache,client取得资源后将该资源返回给varnish;
最近公司做活动推广,流量暴增,后端服务器压力山大,导致用户的请求响应时间延长,客户因此抱怨声音很大。
为尽快解决问题,在安排人员不断优化后端代码的同时,考虑在nginx前增加varnish缓存层,只透传部分动态请求过去,直接减少后端服务器的压力。
在实际使用中,真正感受到了varnish服务器强大的威力!在不断的调优缓存命中率后,后端服务器cpu直接从80%降到了20%,再大的并发前端也可以直接消化,后端服务器表示毫无压力。有了这玩意,可以再也不用在后台写定时任务,不断重新生成静态页面了,直接丢缓存里完事!此外,varnish还支持一种叫“神圣模式”,在后端服务器报错返回500的时候,varnish还能继续优先返回过去缓存的内容,为用户屏蔽部分错误,这东东有时真算是救命稻草啊。
但同时,也趟了n多的坑,varnish中的VCL语言太过强大和灵活,稍微运用不好就会中枪。而网上公开的大多数varnish配置文件都是一大抄,根本无法直接用于生产。在研究了几天,翻阅了大量各种资料后,才总算把遇到的问题都解决了。
Varnish需要在多台服务器上缓存数据,就需要Varnish映射所有的URL到一台后端的web server。
varnish基本配置:
- backend webserver {
- .host = "127.0.0.1";
- .port = "80";
- .connect_timeout = 4s;
- .first_byte_timeout = 5s;
- .between_bytes_timeout = 20s;
- }
该块配置用于定义一台Varnish默认访问的后端服务器,当Varnish需要从后端服务器获取数据时,就会访问自己的80端口。
当然Varnish也可以定义多台后端web服务器实现负载均衡的目的。(或者设置一台web server,该web server是一个VIP,即 service IP,后台挂着一个web cluster)
.connect_timeout定义的是等待连接后端的时间
.first_byte_timeout定义的是等待从backend传输过来的第一个字节的时间
.between_bytes_timeout 定义的是两个字节的间隔时间
当然还可以增加一个backend,用于访问本机的8090端口,假设通过该端口提供图片服务(图片服务器)。
- backend img {
- .host = "127.0.0.1"; (该IP也可以是VIP,执行后端的图片缓存服务器)
- .port = "8090";
- }
当匹配img的URL时,需把请求发送到上面定义的backend img,其他的请求发送到backend webserver。
- sub vcl_recv {
- if (req.url ~ "^/img/") {
- set req.backend = img;
- } else {
- set req.backend = webserver.
- }
- }
在企业的生产环境,varnish可以配置多台,公网上用一个VIP接收client的请求,负载均衡设备(Citrix的Netscaler,F5的BIG-IP,国产的开源软件LVS)将请求VIP的连接通过某种负载均衡策略(URL Hash,round-robin等)分发到后端的varnish 服务资源池。
当然,也可以用多个VIP(该VIP都对应同一个域名),每个VIP后面挂相同的varnish 服务资源池,或者不同的varnish 服务资源池。
比如Citrix的Netscaler,可以在上面配置vip-1对应10台varnish,vip-2对应10台相同的varnish,也可以vip-2对应不同的varnish。