如何加快您的Drupal 7网站Varnish 4在Ubuntu 14.04和Debian 7

Drupal是最流行的免费开源内容管理系统之一。Varnish有助于扩展在软件层面,通过添加额外的软件,它可以与从越来越多的用户同时使用而产生的瓶颈问题提供帮助。即使是最简单Varnish的配置可以让您的网站在瞬间几分钟之内。

介绍

背景

Drupal是最流行的免费开源内容管理系统之一。 由于它使用底层数据库来存储和检索数据,例如内容页面,新闻项目,评论和博客帖子,因此Drupal需要大量的处理能力来提供单个页面视图。每个页面的展示包括启动PHP解释器,处理所有Drupal元素,访问数据库以获取信息,准备可视布局以及向用户提供准备好的内容。 这个密集的过程使得难以处理越来越多的同时观看网站的人。由于每个访问者都需要不可忽视的处理能力来提供服务,因此您的服务器资源很快就会成为瓶颈。 有许多方法,以适应与增长的性能问题,其中大部分可以被认为是缩放的方法应付。在软件方面的缩放被认为是系统能够适应增加的负载,例如增加的同时访问的数量。 Varnish有助于结垢上的软件级别,通过添加额外的软件,可以与瓶颈帮助。 这篇文章在Ubuntu 14.04进行测试,但应与Debian7较小的路径变化工作。它可以在其他的发行工作,以及轻微的变化。

Varnish缓存

Varnish是一种高速缓存,这意味着它的作用是存储和记忆的Web应用程序提供什么给用户的第一次的内容进行访问。 然后,它可以再次提供相同内容的后续请求,而无需再次询问Web应用程序。 它可以用来提供静态内容,例如图片,脚本或样式表,因为Varnish是极快和交通要好得多比Apache不对应。 它也可以用于缓存准静态内容;即由应用程序动态生成(使用数据库并花费大量时间准备)的内容,但是在一段时间内保持不变,使得内容适合于缓存。 例如,当网站上的文章发布时,很少更新。然后,完全不需要使所有的处理位和Drupal片段计算并且每次被请求时显示相同的文章。对于Varnish来说,记得再次服务同一页面而不接触Drupal将是完全正确的。这使得Varnish可以轻松地为10,100或甚至1000人同时提供相同的内容 - 因为提供缓存页面只需很少的处理能力。 在大多数情况下使用Varnish ,使几乎所有的网站令人难以置信的速度更快。它也使得更容易应对突然的兴趣(例如,当一个非常受欢迎的文章发布时)。这一切都转化为更快乐的访问者,他们的内容交付更快,更可靠。

先决条件

本文假设你有一个工作的Drupal为基础的LAMP的网站已经投入运行。这里有要求:
  • Ubuntu14.04Debian 7 Droplet(在Ubuntu 14.04测试)
  • 一个sudo的用户
  • Drupal

第1步 - 重新配置Apache

默认情况下,Apache的端口上侦听80这让Apache的处理web请求像一个浏览器的URL请求http://example.com 。 要使用Varnish ,它必须能够处理这些请求,而不是。首先,我们必须告诉Apache不再处理端口80上的请求。

更改Apache侦听端口

Apache的默认监听端口是在一个名为ports.conf文件,这两个DebianUbuntu位于设置/etc/apache2 。 编辑文件:
sudo nano /etc/apache2/ports.conf
这将运行表示该文件的默认内容,这应该是类似于以下的纳米文本编辑器。 更新NameVirtualHost监听线使用81端口:
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:81
Listen 81

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>
让我们来保存文件,按CTRL + X,y,然后按Enter键

更改虚拟主机的端口

默认情况下,新的Apache安装在位于配置文件中指定一个虚拟主机/etc/apache2/sites-enabled/000-default 。 如果您配置多个虚拟主机,你将不得不修改他们 。 要修改默认Apache虚拟主机的配置,让我们输入:
sudo nano /etc/apache2/sites-enabled/000-default.conf
文件内容以如下所示的行开头:
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
和以前一样,我们要改变从8081的数字:
<VirtualHost *:81>
        ServerAdmin webmaster@localhost
保存使用CTRL-X其次是y输入文件。

重新加载Apache配置

