优化Web性能:Varnish中精准识别并缓存移动与桌面请求

news/2024/9/19 0:27:10/ 标签: 缓存, Varnish

引言

在现代Web开发中,为了提升用户体验,针对不同类型的设备提供定制化的内容是一项重要的策略。Varnish作为HTTP加速器和缓存代理服务器,能够帮助我们实现这一目标。本文将详细介绍如何利用Varnish来实现基于设备类型(PC端与移动端)的同路由内容差异化显示,并探讨如何优化缓存管理。

一、Varnish 简介

Varnish 是一种高性能的 Web 应用加速器,它主要通过缓存 HTTP 响应来减轻服务器负载,从而提升网站的访问速度。Varnish 的主要特点包括:

  • 高速缓存Varnish 能够快速存储和检索静态内容,显著降低延迟。
  • 负载均衡:它可以作为负载均衡器,分发请求到多个后端服务器。
  • 安全性:通过过滤恶意请求,增强网站的安全性。
  • 灵活性:支持通过 Varnish 编程语言 (VCL) 自定义复杂的缓存和路由逻辑。

二、Varnish 中区分设备类型的方法

2.1 为什么需要区分设备?

在现代 Web 开发中,网站通常需要适应多种设备和屏幕尺寸。例如,移动端用户可能希望看到简化版的页面,而桌面用户则可能更喜欢功能齐全的版本。为了提供最佳用户体验,网站需要能够智能地检测用户设备,并据此调整页面布局和功能。

2.2 使用 User-Agent 字符串

Varnish 中,最常用的方法之一是通过分析请求中的 User-Agent 字符串来判断设备类型。虽然这种方法并非绝对准确(因为 User-Agent 可以被伪造),但在大多数情况下,它仍然是一种有效的方法。

2.3 VCL配置及实现

2.3.1  实现步骤

  • 识别设备类型:通过分析User-Agent字符串来确定请求来源设备类型。
  • 配置VCL文件:编写规则来区分设备类型,并根据设备类型选择不同的后端服务或返回不同的内容。

2.3.2 示例代码

下面是一个详细的示例,展示了如何根据User-Agent字符串来区分PC和移动设备,并设置相应的缓存策略:

# 配置桌面设备的后端服务器地址及端口
backend backend_desktop {   # 定义一个名为 backend_desktop 的后端.host = "desktop-backend.example.com";   # 设置后端主机地址.port = "80";                            # 设置后端服务监听的端口
}# 配置移动设备的后端服务器地址及端口
backend backend_mobile {   # 定义一个名为 backend_mobile 的后端.host = "mobile-backend.example.com";    # 设置后端主机地址.port = "80";                            # 设置后端服务监听的端口
}# 当请求到达时触发的子程序
sub vcl_recv {# 根据User-Agent判断设备类型并设置X-Device-Type头if (req.http.User-Agent ~ "mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobilesafari|silk|dolfin|skyfire|midp|wap|phone") {set req.http.X-Device-Type = "mobile";   # 如果User-Agent包含上述字符串之一,则设置X-Device-Type为"mobile"} else {set req.http.X-Device-Type = "desktop";  # 否则设置X-Device-Type为"desktop"}# 检查已设置的 X-Device-Type 请求头if (req.http.X-Device-Type == "desktop") {# 如果是桌面设备,则设置后端为 desktop 后端set req.backend = backend_desktop;       # 设置请求后端为 desktop 后端} else if (req.http.X-Device-Type == "mobile") {# 如果是移动设备,则设置后端为 mobile 后端set req.backend = backend_mobile;        # 设置请求后端为 mobile 后端}
}# 根据设备类型缓存
sub vcl_hash {// 基于请求URL计算哈希hash_data(req.url);                         # 用请求的URL作为哈希数据的一部分// 检查设备类型,并将之加入哈希计算if (req.http.User-Agent ~ "(?i)(mobile|tablet)"){  # 使用正则表达式检查User-Agent是否包含 "mobile" 或 "tablet"(不区分大小写)// 设备类型为移动设备(手机或平板)set req.http.X-Device-Type = "mobile";           # 如果条件满足,则设置X-Device-Type为"mobile"} else {// 设备类型为桌面设备set req.http.X-Device-Type = "desktop";          # 否则设置X-Device-Type为"desktop"}// 将设备类型信息加入哈希计算hash_data(req.http.X-Device-Type);                  # 将设备类型添加到哈希数据中,以便根据设备类型进行缓存
}

