Varnish构建高负载Drupal网站 – 高级篇

本文深入探讨了Varnish缓存优化技术,包括正则替换、开启调试功能、基本优化策略、Drupal动态内容缓存解决、ESI之动态内容处理以及与Drupal的配合使用。同时介绍了如何与Boost模块结合提升性能,并提供了Varnish缓存清理的PHP接口。

继上篇高负载网站之Varnish与Drupal – 基本篇后,本篇我们来深入讨论varnish的优化,缓存页面,ESI,Cookie过滤,登录用户的缓存以及与drupal的配合使用等相关话题。

首先我们熟悉一下两个VCL的函数

regsub(string, pattern, replacement); //正则替换
regsuball(string, pattern, replacement); //同上,只是替换所有遇到的问题


开启VCL Debug信息
再优化之前,我们来开启VCL的调试功能。在当前的active.acl里面,加入如下函数,

sub vcl_deliver {
    if (obj.hits > 0) {
       set resp.http.X-Cache = "HIT";
    } else {
       set resp.http.X-Cache = "MISS";
    }
}
 
#如果需要详细的了解cookie值,可以在vcl_fetch里面加入如下代码
sub vcl_fetch {
  # Debug the req cookie
  set obj.http.X-Cookie-Debug = "Request cookie: " req.http.Cookie;
}

这样在HTTP Header里面我们添加了调试信息,如果缓存命中,则是HIT反之为MISS。

默认情况下,varnish提供一个http头,X-Varnish,它包含两个数字,一个是当前请求的ID,另一个是缓存中的ID,这表明,如果X-Varnish含有两个值,则缓存命中,反之没有命中。

基本优化
默认情况下,Varnish不缓存任何有Cookie的请求,带有Cookie的请求,Varnish认为是私有的HTTP会话,会直接pass到backend。所以我们首先要删除Cookie。一般情况下,对于图片、附件、css、js等文件,是不需要cookie会话的,所以我们需要对其缓存。
在vcl_recv里面添加如下代码

  # cache these file types
  if (req.url ~ "\.(jpg|png|css|js|ico|gz|tgz|bz2|tbz|gif)$") {
    remove req.http.cookie;
  }

Drupal动态内容的缓存
默认的Drupal会开启session,页面会带有session生成的cookie值和value,这样Varnish就无法缓存内容页面。

方法A,在Drupal添加代码,给每个Role设置一个cookie,然后在VCL中检查检查,如果是匿名用户就删除所有cookie。
方法B,使用Drupal的PressFlow版本,PressFlow会默认清理掉匿名用户的Cookie。

ESI之动态内容
对于随时当前用户变动的信息,需要即时刷新,和SSI类似,我们可以用类似部分包含的方法,通过ESI,我们可以调用一些动态内容。详细的了解请参阅官方网站。
Drupal已经有一个模块,Edge Side Includes integration,可以将Drupal的Block转换成ESI include的形式。
正常登陆和非登陆情况下测试成功,但问题在于这两种情况下,页面的HTML并没有缓存成功。
所以关于登陆用户的ESI缓存,比较困难。

有解决方案,就是把Cookie的值通过ESI的URL来传递,但是目前的ESI也不支持。
https://www.varnish-cache.org/trac/wiki/VCLExampleCachingLoggedInUsers

PS:如果使用Varnish3.0,请下载新的配置文件 http://drupal.org/node/1388950

Varnish和Boost搭配使用
前文Drupal性能优化之-将Boost模块用到极致,详细讲解了使用CSI(ajax)对于登录用户的处理。
因为Varnish对页面缓存的实效性、已经不完整性,用Boost可以做有效的补充。通常情况下,Varnish做一般的缓存代理,后端用Boost生成静态页面,把Varnish的逻辑减少,服务器结构之间相对简单一些,以便于维护。

这里有一篇文章,讲解了如何使用Boost和Varnish模块,详情请参阅:Boosted Varnish – High Performance Caching made easy

结论
Varnish的ESI对登录用户的支持有限,所以一般情况下,我们只作为前段缓存和代理来使用,如果要缓存登录用户,即使我们使用Cookie的Hash,使用大量的内存提高缓存,缓存的使用率也是非常低的。因此我们还是使用Boost的CSI(ajax)来实现,调试方式也比Varnish的ESI简单。

