什么是 Varnish,以及如何使用它来提升 HTTP 性能?

热门:
升级您的服务器配置! 申请 AVA 并使用 立减 15%
使用优惠码:

在 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 来工作。当用户请求一个页面时:

  1. 首次请求:Varnish 将请求转发到 backend server(例如 Apache 或 NGINX)。

  2. backend 生成响应并将其发送给 Varnish。

  3. Varnish 将响应存储(缓存)到内存中。

  4. 然后 Varnish 将该响应提供给用户。

  5. 后续请求如果是相同内容,则会直接从 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/RHEL

2. 配置 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。

示例:

  1. 更改 Varnish 监听端口
    打开 Varnish 配置文件,通常位于

    /etc/varnish/default.vcl

    ,并将监听端口设置为 80:

    # /etc/varnish/default.vcl

    # Listen on port 80 (HTTP standard port)
    backend default {
    .host = "127.0.0.1";
    .port = "8080"; # Your web server will listen on port 8080
    }

  2. 在 8080 端口上配置 web server (Apache/Nginx)
    如果你使用的是 Apache,你可以在

    /etc/apache2/ports.conf

    中更改

    Listen

    指令,使其监听 8080 端口:

    Listen 8080

    对于 Nginx,调整

    server

    块以监听 8080 端口:

    server {
    listen 8080;
    server_name example.com;
    # Other configurations
    }
  3. 重启 Varnish 和 web server
    完成这些更改后,重启 Varnish 和你的 web server 以应用新的配置:

    sudo systemctl restart varnish
    sudo systemctl restart apache2 # Or nginx

现在,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_id

    cookie。如果存在,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 中是一个具有战略意义的前进步骤。