解释

  1. vcl_recv 子程序:这里我们检查请求的 User-Agent 字符串是否包含某些关键词,如果包含,则认为这是一个来自移动设备的请求,并设置一个特殊的请求头 X-Device-Typemobile。否则,假设这是来自 PC 的请求,并设置 X-Device-Typedesktop

  2. vcl_hash 子程序:这里我们将 X-Device-Type 请求头的内容加入到哈希运算中。这意味着来自不同类型的设备即使请求相同的 URL,也会被缓存为不同的副本。

三、缓存管理

3.1 为什么需要刷新缓存

在动态网站中,内容经常发生变化,特别是在新闻站点、电商平台等需要实时更新信息的地方。为了确保用户看到的是最新内容,需要定期或按需刷新缓存

3.2 Varnish缓存刷新机制

Varnish 提供了几种方法来刷新缓存

3.2.1 使用 PURGE 方法

通过发送一个特殊的 HTTP 请求来清除特定的缓存项。这个请求通常使用 HTTP 方法 PURGE 发送到 Varnish

curl -X PURGE http://<varnish-ip>:<port>/<path-to-purge>

该请求需要配置 VCL 文件:

# 在vcl_recv中处理自定义的PURGE请求  
sub vcl_recv {  # 检查请求方法是否为PURGE  if (req.method == "PURGE") {# 检查请求是否来自可信的 IP 地址if (client.ip == "192.0.2.1" || client.ip == "2001:db8::1") {# 如果来自可信 IP,则继续处理请求return (pipe);} else {# 如果不是来自可信 IP,则返回 405 Method Not Allowederror 405 "Method Not Allowed for PURGE requests from this IP.";}# 执行清除缓存的操作purge(req.url);# 发送一个200 OK响应作为PURGE成功的初步确认  # 注意:在实际应用中,你可能希望根据PURGE操作的结果来发送不同的响应  # 但由于VCL中直接处理PURGE的逻辑可能较为复杂,这里只是发送一个静态响应  return (synth(200, "Purged"));  }  
}

注意:

  • -X PURGE:指定使用 PURGE HTTP 方法。
  • <varnish-ip>:运行 Varnish 的服务器 IP 地址。
  • <port>:Varnish 监听的端口号,默认通常是 80 或者 443 (对于 HTTPS),但也可以是其他端口,如 6081。
  • <path-to-purge>:要清除缓存的 URL 路径。

3.2.2 使用varnishadm发送ban请求

首先,你需要通过varnishadm连接到Varnish实例,然后发送一个ban命令。这里有一个简单的命令示例,用于清除所有URL中包含/news/缓存

varnishadm -T localhost:6082 ban req.url ~ "/news/"

注意:

  • -T 参数后面跟的是Varnish的管理地址和端口。
  • ban 命令后面跟的是匹配条件,这里使用的是req.url ~ "/news/",表示匹配所有URL中包含/news/的请求。

3.2.3 设置过期时间(TTL)

在 VCL 中设置缓存条目的过期时间,使其在一定时间后自动失效。

sub vcl_backend_response {  # 检查请求的URL是否以/news开头  if (bereq.url ~ "^/news") {  # 设置缓存时间为3600秒(1小时)  set beresp.ttl = 3600s;  # 如果你还想设置优雅期(grace period),可以这样做:  # set beresp.grace = 60s;  } else {  # 对于其他路径,使用默认的缓存策略  # 这里没有显式设置,因为Varnish会使用varnish.params中配置的默认TTL  }  # 其他可能的逻辑...  
}

