Varnish:您的网站更快更稳定

您是否正在管理运行博客或内容网站的服务器并期待或遇到大量请求?

我自己最近也遇到过这种情况,在一个虚拟机上运行一个 WordPress 实例,在一天之内突然收到了超过 30,000 个请求(提示:如果你正在阅读这篇文章,你可能知道它)。

我是如何在网站不宕机或速度变得难以忍受的情况下做到这一点的? 借助名为 可在 Fedora!

介绍:清漆

Varnish 是一个缓存守护进程,位于访问者和 Web 守护进程本身之间。 对于传入的每个请求,它都会查看它是否已经检索到该页面的缓存版本。

如果是这样,它服务于它; 如果没有,它将从后端 Web 服务器请求该页面,将其提供给访问者,并通过请求同一页面来缓存该页面以供下一个访问者到来时使用。

清漆如何工作?

Varnish 几乎看起来像魔术,可以极大地提高您网站的性能,但有一些事情需要考虑。

在其他人中:

  • 它不会缓存任何包含 cookie 的请求。
  • 它会将 /mypage?counter=1 视为与 /mypage?counter=2 不同的页面,因此点击第二个不会导致第一个缓存命中。
  • 你如何告诉 Varnish 页面已经改变并且需要刷新它的缓存?

首先要做的事情:如果您的网站有很多公共和静态内容,Varnish 是一个了不起的工具,它不太适合大多数请求都经过身份验证的网站,并且应该为不同的人提供不同的结果,因为事实上它缓存整个网页。

如果您想为需要用户登录的网站或在非常动态的网站上进行缓存,Varnish 将不太适合,甚至可能会增加负载。 在这种情况下,您需要更特定于网站本身的缓存。 为了 example, 像 内存缓存 在这些情况下工作得更好。

然而,Varnish 最理想的一种情况是博客,大多数访问您网站的人都不会登录,而是阅读(大部分)静态内容。

Varnish 入门

那么,如何设置呢? 很容易——你从安装 Varnish 开始!

$ sudo dnf install varnish

接下来,您需要确保使用它。 对于本文,我将假设您在与 Varnish 设置相同的服务器上运行网站,并且您正在使用 Apache 作为后端服务器。

你现在有两种使用 Varnish 的方法:

  • 允许它直接在端口 80 上处理请求——它代理 Apache 在 8080 端口上。
  • 设置两个站点 Apache: 监听 80 端口并代理 8080 端口上的 Varnish,它代理 Apache 在其他一些港口。

我将专注于第一个,因为这有点棘手,而将第二个(它具有启用 SSL 的优势)作为对你的挑战,读者(基本上你使用

ProxyPass https://localhost:6081/

在 Apache并添加第二个虚拟主机监听端口 8080 到 Apache 您在哪里提供实际应用程序)。

配置 Apache 用于清漆

  1. 建立 Apache去 /etc/httpd/conf/

    并打开

    httpd.conf

    .

  2. 搜索说“听 80”的行

    “,并将其更改为”

    听8080

    “。

    1. 注意:8080 本质上可以是任何随机端口,但我选择 8080 是因为 SELinux 策略将其标记为“辅助 httpd 端口”,这确保允许 Varnish 连接并 Apache 被允许收听。 如果您选择另一个端口,您将需要一个自定义策略来允许这两个步骤。
  3. 接下来,我们设置 Varnish。 转到 /etc/varnish/

    并打开

    清漆参数

    .

  4. 搜索 VARNISH_LISTEN_PORT=6081

    ,并将其更改为

    VARNISH_LISTEN_PORT=80

    .

  5. 现在,您将要启用清漆( systemctl enable varnish.service

    ),以确保它在系统启动时启动。

  6. 要使这两个端口更改生效而没有任何明显的停机时间,您可以同时重新启动这两个服务。
    1. systemctl restart httpd.service varnish.service

      (您需要确保 httpd 是两者中的第一个,以确保 varnish 在启动时不会崩溃,因为 Apache 仍在监听 80 端口)