在这些更改之后,需要重新加载Apache配置:
sudo service apache2 reload
现在,Apache将像以前一样接受80新的81端口,而不是传入的请求。 我们可以证实,通过在浏览器中打开我们的网站-应该失败而不用指定端口(如打开http://example.com ),但添加新的端口地址(如后显示正确的http://例子。 COM:81 )。 我们现在准备安装和配置上Varnish ,以帮助我们使网站更快。

第2步 - 安装Varnish

无论Debian和Ubuntu具有系统封装, 上Varnish ,但我们建议用Varnish的作者提出预编译包。它将确保Varnish是最新的,这对于系统包不是真的。 首先,确保在apt-传输HTTPS软件包安装,它允许系统通过安全连接安装软件包:
sudo apt-get install apt-transport-https
这将安装必要的包或告诉我们它已经安装。 需要安装Varnish软件包服务器的公共密钥,以验证已安装软件包的真实性。首先,切换到root:
sudo su
添加密钥:
curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | apt-key add -
对于Debian:
echo "deb https://repo.varnish-cache.org/debian/ wheezy varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
对于Ubuntu的
echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
您现在可以切换回您的sudo用户。 更新系统:
sudo apt-get update
安装Varnish:
sudo apt-get install varnish
这安装和运行Varnish!

第3步 - 使油漆在端口80听

默认情况下Varnish侦听端口6081。 我们将Varnish侦听端口80来代替,把所有的传入请求从我们的网站的用户,就像Apache之前一样。 让我们打开Varnish配置文件:
sudo nano /etc/default/varnish
找到如下所示的取消注释部分:
. . .

## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.
# Use a 256MB memory based cache.
#
DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

. . .
更新DAEMON_OPTS =“ -一个:线使用端口80(记住保持\以及):
. . .

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

. . .
保存使用CTRL-xy其次是输入文件。 重新启动Varnish ,以使更改生效:
sudo service varnish restart
我们应该看到类似下面的消息,没有错误:
[ ok ] Stopping HTTP accelerator: varnishd.
[ ok ] Starting HTTP accelerator: varnishd.
现在在浏览器中检查您的网站。而不是以前可用的您的Drupal网站,你会看到一个白页,并显示一条错误消息:
Error 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配置语言)语言。 它是通过获取自身Varnish编译为本地C代码的简单编程语言。 该配置包括该期间得到处理传入的Web请求,与配置其余内容按照不同的时刻执行的方法 。 一些指令在接收到来自浏览器的请求之后,但在处理请求之前,由Varnish执行,告诉它是否将请求转发到实际应用程序,或提供缓存的内容。在这些指令中,可以处理传入的请求,更改其内容或根据请求(URL,文件名,标题或cookie)做出决定。 当Varnish决定从实际应用程序(在我们的例子中,Drupal网站)获取内容时,执行其他指令。这些指令可以用于操纵从应用程序接收的内容。 当Varnish提供缓存的内容而不从应用程序中检索它时,仍执行其他指令。 利用VCL,有可能建立一个复杂的逻辑使得基于许多因素不同的高速缓存的决定。还可以构建非常简单的指令集。 Varnish附带了所有的方法,如果需要,可以改变一个合理的默认实现。 这意味着,有可能在配置来指定仅一些方法 ,即使如此,仅一些指令,仍依靠默认值的其余部分。这使得使用基本的Varnish能力非常容易,同时可以在添加自定义指令时创建非常复杂的配置。

什么获得缓存,什么不?

也许有关配置Varnish或任何其他的缓存机制的最困难的事情是决定何时以及如何缓存。大多数问题来自不正确的决定 - 通过缓存太多或不够。 使用典型的Drupal安装,这可能导致两个不同的问题情况。 第一个是当没有足够的页面被缓存时,这使得Varnish几乎不必要。它不会加快任何事情,因为大多数页面是直接从Drupal应用程序每次获取。这对性能问题没有帮助,但它也不会破坏任何东西。 第二个是当太多页被缓存时。在这种情况下,可能根本无法登录到管理面板。当为匿名和已登录的用户投放不同的内容时,访问者可能会收到旧的,无效的内容,甚至混淆内容。在这种情况下,有可能打破没有Varnish工作正常的东西。 让我们通过一些共同因素,以帮助我们决定是否Varnish会或不会缓存内容。

varnish缓存一切

在默认情况下,方案中,基本前提是,Varnish缓存一切 。 在Varnish缓存是排他性的,不具有包容性 ,这意味着除非你犯了一个规则,否则一切都被缓存。

请求方法

请求方法是请求的基本定义。Varnish在默认情况下缓存GETHEAD请求, 从不缓存其他人一样POST,PUTDELETE。这确保了意在对数据进行某些更改的请求在未缓存的情况下完整地传递到应用程序。

授权

默认情况下,请求密码保护的页面不会被缓存在所有。 这也是如此使用HTTP基本授权仅适用于网页保护 。 Varnish不知道应用程序特定的机制,如Drupal登录页面。我们必须添加我们自己的规则,以确保登录页面不被缓存。