注意:

  • 我们在vcl_backend_response子程序中设置缓存时间,因为这个子程序在Varnish从后端服务器接收到响应后立即执行,此时可以修改响应的TTL。
  • bereq.url包含了后端请求的URL,这是从客户端请求中解析出来的,并且已经过Varnish的任何重写规则的处理。
  • beresp.ttl用于设置缓存对象的TTL。设置为0s表示不缓存该对象。
  • beresp.grace(如果设置了)定义了当缓存对象过期后,但在被新响应替换之前,该对象仍然可以被提供的“优雅期”。

结论

通过利用Varnish缓存系统的强大功能和灵活性,结合精细化的设备类型识别策略和智能的缓存策略优化,我们可以实现基于设备类型的智能内容差异化展示。这不仅提升了用户体验,还提高了网站的性能和可维护性。然而,实施此功能时需要注意性能、安全性和可维护性等方面的挑战,并持续关注和优化这些方面以确保最佳效果。


http://www.ppmy.cn/news/1526540.html

相关文章

Pr:首选项 - 媒体缓存

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“媒体缓存” Media Cache选项卡的设置用于管理和优化媒体缓存文件的存储与清理。定期清除媒体缓存是优化 Pr 性能或进行故障排除的最佳做法。 将视频和音频导入 Pr 时&#xff0c;它会将这些文件处理成…

企业的终端安全该怎么防护?

安装金刚钻信息网站数据防泄密系统能够有效防止终端数据泄露&#xff0c;提供全面的安全保障。该系统通过对终端上的敏感数据进行加密&#xff0c;确保只有经过授权的用户才能访问或读取数据&#xff0c;即使设备丢失或遭到入侵&#xff0c;数据也不会被轻易获取。此外&#xf…

单硬盘安装Win10和麒麟V10双系统指导建议

随着信创电脑的普及,国产操作系统也逐渐走进了大家的视野,许多人选择了国产操作系统来体验其开源、安全、高效的特性,而Windows系统也是大多数人习惯使用的操作系统。一台电脑上同时安装银河麒麟V10和Windiows10双系统也成为了非常常见的需求。那么,如何在一台电脑上安装银…

SpringBoot框架下的房产销售系统设计与实现

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统&#xff0c;它彻底改变了过去传统的…

Android12_13左上角状态栏数字时间显示右移动

文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1&#xff09;早期一般屏幕都是方形的&#xff0c;但是曲面屏&#xff0c;比如&#xff1a;好多车机Android产品、魔镜…

Qt ORM模块使用说明

附源码&#xff1a;QxOrm是一个C库资源-CSDN文库 使用说明 把QyOrm文件夹拷贝到自己的工程项目下, 在自己项目里的Pro文件里添加include($$PWD/QyOrm/QyOrm.pri)就能使用了 示例test_qyorm.h写了表的定义,Test_QyOrm_Main.cpp中写了所有支持的功能的例子: 通过自动表单添加…

9.14工作笔记

M psy分析 冰红茶看看他的研究思路 https://bbs.quantclass.cn/thread/45169 psyv4计算&#xff1a;首先算因子H 然后放到回测框架里算12H 衰减加权 和psyv1做比较 transperiod这个函数里面的for循环再看看 比如df是小时数据&#xff0c;hold_period为3D&#xff0c;这里of…

【C++】入门基础(下)

Hi&#xff01;很高兴见到你~ 目录 7、引用 7.3 引用的使用&#xff08;实例&#xff09; 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系&#xff08;面试点&#xff09; 8、inline 9、nullptr Relaxing Time&#xff01; ———…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转&#xff0c;是一种设计原则&#xff0c;spring 中通过DI&#xff08;dependency Injection&#xff09;来具体实现。 比如原本对象的实例化&#xff0c;是通过程序主动New出来&#xff0c;IOC中的对象实例交给Spring框架来实例化&#xff0…