附录A Varnish缓存清理PHP接口

Varnish官方站给出了PHP的接口文件,但是该文件有很多bug以及Varnish3.0不能使用等原因,经过修改和调试,分享供大家使用。
注意:如果只用一个vpurge.php通过GET方式获得URL,那么该vpurge.php也会被varnish缓存,所以使用html form提交POST的方式清除缓存是比较好的选择。

1. vpurge.php 文件

  $ip = '127.0.0.1';//
  $port = '6082'; //
 
  $timeout = 1;
  $verbose = 1;
  # inits
  $sock = fsockopen ($ip,$port,$errno, $errstr,$timeout);
  if (!$sock) { echo "connections failed $errno $errstr"; exit; }
 
  # get param and strip invalid stuff
  $url  = $_POST['url'];
 
  if (!$url) { echo "No params"; exit; }
 
  stream_set_timeout($sock,$timeout);
  put ("ban.url ". $url .'$'); #Varnish 3.0需要修改成 purge.url
  put ("quit");
 
  fclose ($sock);
 
  function readit() {
    global $sock,$verbose;
    if (!$verbose) { return; }
    while ($sockstr = fgets($sock,1024)) {
      $str .= "rcv: " . $sockstr . "
";
    }
    if ($verbose) { echo "$str\n"; }
  }
 
  function put($str) {
    global $sock,$verbose;
    fwrite ($sock, $str . "\r\n");
    if ($verbose) { echo "send: $str
\n"; }
    readit();
  }

2. purge.html

  <h1>Makes Varnish purge the supplied URL from its cache</h1>
  <form action="vpurge.php" method="post">
        <p><label>URL</label> <input type="text" name="url"></p>
        <p class="submit"><input value="Submit" type="submit"></p>
  </form>

附录B Varnish的缓存以及VCL的流程图

标题基于Spring Boot的音乐播放网站设计与实现研究AI更换标题第1章引言介绍音乐播放网站的研究背景、意义、国内外现状及论文方法与创新点。1.1研究背景与意义阐述音乐播放网站在当今数字化时代的重要性与市场需求。1.2国内外研究现状分析国内外音乐播放网站的发展现状及技术特点。1.3研究方法以及创新点概述论文采用的研究方法及在设计与实现上的创新点。第2章相关理论与技术基础总结音乐播放网站设计与实现所需的相关理论技术。2.1Spring Boot框架介绍介绍Spring Boot框架的基本原理、特点及其在Web开发中的应用。2.2音乐播放技术概述概述音乐播放的基本原理、流媒体技术及音频处理技术。2.3数据库技术选型分析适合音乐播放网站的数据库技术,如MySQL、MongoDB等。第3章系统设计详细介绍音乐播放网站的整体设计方案。3.1系统架构设计阐述系统的层次结构、模块划分及各模块的功能。3.2数据库设计介绍数据库表结构、关系及数据存储方式。3.3界面设计用户界面的设计原则、布局及交互方式。第4章系统实现详细介绍音乐播放网站的具体实现过程。4.1开发环境与工具介绍开发所需的软件、硬件环境及开发工具。4.2核心功能实现阐述音乐播放、搜索、推荐等核心功能的实现细节。4.3系统测试与优化介绍系统测试的方法、过程及性能优化策略。第5章研究结果与分析呈现音乐播放网站设计与实现的研究结果。5.1系统功能测试结果展示系统各项功能的测试结果,包括功能完整性、稳定性等。5.2用户反馈与评价收集并分析用户对音乐播放网站的使用反馈与评价。5.3对比方法分析将本设计与实现与其他类似系统进行对比分析,突出优势与不足。第6章结论与展望总结音乐播放网站设计与实现的研究成果,并展望未来发展方向。6.1研究结论概括音乐播放网站设计与实现的主要成果及创新点。6.2展望指出当前研究的不足,提出未来改进方向及可
Android Studio点餐系统开发源码(高分期末大作业项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(高分期末大作业项目)Android Studio点餐系统开发源码(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值