缓存头

有时Web应用程序在标题中返回自己的缓存信息。Varnish需要那些头进去,所以当一个Web应用程序,如Drupal的告诉Varnish永远不会缓存它的响应,这正是会发生什么,除非我们编程的VCL文件中的另一个行为。由于Drupal发送自己的缓存信息,这将进一步变得重要。

饼干

Cookie可能是使用Web应用程序进行缓存决策的最重要和最困难的部分。 默认情况下,如果有请求响应的cookie设置,页面将不会被缓存。 这是一个明智的决定,因为例如登录的用户由会话cookie标识。 如果具有Cookie的页面被缓存,所有登录的用户将获得相同的内容,并且应用程序将无法在用户之间辨别。 然而,它也是最大的问题之一,因为使用cookies是广泛的。 通常无害饼干存在于请求,诸如谷歌分析令牌,这是不使用的应用在所有,但将使内容不可缓存为好。没有仔细决定哪些cookie应该禁止缓存,哪些应该被忽略,对于今天的web应用程序,我们最终几乎没有缓存,因为有这么多的cookie浮动。 Varnish的Drupal特定配置的大多数片段将处理正确的cookie处理,以删除不必要的cookie并允许缓存,但保留例如维护管理页面功能所必需的那些。

第4步 - 为Drupal配置Varnish

基本了解如何使用Varnish进行缓存,我们可以继续配置Varnish以使用我们的Drupal站点。 让我们打开Varnish VCL配置文件:
sudo nano /etc/varnish/default.vcl
默认内容显示所有Varnish方法为空,这意味着默认值正在使用。 我们可以添加我们自己的配置指令来实现必要的缓存策略。 第一个块指示Varnish如何与后端的Web服务器,这在我们的例子就是ApacheDrupal安装。 我们将改变代码,以反映我们已经使用Apache配置的端口81。
. . .

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "81";
}

. . .
现在,找到空的占位符方法vcl_recv
. . .

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

. . .
在此方法中的代码之前接触Varnish执行我们的Drupal站点。这是我们可以从浏览器中删除一些cookie,强制缓存(或不缓存)某些地址,并做出第一个缓存决定的地方。我们将添加几个规则来完成以下操作:
  1. 允许Varnish在Drupal故障的情况下提供陈旧的(旧的)缓存内容。它会使网站部分可用,即使Drupal无法响应
  2. 确保没有缓存任何管理页面,强制Varnish跳过某些URL的缓存
  3. 确保缓存静态文件 - 图像,脚本,样式表
  4. 删除除了Drupal需要的几个cookie正常工作的所有cookie,包括用户登录功能
为了实现这个,我们用下面的代替默认块。前面有的行是注释,不会被Varnish予以考虑,但来这里是为了帮助使配置文件易于理解。整个块是新的,可以按原样粘贴:
. . .

sub vcl_recv {

    # Return (pass) instructs Varnish not to cache the request
    # when the condition is met.

    ## ADMIN PAGES ##

    # Here we filter out all URLs containing Drupal administrative sections
    if (req.url ~ "^/status\.php$" ||
        req.url ~ "^/update\.php$" ||
        req.url ~ "^/admin$" ||
        req.url ~ "^/admin/.*$" ||
        req.url ~ "^/user$" ||
        req.url ~ "^/user/.*$" ||
        req.url ~ "^/flag/.*$" ||
        req.url ~ "^.*/ajax/.*$" ||
        req.url ~ "^.*/ahah/.*$") {
           return (pass);
    }


    ## BACKUP AND MIGRATE MODULE ##

    # Backup and Migrate is a very popular Drupal module that needs to be excluded
    # It won't work with Varnish
    if (req.url ~ "^/admin/content/backup_migrate/export") {
        return (pipe);
    }

    ## COOKIES ##

    # Remove cookies for stylesheets, scripts, and images used throughout the site.
    # Removing cookies will allow Varnish to cache those files.
    if (req.url ~ "(?i)\.(css|js|jpg|jpeg|gif|png|ico)(\?.*)?$") {
        unset req.http.Cookie;
    }

    # Remove all cookies that are not necessary for Drupal to work properly.
    # Since it would be cumbersome to REMOVE certain cookies, we specify
    # which ones are of interest to us, and remove all others. In this particular
    # case we leave SESS, SSESS and NO_CACHE cookies used by Drupal's administrative
    # interface. Cookies in cookie header are delimited with ";", so when there are
    # many cookies, the header looks like "Cookie1=value1; Cookie2=value2; Cookie3..." 
    # and so on. That allows us to work with ";" to split cookies into individual
    # ones.
    #
    # The method for filtering unnecessary cookies has been adopted from:
    # https://fourkitchens.atlassian.net/wiki/display/TECH/Configure+Varnish+3+for+Drupal+7
    if (req.http.Cookie) {
        # 1. We add ; to the beginning of cookie header
        set req.http.Cookie = ";" + req.http.Cookie;
        # 2. We remove spaces following each occurence of ";". After this operation
        # all cookies are delimited with no spaces.
        set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
        # 3. We replace ";" INTO "; " (adding the space we have previously removed) in cookies
        # named SESS..., SSESS... and NO_CACHE. After this operation those cookies will be 
        # easy to differentiate from the others, because those will be the only one with space
        # after ";"   
        set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|SSESS[a-z0-9]+|NO_CACHE)=", "; \1=");
        # 4. We remove all cookies with no space after ";", so basically we remove all cookies other
        # than those above.
        set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
        # 5. We strip leading and trailing whitespace and semicolons.
        set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

        # If there are no cookies after our striping procedure, we remove the header altogether,
        # thus allowing Varnish to cache this page
        if (req.http.Cookie == "") {
            unset req.http.Cookie;
        }
        # if any of our cookies of interest are still there, we disable caching and pass the request
        # straight to Apache and Drupal
        else {
            return (pass);
        }
    }
}