爬虫全网抓取

爬虫全网抓取是指利用网络爬虫技术&#xff0c;通过自动化的方式遍历互联网上各个网站、论坛、博客等&#xff0c;从这些网页中提取所需的数据。它通常涉及以下几个步骤&#xff1a; 目标设定&#xff1a;确定要抓取哪些类型的网页内容&#xff0c;比如新闻、商品信息、用户评论…

Error: ReferenceError: ReadableStream is not defined

midway项目在build完&#xff0c;docker启动时&#xff0c;莫名地报错Error: ReferenceError: ReadableStream is not defined&#xff0c;之前一直好好地&#xff0c;初时以为是新加的代码引起&#xff0c;后来排除了。 报错如下&#xff1a; 2024-08-20 11:57:51.446 ERROR …

SAP EWM Cross Docking (CD) 越库操作

目录 1 介绍 2 业务流程 3 后台配置主数据 4 业务操作 1 介绍 EWM Cross Docking 又称“越库操作”&#xff0c;即从仓库的一个道口直接跳到另一个道口。这样操作都不用想&#xff0c;肯定是为了仓库工作效率。CD 分两部分&#xff0c;一个是“计划性越库”&#xff0c;另…

asp.net core调用wps实现word转pdf的方法

1&#xff0c;首先安装wps&#xff0c;从官网下载安装包 2&#xff0c;创建.net core控制项目 添加com引用&#xff0c;搜索wps 准备一个word文档&#xff0c;名字叫001.docx&#xff0c;随便编写一些文字内容 3&#xff0c;word转pdf 编写代码 namespace WPSStu01 {inter…

UVM仿真的运行(四)—— objection 机制

0. 引言 前面介绍了uvm仿真的启动,按照domain中指定的DAG的phase node 顺序执行各个组件的phase。 在执行run_phase node的Executing 状态时,以fork...join_none的方式在后台调用run_phase imp的traverse方法去并行执行各个component的run_phase方法,同时会等待task运行结…

Spring security 动态权限管理(基于数据库)

一、简介 如果对该篇文章不了解&#xff0c;请移步上一篇文章&#xff1a;spring security 中的授权使用-CSDN博客 当我们配置的 URL 拦截规则请求 URL 所需要的权限都是通过代码来配置的&#xff0c;这样就比较死板&#xff0c;如果想要调整访问某一个 URL 所需要的权限&…

【网络安全】基础知识详解(非常详细)零基础入门到精通

一、什么是网络安全&#xff1f; 百度上对“网络安全”是这么介绍的&#xff1a; “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 嗯…是不…

libmodbus:写一个modbusTCP服务

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

828华为云征文|部署知识库问答系统 MaxKB

828华为云征文&#xff5c;部署知识库问答系统 MaxKB 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 核心竞争力1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 MaxKB3.1 MaxKB 介绍3.2 Docker 环境搭建3.3 MaxKB 部署3.4 Max…

Java API 搜索引擎测试报告

一、测试项目介绍 基于SpringBoot开发的 Java API 文档搜索引擎&#xff0c;输入具体的类名或包名就能找到对应相关的搜索结果&#xff0c;点击标题即可跳转到对应官方网页。 二、测试 测试环境&#xff1a;Windows11&#xff0c;Google chrome浏览器 128.0.6613.138 (正式版…

自动驾驶自动泊车场景应用总结

自动泊车技术是当前智能驾驶技术的一个重要分支,其目标是通过车辆自身的感知、决策和控制系统,实现车辆在有限空间内的自主泊车操作。目前自动泊车可分为半自动泊车、全自动泊车、记忆泊车、自主代客泊车四种产品形态,其中, 根据搭载传感器和使用场景的不同,全自动泊车又可…