现在,此时您已经使用默认设置设置了 Varnish,实际上效果很好!

测试清漆

您可以通过执行以下操作来验证它是否有效

curl -i https://yoursite.com

: 你应该看到一个 X-Varnish 标题,后面有一个数字。 这是 Varnish 请求 ID,可用于调试。

如果您第二次执行相同的请求(向上按箭头键并输入),您应该会看到 X-Varnish 标头现在有两个数字。 第一个是当前请求的请求ID,第二个很可能与第一个请求相同。 这是 Varnish 缓存的请求数,现在正在响应缓存的结果。

如果你在第二个请求上看到两个数字,这意味着 Varnish 缓存了请求并且 Apache 此请求未命中。 这容易吗?

此时,您应该有一个实际工作的 Varnish 实例,它将缓存所有未经身份验证的请求,并大大加快您的静态网站!

定制清漆

您可能想要自定义 Varnish 处理流程的某些部分。 你通过打开来做到这一点

/etc/varnish/default.vcl

,它实际上是一个用 Varnish 配置语言编写的程序。 这有一些子例程在请求处理的不同部分被触发。

忽略参数和 cookie

您可能要在此处处理的主要部分之一是确保忽略某些页面的查询参数或 cookie 以确定是否应从缓存中提供页面(例如 example 因为它们是静态内容并且不依赖于任何一个,但您的框架仍会发送它)。

为了 example如果你运行的是 WordPress, 总是缓存就好了

/wp-包括/

,因为那只是静态的 JavaScript 和 CSS 文件。 为了告诉 Varnish 这件事,在 sub vcl_recv 中添加以下内容:

if (req.url ~ "^/wp-includes/") {
 unset req.http.cookie;
 set req.url = regsub(req.url, "?.*", "");
 }

这将告诉 Varnish 忽略 cookie 和查询参数,所以即使你请求

/wp-includes/page.js?timestamp=1

,即使缓存被记录,它也会返回缓存的条目

/wp-includes/page.js?timestamp=2

.

(实际上它只是在检查它是否已经在缓存中之前从 URL 中删除所有 cookie 和查询参数。请注意,这也意味着查询参数和 cookie 对后端不可用)。

不缓存特定页面

另一个常见的事情可能是你有一些你不想从缓存中获取的页面。 为了 example,WordPress cron 页面不是您想要缓存的东西。

为此,我们可以在 vcl_recv 中做:

if (req.url ~ "^/wp-cron.php") {
 return (pass);
 }

这将告诉 Varnish 始终将请求传递到后端,并且永远不会从缓存中提供它。

清除清漆缓存

现在,最后一件事是您可能希望您的应用程序告诉 Varnish 清除其缓存。 为了 exampleWordPress 可以告诉 Varnish 有一篇新文章发表了,所以它应该清除它的缓存并生成一个包含新文章的新缓存。

由于我们不想允许来自外部源的这些请求(因为这会使任何人都可以清除缓存,从而破坏整个目的),我们将首先设置一个名为“purge”的访问控制列表(ACL)。 你可以给它起任何名字,但这对我来说总是有意义的。

将以下内容放在 VCL 文件中的任何“子”块之前:

acl purge {
 "localhost";
 "127.0.0.1";
 }

现在要实际使用它并允许 localhost 清除缓存,请将以下内容添加到

vcl_recv

if (req.method == "PURGE") {
 if (!client.ip ~ purge) {
 return(synth(405,"Not allowed."));
 }
 return (purge);
 }

之后,本地主机可以发送清除请求。 试试看”

curl -I –request PURGE https://localhost/

. 你应该得到“HTTP/1.1 200 Purged”,下一个请求将再次从后端重新请求(提示: 清漆 HTTP 清除 是一个 WordPress 插件,可以在更改时自动执行这些 PURGE 请求)。

现在你有一个 Varnish 缓存服务器,它将缓存任何静态请求和静态内容请求,并且应该大大加快你的站点速度。 您可以随时调整 Varnish VCL 文件,但这至少应该让您开始使用基本的缓存服务器。

特色图片归功于 33hops.com.