介绍
背景
Drupal 是最受欢迎的免费开源内容管理系统之一。
由于它使用基础数据库来存储和检索数据,如内容页面,新闻项目,评论和博客帖子,Drupal需要大量的处理能力来服务一个单一的页面视图.每个页面打印涉及启动PHP解释器,处理所有Drupal元素,访问数据库以获取信息,准备视觉布局,并为用户提供准备的内容。
这种密集的过程使得难以应对越来越多的人同时浏览网站,因为每个访问者都需要大量的处理能力,因此您的服务器资源可以迅速成为瓶颈。
有许多方法来适应增长和应对性能问题,其中大多数可以被认为是 scaling 的方法。
**Varnish 在软件层面帮助扩展,通过添加额外的软件来帮助解决瓶颈。
本文已在Ubuntu 14.04上测试,但应该在Debian 7上进行轻微路径更改。
华为隐藏
Varnish是一个缓存,这意味着它的作用是存储和记住网页应用程序在首次访问内容时为用户提供什么服务,然后它可以为后续请求提供相同的内容 再次,而无需再次请求网页应用程序。
它可以用来服务静态内容,如图像,脚本或样式表,因为Varnish非常快,并且比Apache更能处理流量,也可以用来缓存近静态内容,即应用程序动态生成的内容(使用数据库并花费大量时间准备),但在一段时间内保持不变,使内容适合缓存。
例如,当网站上的文章被发布时,它很少被更新,然后完全不需要使用 Drupal 的所有处理位和部件来计算并每次要求显示相同的文章。Varnish 会记住再次服务相同的页面,而无需与 Drupal 联系,这使得Varnish 可以轻松地同时服务相同的内容给 10, 100,甚至 1000 人 - 因为服务缓存页面需要很少的处理能力。
在大多数情况下,使用 Varnish几乎使任何网站难以置信的速度。它也使它更容易应对突然的兴趣峰值(例如,当一个非常受欢迎的文章发布时)。
前提条件
该文章假定您已经在 LAMP 上运行并运行了基于 Drupal的网站,以下是要求:
步骤 1 – 重组 Apache
默认情况下,Apache在端口80上收听,这允许Apache处理网页请求,例如浏览器URL请求,以便使用http://example.com。
更改 Apache 端口列表
默认情况下,Apache 倾听的端口设置在一个名为ports.conf的文件中,在Debian 和 Ubuntu 中,它位于 /etc/apache2
。
编辑文件:
1sudo nano /etc/apache2/ports.conf
这将运行一个 nano文本编辑器,显示该文件的默认内容,该内容应该类似于以下内容。
1# If you just change the port or add more ports here, you will likely also
2# have to change the VirtualHost statement in
3# /etc/apache2/sites-enabled/000-default
4# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
5# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
6# README.Debian.gz
NameVirtualHost _:81 Listen 81
让我们通过按 CTRL+x,然后按 y,然后按 Enter来保存文件。
更改虚拟主机的端口
默认情况下,新的 Apache安装有一个虚拟主机,在位于 /etc/apache2/sites-enabled/000-default
的配置文件中指定。
要更改默认的 Apache 虚拟主机的配置,让我们键入:
1sudo nano /etc/apache2/sites-enabled/000-default.conf
文件内容以如下几行开始:
1<VirtualHost *:80>
2 ServerAdmin webmaster@localhost
就像以前一样,我们必须将数字从 80更改为 81:
1<VirtualHost *:81>
2 ServerAdmin webmaster@localhost
使用 CTRL-x 保存文件,然后是 y 和 Enter。
重新加载 Apache 配置
经过这些更改,需要重新加载Apache配置:
1sudo service apache2 reload
现在,Apache将在新端口 81上接受接入请求,而不是在 80上,就像以前一样。
我们可以确认,通过在浏览器中打开我们的网站 - 它不应该打开没有指定端口(如 http://example.com),但在添加新端口到地址后正确显示(如 http://example.com:81)。
我们现在已经准备好安装和配置 Varnish,以帮助我们使网站更快。
第2步:安装Varnish
Debian 和 Ubuntu 都有使用 Varnish的系统包,但我们建议使用由 Varnish 作者制作的预先构建的软件包。
首先,请确保安装了 apt-transport-https 包,允许系统通过安全连接安装包:
1sudo apt-get install apt-transport-https
这将安装所需的包,或者告诉我们它已经安装了。
必须安装Varnish包服务器的公共密钥,以验证安装的包的真实性。
1sudo su
添加钥匙:
1curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | apt-key add -
对于 Debian:
1echo "deb https://repo.varnish-cache.org/debian/ wheezy varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
对于 Ubuntu 来说:
1echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
**您现在可以重新切换到您的 sudo 用户。
更新您的系统:
1sudo apt-get update
安装Varnish:
1sudo apt-get install varnish
它安装并运行Varnish!
步骤 3 — 在端口 80 上创建 Varnish Listen
默认情况下,Varnish 会听到端口 6081. 相反,我们会让Varnish 听到端口 80,接收我们的网页用户的所有传入请求,就像 Apache以前一样。
让我们打开 Varnish 配置文件,使用:
1sudo nano /etc/default/varnish
查找下面的未评论的部分:
1. . .
替代方法 2 使用 VCL
聆听端口 6081,在 localhost:6082上进行管理,并根据请求转发到 vcl 文件所选择的一个内容服务器
使用基于 256 MB 的内存缓存。
DAEMON_OPTS="-a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -soc malloc,256m"
.
更新 DAEMON_OPTS="-a:一行以使用端口 80(请记住也保留 `):
...
DAEMON_OPTS="-a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m"
...
保存使用 CTRL-x和 y的文件,然后是 Enter。
重启 Varnish 以使更改生效:
1sudo service varnish restart
我们应该看到如下消息,没有错误:
1[ ok ] Stopping HTTP accelerator: varnishd.
2[ ok ] Starting HTTP accelerator: varnishd.
现在在浏览器中检查您的网站,而不是您以前可用的Drupal网站,您将看到一个白页,其中包含一个错误消息:
1Error 503 Backend fetch failed
Backend fetch failed
Guru Meditation:
XID: 131081
Varnish cache server
这意味着Varnish已正确配置以接受接入连接,但尚未可用于服务我们的Drupal网站. 我们将在以下步骤中对配置进行更改,以使前一个Drupal网站重新在线。
Varnish 如何工作
一个很好的资源,以获得一个坚实的理解 Varnish 是官方 Varnish 书,但我们将涵盖一些关于 Varnish 如何工作的基本事实。
您也可以跳到下一步,如果您现在想完成安装,并稍后了解更多信息. 但是,如果您了解Varnish如何工作,您将更好地了解下一步。
VCL 语言
Varnish 的配置是用一种名为 VCL(Varnish Configuration Language)的语言编写的,它是一种简单的编程语言,由 Varnish 自己编译成原生 C代码。
配置由 _methods 组成,这些方法在处理到来的 Web 请求的不同时刻执行,以及其余的配置内容。
Varnish在接收浏览器请求时执行一些指令,但在请求处理之前,这些指令告诉它是否要将请求转发到实际应用程序中,或提供缓存内容. 在这些指令中,可以操纵接收请求,更改其内容,或根据请求做出决定(URL,文件名,标题或cookie)。
当Varnish决定从实际应用程序中获取内容时执行其他指令(在我们的情况下,Drupal网站)。
当Varnish提供缓存内容时,仍会执行其他指令,而不会从应用程序中获取新鲜内容。
使用 VCL,可以构建一个复杂的逻辑,根据许多因素做出不同的缓存决策,也可以构建一个非常简单的指令集。
Varnish 为其所有方法提供了合理的默认实现,可在需要时进行更改,这意味着在配置中只能指定某些方法,甚至只有某些指令,仍然依赖于其他方法的默认。
什么被缓存,什么不?
也许配置Varnish或任何其他缓存机制最困难的事情是决定何时和何时缓存。
在典型的 Drupal 安装中,这可能导致两个不同的问题场景。
第一个是当没有足够的页面被缓存时,这使得Varnish几乎不必要。它根本没有加速事情,因为大多数页面每次都直接从Drupal应用程序中获取。
第二个是当太多页面被缓存时。在这种情况下,可能根本无法登录管理面板. 访问者可能会收到旧的,无效的内容,甚至混合的内容,当不同的内容被提供给匿名和登录的用户。
让我们通过一些常见的因素来帮助我们决定 Varnish是否会缓存内容。
Varnish 隐藏一切
在默认情况下,基本前提是Varnish会缓存 **一切 **.Varnish 中的缓存是 exclusive,而不是 inclusive,这意味着除非您制定另一种规则,否则一切都会缓存。
要求方法
请求方法是请求的基本定义. 默认缓存 仅有 GET 和 HEAD 请求, 永远不会缓存其他请求,如 POST、 PUT 和 DELETE。
许可
默认情况下,对被密码保护的页面的请求不会被缓存。 ** 这仅适用于使用 HTTP 基本授权保护的页面**。Varnish 不知道应用程序特定的机制,例如 Drupal 登录页面。
隐藏头部
Varnish 会考虑这些标题,所以当像 Drupal 这样的 Web 应用程序告诉 Varnish 永远不要缓存其响应时,这正是除非我们在 VCL 文件中编程另一种行为的情况。
饼干
Cookie 可能是与 Web 应用程序进行缓存决策的最重要和最困难的部分。
默认情况下,如果设置了请求或响应cookies,页面将不会被缓存,这是一个明智的决定,因为,例如,已登录的用户被会话cookie识别。如果有cookie的页面被缓存,所有登录的用户将获得相同的内容,并且应用程序将无法区分用户之间。然而,它也是最大的问题来源之一,因为cookie的使用很普遍。 通常,无害的cookie在请求中存在,如Google Analytics**代币,这些代币不被应用程序使用,但也会使内容不可缓存。
大多数 Drupal 特定的 Varnish 配置部分将处理适当的 Cookie 处理,以删除不必要的 Cookie 并允许缓存,但保留所需的功能,例如维持管理页面的功能。
步骤 4 — 为 Drupal 配置 Varnish
有了Varnish缓存如何工作的基本理解,我们可以继续配置Varnish以与我们的Drupal网站一起工作。
让我们打开 Varnish VCL 配置文件:
1sudo nano /etc/varnish/default.vcl
默认内容显示所有 Varnish 方法为空,这意味着默认内容正在使用。
我们可以添加自己的配置说明,以实现所需的缓存策略。
第一块指示Varnish如何联系后端 Web 服务器,在我们的情况下是 Apache与 Drupal安装. 我们将更改代码以反映我们用来配置 Apache的端口 81。
1. . .
默认后端定义. 将此设置为指向您的内容服务器
后端默认 { .host = "127.0.0.1"; .port = "81"; }
.
现在查找空位列方法 vcl_recv
:
1. . .
sub vcl_recv {
在我们检查我们是否已经在缓存之前发生了
通常你在这里清理请求,删除你不需要的Cookies(
#重写请求等 }
...
此方法中的代码执行 _before_Varnish**联系我们的 Drupal网站。这是当我们可以删除一些来自浏览器的Cookies时,强迫(或不)某些地址的缓存,并做出第一个缓存决定。
- 允许 Varnish 在 Drupal 故障的情况下提供旧的缓存内容. 即使 Drupal 未能响应 2,它也会使网站部分可用.2 确保没有任何行政页面被缓存,迫使 Varnish 跳过某些 URL 的缓存3。 确保静态文件的缓存 - 图像,脚本,风格表 4。 删除所有除 Drupal 需要的几个 Cookie 以外的 Cookie,包括用户登录功能
要做到这一点,让我们将默认块替换为以下一个。以 **#**为前面的行是评论,并不会被Varnish考虑,但在这里帮助使配置文件易于理解。
1# Return (pass) instructs Varnish not to cache the request
2 # when the condition is met.
3
4 ## ADMIN PAGES ##
5
6 # Here we filter out all URLs containing Drupal administrative sections
7 if (req.url ~ "^/status\.php$" ||
8 req.url ~ "^/update\.php$" ||
9 req.url ~ "^/admin$" ||
10 req.url ~ "^/admin/.*$" ||
11 req.url ~ "^/user$" ||
12 req.url ~ "^/user/.*$" ||
13 req.url ~ "^/flag/.*$" ||
14 req.url ~ "^.*/ajax/.*$" ||
15 req.url ~ "^.*/ahah/.*$") {
16 return (pass);
17 }
18
19
20 ## BACKUP AND MIGRATE MODULE ##
21
22 # Backup and Migrate is a very popular Drupal module that needs to be excluded
23 # It won't work with Varnish
24 if (req.url ~ "^/admin/content/backup_migrate/export") {
25 return (pipe);
26 }
27
28 ## COOKIES ##
29
30 # Remove cookies for stylesheets, scripts, and images used throughout the site.
31 # Removing cookies will allow Varnish to cache those files.
32 if (req.url ~ "(?i)\.(css|js|jpg|jpeg|gif|png|ico)(\?.*)?$") {
33 unset req.http.Cookie;
34 }
删除 Drupal 正常工作不需要的所有 cookie 。 (_)
) # 因为要删除某些饼干会很烦琐, 我们指定
哪些是我们感兴趣的, 并删除所有其他 。 特别是
我们离开SESS,SSESS和由德鲁帕尔行政
使用的NO_CACHE cookie#接口. 饼干头中的饼干被以";"来划分,所以当有
很多饼干时,头像"Cookie1=值1;Cookie2=值2;Cookie3"
等. 这使得我们能与";"合作将饼干分拆成个人(-
)#一. (- )#一. (- )#过滤不必要的饼干的方法已经从 (- )# https://fourkitchens.atlassian.net/wiki/display/TECH/confit+Varnish+3+for+Drupal+7 (- )如果(req.http.Cookie){(- )# 1. 我们添加;在饼干头的开头设置了 req.http. Cookie = ";" + req.http.Cookie;
2. 我们在";"的每次发生后都会去除空格. 在此操作后
所有 cookie 被无空格分隔 。
set req. http. Cookie = regsuball(req.http.Cookie,";+";";";";";";";";";";";";"我们替换";";";";"(添加我们之前去掉的空间)"在cookie
被命名为SSS.,SSESS.和NO_CACHE. 操作后,这些饼干将
容易与其他饼干区分,因为这些饼干将是";"
set req.http后唯一有空间 的饼干. Cookie = regsuball(req.http.Cookie,"; (SSES[a-z0-9]-SSESS [a-z0-9]-_NO_CACHE]=";
4. 我们删除所有饼干,在";"之后没有空格;",所以基本上我们删除所有饼干 (-
) # 超过上面的. (- ) set req.http. Cookie = regsuball(req.http.Cookie,";";";"*";";";";";";";"# " 5. 我们剥去正向并跟随白空和分号. set req.http. Cookie = regsuball(req.http.Cookie,"^; ];+$","";"; (- ) (- )# 如果我们剥取程序之后没有饼干,我们就完全去掉头条,(- )# 这样,如果(req.http.Cookie =="){(- )没有设置 req.http.Cookie; (- )}(- )# 如果我们的饼干还在那里,我们就禁止缓存并传递请求(-) )#直通阿帕奇和德鲁帕尔 否则{ 返回(通过); (_) )}
. 下一种方法是vcl_后端响应. 这种方法负责处理Apache和Drupal的响应,然后将其放入缓存或从缓存中丢弃. 我们可以改变Drupal送来的东西 以适应我们的潜伏策略.
默认方法看起来像是:
. (- ) . (- ) sub vcl_后端响应 { (- ) # 在读取后端的响应信头后会发生. (- ) (- ) # 您在这里清理响应信头, 删除愚蠢的 Set- Cookie headers (- _) # 以及您后端的其他错误. (-) )}
.
让我们用这个全新的块来取而代之. 评论包括:
.
sub vcl_后端_应答 {
删除用于整个站点使用的样式表,脚本和图像的饼干. (_)
) # 删除 cookie 可以让Varnish缓存这些文件.
静态文件包含 cookie 是罕见的, 但生成的文件是可能的( _)
)#由德鲁帕尔动态出道. 这些饼干是不必要的,但可以防止文件
被缓存.
如果( bereq.url ~ (?i.). (css|js|jpg|jpeg|g|g|? *??)"). { 未设置 beresp.http.set-cookie;} }
代码用相同的选择文件方法去除用于静态文件的cookie,所以cookie在vcl_recv和vcl_backend_response中都会被去掉用于相同的文件.
让我们用 CTRL+x保存配置文件,然后用 y,然后用 Enter。
步骤 5 – 重启 Varnish
重启 Varnish 以使更改生效:
1sudo service varnish restart
Varnish 服务器应该在没有错误的情况下重新启动。
现在您应该能够在浏览器中再次查看您的 Drupal 网站。
然而,在我们的Drupal网站得到适当的缓存之前,我们还需要采取一个步骤,我们需要在Drupal本身启用缓存。
步骤 6 – 在 Drupal 中启用缓存
默认情况下,Drupal 已禁用其缓存机制,这导致将标题发送到Varnish,这迫使页面根本不被缓存,因此,禁用的Drupal 缓存将自动阻止Varnish帮助我们加快网站。
要启用 Drupal 缓存,请作为管理员登录您的 Drupal 网站。
选择配置
菜单,然后选择性能
。
在性能
部分中,查找并检查匿名用户的缓存
页面和缓存块
设置。
将 ** 最小缓存寿命** 和 ** 缓存页面期限** 设置为合理值,例如 ** 30 分钟**. 此值可提供显著的性能提高,并确保缓存不会停留太久。
这完成了必要的配置,使Varnish缓存我们的Drupal网站。
步骤 7 – 验证 Varnish 配置
为了确保Varnish正在缓存网站,我们可以使用一个简单的工具,名为 Is Varnish Working?。
您可能想检查两次,如果您第一次收到类型
消息。
进一步阅读
本文所涵盖的主题仅仅是冰山的尖端。 Varnish 是非常强大的软件,可以帮助多于简单的缓存。 官方 Varnish 文档是关于 Varnish 可能性和 VCL 语法的丰富资源。 为了充分利用 Varnish 和 Drupal,最好了解 Drupal 自身的能力,以提高性能。
Varnish是一个工具,可以极大地帮助您的网站的性能,但最终它不是所有性能瓶颈的神奇解决方案,最好的结果是通过仔细规划在所有阶段实现的。