. . .
下一个方法是VCL 后端响应 。此方法负责处理来自Apache和Drupal的响应,然后将其放入缓存或从缓存中丢弃它。我们可以改变Drupal发送的内容,以适应我们的缓存策略。 默认方法如下所示:
. . .

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
}

. . .
让我们用这个全新的块替换它。包括评论:
. . .

sub vcl_backend_response {
    # Remove cookies for stylesheets, scripts and images used throughout the site.
    # Removing cookies will allow Varnish to cache those files. It is uncommon for
    # static files to contain cookies, but it is possible for files generated
    # dynamically by Drupal. Those cookies are unnecessary, but could prevent files
    # from being cached.
    if (bereq.url ~ "(?i)\.(css|js|jpg|jpeg|gif|png|ico)(\?.*)?$") {
        unset beresp.http.set-cookie;
    }
}

. . .
该代码删除使用像以前一样选择文件相同的方法静态文件饼干,饼干因此获得无论是在VCL 的recvvclbackend_response相同的文件删除。 让我们将配置文件保存用CTRL + X,y然后按Enter。不需要更改其他方法。

第5步 - 重新启动Varnish

重新启动Varnish ,以使更改生效:
sudo service varnish restart
Varnish服务器应该重新启动,没有错误。 现在你应该能够在浏览器中再次查看你的Drupal网站。 然而,在我们的Drupal站点被正确缓存之前,还有一个步骤比我们应该照顾。我们需要在Drupal本身启用缓存。

第6步 - 在Drupal中启用缓存

默认情况下,Drupal的缓存机制被禁用。这导致头部被发送到Varnish,这迫使页面不被缓存。因此,禁用的Drupal缓存将自动阻止Varnish帮助我们加快网站。 要启用Drupal缓存,请以管理员身份登录到您的Drupal站点。 选择配置菜单,然后性能Drupal配置菜单性能部分,查找和检查匿名用户高速缓存块设置缓存的页面最小缓存寿命缓存页面的过期设置一个合理的值,如30分钟 。 该值提供了相当大的性能增益,并且仍然确保缓存不过时太长时间。 缓存生命周期的最佳设置取决于单个网站及其更新频率。 更改值后,单击保存配置缓存设置 这完成了必要的配置,使Varnish缓存我们的Drupal网站。

第7步 - 验证Varnish配置

要确保Varnish是缓存的网站,我们可以用称为简单的工具是Varnish工作? 。在表单中输入您的网站地址。您应该会看到类似下面的响应: 工作Varnish 如果您第一次获得“排序”消息,您可能需要检查两次。

深入阅读

本文中涉及的主题是只是冰山的一角。 Varnish是非常强大的软件,可与不仅仅是简单的缓存更多的帮助。 官方Varnish文件是关于Varnish的可能性和VCL语法一个巨大的资源。 为了充分利用Varnish和Drupal,最好还是了解Drupal自身在提高性能方面的可能性。 官方的Drupal性能文档是一个很好的起点。 Varnish是一个工具,可以帮助您的网站的性能巨大,但最终它不是一个神奇的解决方案的所有性能瓶颈,最好的结果是通过仔细规划在所有阶段实现。话虽如此,即使是最简单Varnish的配置可以让您的网站在瞬间几分钟之内。