什么是 Varnish,以及如何使用它来提升 HTTP 性能?
在 web 性能优化的世界里,速度至关重要。用户期望网站能在眨眼之间加载完成,而搜索引擎也会优先考虑加载速度快的网站。这就是 Varnish 发挥作用的地方——一个强大的 HTTP accelerator,旨在显著提升网站速度和可扩展性。但 Varnish 到底是什么,它又如何帮助提升你的 HTTP 性能呢?
什么是 Varnish?
Varnish(也称为 Varnish Cache)是一款高性能 web application accelerator,通常被称为 reverse proxy caching server。它位于用户和 web server 之间,存储 HTTP responses 的副本(如 HTML pages、images 或 scripts),从而让重复请求能够更快地被响应。
与 Apache 或 NGINX 等传统 web servers 不同,Varnish 专为缓存和快速交付内容而设计。它通常被高流量网站、媒体公司和 e-commerce platforms 使用,这些场景需要极速的内容交付。
Varnish 如何工作?
Varnish 通过在内存中缓存 HTTP responses 来工作。当用户请求一个页面时:
首次请求:Varnish 将请求转发到 backend server(例如 Apache 或 NGINX)。
backend 生成响应并将其发送给 Varnish。
Varnish 将响应存储(缓存)到内存中。
然后 Varnish 将该响应提供给用户。
后续请求如果是相同内容,则会直接从 cache 提供,完全绕过 backend。
这减少了 server 负载,并显著加快了内容交付速度。
使用 Varnish 的主要优势
更快的加载时间:Varnish 以毫秒级提供缓存页面,大幅提升页面加载速度。
降低 backend 负载:通过从 cache 处理大量流量,Varnish 让你的 web servers 能够处理更复杂的动态请求。
高可扩展性:Varnish 设计用于每秒处理数千个请求,非常适合高流量网站。
灵活的配置:借助其内置的 Varnish Configuration Language (VCL),你可以精细调整内容的缓存、清除或交付方式。
更好的用户体验:更快的页面加载意味着更满意的用户和更低的跳出率。
如何使用 Varnish 提升 HTTP 性能
下面是开始使用 Varnish 的简化步骤:
1. 安装 Varnish
Varnish 可以通过包管理器安装到大多数 Linux 发行版上。例如:
sudo apt install varnish # Debian/Ubuntu
sudo yum install varnish # CentOS/RHEL2. 配置 Varnish
你需要将 Varnish 指向你的 backend server,并在 VCL 文件中定义缓存规则,该文件通常位于 /etc/varnish/default.vcl。
示例片段:
backend default {
.host = "127.0.0.1";
.port = "8080";
}这会告诉 Varnish 将请求转发到运行在 8080 端口上的 web server。
3. 更新端口配置
默认情况下,Varnish 监听 6081 端口,这是一个非标准的 HTTP 流量端口。对于生产环境,通常会将 Varnish 配置为监听 80 端口,也就是标准 HTTP 端口,并将你的 web server(如 Apache 或 Nginx)调整为使用不同的端口,通常是 8080。这样 Varnish 就可以在 80 端口处理传入的 HTTP 请求,缓存内容,并将请求转发到 8080 端口上的 web server。
示例:
更改 Varnish 监听端口
打开 Varnish 配置文件,通常位于/etc/varnish/default.vcl,并将监听端口设置为 80:
在 8080 端口上配置 web server (Apache/Nginx)
如果你使用的是 Apache,你可以在/etc/apache2/ports.conf中更改
Listen指令,使其监听 8080 端口:
对于 Nginx,调整
server块以监听 8080 端口:
重启 Varnish 和 web server
完成这些更改后,重启 Varnish 和你的 web server 以应用新的配置:
现在,Varnish 将在 80 端口处理传入请求,并将其转发到 8080 端口上的 web server,由该服务器生成并提供内容。
4. 自定义缓存行为
Varnish 允许你使用 Varnish Configuration Language (VCL) 自定义内容的缓存方式。VCL 可对缓存行为进行细粒度控制,包括排除某些内容不被缓存、处理 cookies 以及设置清除规则。
示例 1:排除内容不进入 cache
你可以通过在 VCL 文件中使用条件来排除特定页面或资源不被缓存。例如,你可能希望避免缓存动态页面或敏感用户数据,如购物车或用户资料。
sub vcl_recv {
if (req.url ~ "^/cart" || req.url ~ "^/user-profile") {
return (pass); # Skip caching for cart or profile pages
}
}在这个示例中:
URL 中包含
/cart或
/user-profile的页面将不会被缓存,而是直接传递给 backend server 进行动态生成。
示例 2:使用特定 cookies 缓存内容
你可以基于特定 cookies 缓存内容,这对于个性化内容很有用。例如,如果你只想为带有特定 cookie 的已登录用户缓存内容,你可以像这样修改缓存逻辑:
sub vcl_recv {
if (req.http.Cookie ~ "session_id") {
return (hash); # Cache for logged-in users only
}
}在这个示例中:
检查请求是否包含
session_idcookie。如果存在,Varnish 将为已登录用户缓存内容,并对没有该 cookie 的用户忽略 cache。
示例 3:设置 purge 规则
你可能希望在特定缓存内容过期后将其清除(例如,当文章更新时)。这可以使用
purge命令来完成。
sub vcl_hit {
if (obj.status == 200 && req.url ~ "/news/") {
# Purge cached news article after it has been updated
return (purge);
}
}在这个示例中:
当新闻文章更新时,清除其缓存内容,确保用户始终看到最新版本。
5. 监控和优化
为了确保 Varnish 以最佳状态运行,定期监控其性能并分析 cache 命中率至关重要。Varnish 提供了多种工具,如
varnishstat、
varnishlog和 Varnish Administration Console (VAC),用于性能监控。
示例 1:使用 varnishstat 查看指标
varnishlog 提供用于分析 Varnish 性能的关键指标,例如 cache 命中率、内存使用情况和 backend 响应时间。你可以使用它来监控你的缓存配置运行得有多好。
varnishstat该命令将显示各种统计信息,包括:
cache_hit:cache 命中的次数(从 cache 提供的请求)。
cache_miss:cache 未命中的次数(转发到 backend 的请求)。
backend_conn:到 backend server 的连接数。
你可以使用这些指标来评估你的缓存策略有多有效,并在需要时进行调整以提升性能。
示例 2:使用 varnishlog 进行详细日志记录
varnishlog 提供每个请求及其与 Varnish 交互的详细日志。这对于排查问题以及理解为什么某些请求会从 cache 提供或被转发到 backend 很有帮助。
varnishlog该命令将为你提供详细日志,显示:
请求是从 cache 提供还是传递给 backend。
特定资源的 cache 命中或未命中情况。
清除事件以及与 cache 的其他交互。
示例 3:使用 Varnish Administration Console (VAC)
Varnish Administration Console (VAC) 是一个基于 web 的界面,可帮助你管理和监控你的 Varnish 实例。VAC 提供实时统计、日志数据和 cache 信息,并以用户友好的图形界面呈现。
你可以通过访问
http://your_server_ip:6082(VAC 的默认端口)来进入 VAC。
使用 VAC 跟踪 cache 性能、优化你的 VCL 代码,并根据你看到的指标微调缓存策略。
Varnish 的使用场景
媒体网站:高速交付 images 或新闻文章等静态资源。
e-commerce platforms:加快产品列表或分类页面的加载。
新闻和出版:在突发新闻事件期间处理流量激增。
API 加速:缓存读多写少的 API endpoints 以减少 backend 负载。
结论
Varnish 是任何需要高性能和可扩展性的 web infrastructure 的强大解决方案。通过将重复的 HTTP 请求从 backend 卸载,并以闪电般的速度交付缓存内容,Varnish 有助于提升页面速度、减轻 server 压力并改善用户体验。
如果你的网站处理大量流量,或者你只是希望获得更好的性能和可靠性,那么将 Varnish 集成到你的 stack 中是一个具有战略意义的前进步骤。


