如何在Debian和Ubuntu上使用Apache配置Drupal的Varnish

在这篇DigitalOcean文章中,作为帮助开发人员进行缩放的系列的一部分,我们将讨论使用Drupal配置Varnish。这将大大减少用户加载基于Drupal的网站所需的时间,并增加t

介绍


Drupal是一个开源内容管理框架和平台,用PHP编写的。 用于构建丰富的,基于后端的解决方案,适用于任何规模的网站和网络应用程序,它是非常受欢迎的采用率极高的统计。 它在GNU通用公共许可证下的分发意味着任何人都可以自由使用该软件,以各种方式对项目做出贡献,并与他人共享。 Drupal的主要分布是Drupal Core,截至2013年10月,它可以扩展到2万个模块和近2千个主题。

利用Drupal等平台快速原型开发应用程序是很好的。 然而,同样快速地,诸如解决您的产品的增长的问题开始出现。 这将需要您迅速扩大,以继续为您的客户提供快速服务,以保持他们对您的产品的兴趣,并保持他们的幸福。

在这种DigitalOcean文章,作为系列的一部分帮助开发人员缩放 ,我们将谈论使用Drupal配置Varnish。 这将大大减少用户加载基于Drupal的网站所花费的时间,并通过首先通过Varnish Cache软件传递请求来提高DigitalOcean VPS的同步服务能力。

缩放


当谈到关于软件的扩展时,人们通常意味着[系统]能够处理和容纳大于其构建的工作量(其将被处理)和数据(其将是保存和实时或以后使用)。 关于网络,尽管彻底的解决方案通常实现起来更昂贵,但是该问题的定义和识别变得更简单,因为它可能需要进一步将硬件并入系统。

缩放的网页(或网络应用)的两个最常见的方法是: 垂直和/或水平缩放。

垂直缩放(缩放!)


简单地说, 垂直缩放装置增加一个,单个计算机这是我们的服务器或任何形成我们的系统作为一个整体垂直的计算机的资源,通过增加更多的资源,它们或增加其容量。 增加更多内存,用更快的CPU替换CPU,获得更高容量和更快的驱动器,具有出色的读写速度(例如我们的DigitalOcean Droplet的SSD)都可以被认为是垂直缩放。 有时候,这也被称为扩大

水平缩放(缩小!)


当我们决定充分利用今天的私人服务器的出色的低定价,并纳入更多的人在我们的系统中,它被称为水平缩放 ,或者“向外扩展”。 这可能以各种方式发生,例如在自己的机器上运行我们的应用程序的每个软件,或克隆Web服务器以创建其他数据库,并通过使用反向代理来分发来自客户端的传入请求,如NGINX。 有关反向代理的更多信息,请访问http://en.wikipedia.org/wiki/Reverse_Proxy


在您的网站的坐在前面, Varnish缓存处理与直接服务静态或准静态内容,不传递请求到Web服务器(即Apache的)来处理一遍又一遍。 由于大量内容(尽管它们将被访问的时间量)需要被计算和生成一次,存储并然后从快速存取存储器提供它们大大减少了web服务器的负载,并且增加了请求量这可以由我们的系统作为一个整体同时处理。

Varnish如何帮助?


在(几乎)任何网站中使用Varnish意味着更大的力量(根据架构,当然!)更快的网站。 它还意味着更可靠的产品(由于在配置期间您会看到的原因)由于Varnish缓存的扩展功能。 所有这一切都转化为更快乐的客户谁更喜欢使用您的产品更多和一个系统,你可以更好地依赖交付。

要注意:除非我们使用Varnish一个独立的应用服务器实例(我们应该对许多很好的理由!)这在技术上不结垢(上不去,也不出),但有一个良好的系统架构和基本聪明。 然而,由于可以由单个服务器处理的负载的增加,这可以在某些方面被称为缩放,因为我们将从我们的系统具有更好的总体性能。 这实际上是扩展期望的结果,我们最终得到了一个系统架构,如果需要,它可以真正扩展; 然而,必须注意,更好的性能并不意味着缩放。

1.准备Web服务器以进行Varnish


在本文中,我们的目标是设置Varnish快速,直接从内存中提供页面。 这就是所谓的高速缓存和这个工作,Varnish需要能够向第一处理传入请求。 鉴于您的Web服务器(例如Apache)被设置为完成相同的事情(处理传入的请求),我们需要对Varnish进行一些修改以代替它。 实现这个的方法是修改它监听的端口(即端口80)。

修改Apache


默认情况下,Apache在(监听)端口80上运行,我们需要修改它。

修改对ports.conf Apache的设置

我们需要修改的端口设置在驻留在一个名为ports.conf定义/etc/apache2/文件夹。

让我们使用文本编辑器修改它。 我们将与纳米这里,这被称为用于其用户友好性相比,一些其他人的工作。

运行以下命令来打开编辑器编辑ports.conf文件的内容:

sudo nano /etc/apache2/ports.conf

在这个文件(默认情况下),你应该看到类似于:

NameVirtualHost *:80
Listen 80

<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>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

所以,尽管在哪里修改端口号被指定,从原来的,比方说,8000前两行(记住这个号码):

NameVirtualHost *:8000
Listen 8000

现在,为了保存并关闭,按CTRL + X系统提示时,请键入Y,然后按Enter键。这是要保存文件。

如果你也有_Virtual主机 (虚拟主机)Configurations_

如果你正在主持多个网站(或者设置域特定选项),你很可能有哪些我们需要更新,以及虚拟主机的配置。

运行以下命令打开编辑器以编辑您的站点的设置:

sudo nano /etc/apache2/sites-availbable/my-domain-dot-com

不要忘了用适当的名称来代替域名-的dot-com。

!!如果你不具有自定义命名的虚拟主机配置,你可以找到上的默认设置/etc/apache2/sites-available/default

根据您当前的设置,您将看到以(或包含)以下内容开头的文档:

<VirtualHost *:80>

我们现在需要从ports.conf同一端口更换:

<VirtualHost *:8000>

关闭,然后按CTRL + X,然后键入y保存文件并按下Enter键以同样的方式。

为了使更改生效,我们需要重新启动Apache:

sudo service apache2 reload

到目前为止,Apache将在新的8000端口集上接受传入请求。
我们准备进入下一步!

2.安装Varnish缓存


对于Debian和Ubuntu:


在Debian和Ubuntu设置Varnish很简单,因为它是用默认的系统包管理器分配: 贴切 但是,推荐的方法,以确保我们所得到的最新版本,是如下(参考https://www.varnish-cache.org/installation/debian ):

我们需要添加Varnish的下载URL到aptitude软件包管理器的源列表。 为了验证源,我们首先需要增加所提供的安全密钥http://repo.varnish-cache.org

让我们开始添加安全密钥[Debian和Ubuntu]:

wget http://repo.varnish-cache.org/debian/GPG-key.txt
apt-key add GPG-key.txt

现在将软件包URL添加到apt-get存储库源列表。

Debian:

echo "deb http://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list

ubuntu:

echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list

最后,让我们更新包管理器并下载/安装Varnish Cache [Debian和Ubuntu]

apt-get update
apt-get install varnish

3.修改Varnish的设置


在Apache的端口修改和Varnish安装后,我们准备继续修改Varnish的设置,以便它能够以我们需要的方式运行。

将Varnish投入生产


由于使管理员在安装后测试Varnish的原因之一,默认设置设置在前置的80端口上运行,我们需要改变这种状况。

在Debian和Ubuntu配置文件居住在/etc/default/varnish

打开编辑器以编辑文件:

nano /etc/default/varnish

运行此命令后,您将面临一个相当长但是不言自明的文档。 如果向下滚动,你会看到文本定义开始的文字DAEMON_OPTSVarnish守护进程选项,类似于块:

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

让我们修改它以将端口从6081更改为80:

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

VCL语言和文件


Varnish使用.vcl文件(默认情况下位于/etc/varnish/default.vcl )含有以运行其程序写在VCL语言指令。 这是用来定义Varnish应如何处理的请求和文件缓存系统应该如何工作。 当(通过.vcl文件)一个新的指令集被加载时,由Varnish纺(经理)过程将它们转换为C代码和编译它-然后把它用来做这项工作。

根据修改默认的VCL文件/etc/varnish/


VCL首先,语言和文件可能显得很复杂,这是由于可以为Varnish定义的各种任务。 幸运的是,我们提供的很好的例子不少,伴随着对架构(某些) https://www.varnish-cache.org/trac/wiki/VCLExamples 如果你有任何关于你想要vararnish做什么的问题或想法,阅读一些这些例子肯定会让你很容易地有你的方式,只是你需要的方式。

话虽如此,对于Drupal(和大多数网站)的一个或多或少的默认配置组合,我们将使用下面的设置。 复制并粘贴的所有代码在每个代码块,形成你的.vcl文件。

让我们再一次打开我们的编辑器修改的内容default.vcl (位于在/ etc /Varnish/)Drupal。

要打开编辑器,请运行以下命令:

nano /etc/varnish/default.vcl

您将看到一个包含默认设置的长文档。

首先,我们需要定义我们的Web服务器并告诉Varnish如何联系它。 因此,让我们修改backend default部分:

backend default {
    .host = "127.0.0.1";
    .port = "8000";
    .max_connections = 250;
    .connect_timeout = 300s;
    .first_byte_timeout = 300s;
    .between_bytes_timeout = 300s;
}

注:在下面,你会看到注释掉默认配置VCL代码大块。 你可以自由地保持它,只要你不要错误地取消注释它们,在这种情况下编译它会生成错误。

现在,我们将设置允许清除客户端的地址(请参阅以下问题,以了解更多关于清洗 ):

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

为了定义可以访问cron.php或install.php的允许地址,请追加以下内容:

acl internal {
  "192.10.0.0"/24;
  # For remote access, add your IP address here.
  # Ex: 162.xxx.xx.xx
}

这里我们将编写程序来处理来自客户端的传入(接收)请求。 继续附加以下代码块:

sub vcl_recv {

    # A great functionality of Varnish is to check
    # your web server's health and serve stale pages
    # if necessary. 
    # In case of web server lag, let's return the 
    # request with stale content.

    if (req.backend.healthy)
    {
        set req.grace = 60s;
    }
    else
    {
        set req.grace = 30m;
    }

    # Modify (remove) progress.js request parameters.

    if (req.url ~ "^/misc/progress\.js\?[0-9]+$")
    {
        set req.url = "/misc/progress.js";
    }

    # Modify HTTP X-Forwarded-For header.
    # This will replace Varnish's IP with actual client's.

    remove req.http.X-Forwarded-For;
    set    req.http.X-Forwarded-For = client.ip;

    # Check if request is allowed to invoke cache purge.

    if (req.request == "PURGE")
    {
        if (!client.ip ~ purge)
        {
            # Return Error 405 if not allowed.
            error 405 "Forbidden - Not allowed.";
        }
        return (lookup);
    }

    # Verify HTTP request methods.

    if (req.request != "GET"    && req.request != "HEAD" &&
        req.request != "PUT"    && req.request != "POST" &&
        req.request != "TRACE"  && req.request != "OPTIONS" &&
        req.request != "DELETE" && req.request != "PURGE")
    {
            return (pipe);
    }

    # Handling of different encoding types.

    if (req.http.Accept-Encoding)
    {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$")
        {
            remove req.http.Accept-Encoding;
        }
        elsif (req.http.Accept-Encoding ~ "gzip")
        {
            set req.http.Accept-Encoding = "gzip";
        }
        elsif (req.http.Accept-Encoding ~ "deflate")
        {
            set req.http.Accept-Encoding = "deflate";
        }
        else
        {
            remove req.http.Accept-Encoding;
        }
    }

    # Force look-up if request is a no-cache request.     
    if (req.http.Cache-Control ~ "no-cache")
    {
        return (pass);
    }

    # Do not allow outside access to cron.php or install.php. Depending on your access to the server, you might want to comment-out this block of code for development.
    if (req.url ~ "^/(cron|install)\.php$" && !client.ip ~ internal)
    {        
        # Throw error directly: 
        error 404 "Page not found.";
        # Or;
        # Use a custom error page on path /error-404. 
        # set req.url = "/error-404";
    } 

    # Remove certain cookies.
    set req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "Drupal.toolbar.collapsed=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
    if (req.http.cookie ~ "^ *$")
    {
        unset req.http.cookie;
    }

    # Cache static content of themes.        
    if (req.url ~ "^/themes/" && req.url ~ ".(css|js|png|gif|jp(e)?g)")
    {
        unset req.http.cookie;
    }

    # Do not cache these URL paths.
    if (req.url ~ "^/status\.php$" ||
        req.url ~ "^/update\.php$" ||
        req.url ~ "^/ooyala/ping$" ||
        req.url ~ "^/admin"        ||
        req.url ~ "^/admin/.*$"    ||
        req.url ~ "^/user"         ||
        req.url ~ "^/user/.*$"     ||
        req.url ~ "^/users/.*$"    ||
        req.url ~ "^/info/.*$"     ||
        req.url ~ "^/flag/.*$"     ||
        req.url ~ "^.*/ajax/.*$"   ||
        req.url ~ "^.*/ahah/.*$")
    {
        return (pass);
    }        

    # Cache the following file types.
    if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$")
    {
        unset req.http.Cookie;
    }

    # !! Do not cache application area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/([a-z]{2})/(payment|order|booking|media|autocomplete|monitor).*")
    {
        return (pass);
    }

    # !! Do not cache admin area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/admin" || req.url ~ "(^/app.php|^/app_dev.php|^)/(([a-z]{2})/admin)")
    {
        return (pass);
    }

    # !! Do not cache security area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/(([a-z]{2}/|)(login|logout|login_check).*)")
    {
        return (pass);
    }

    # Do not cache editor logged-in user sessions
    if (req.http.Cookie ~ "(sonata_page_is_editor)")
    {
        return (pass);
    }

    return (lookup);
}

sub vcl_hit {
    if (req.request == "PURGE")
    {
        purge;
        error 200 "Purged.";
    }
}

sub vcl_miss {
    if (req.request == "PURGE")
    {
        purge;
        error 200 "Purged.";
    }
}

运行varnish


现在我们准备重新启动Varnish守护进程。

运行以下命令使Varnish运行:

/etc/init.d/varnish restart

验证应用程序的状态


让我们运行以下两个命令来验证Apache和Varnish都绑定到正确的端口:

Apache:

netstat -lp | grep apache2

漆:

netstat -lp | grep varnish

结果应类似于以下内容:

tcp    0    0    localhost:8000    *:*     LISTEN   xxxx/apache2
-- or --
tcp6   0    0    [::]:8000         [::]:*  LISTEN   xxxx/apache2

-- and --
tcp    0    0    localhost:6082    *:*     LISTEN   xxxx/varnishd   
tcp    0    0    *:http            *:*     LISTEN   xxxx/varnishd   
tcp6   0    0    [::]:http         [::]:*  LISTEN   xxxx/varnishd   

最后


我们已经设置Apache和Varnish来使用我们的Drupal安装。 如果您想获得方关于Varnish你的Drupal后台多,你可能想尝试位于Drupal的Varnish模块 https://drupal.org/project/varnish

截至2013年10月,此模块的功能说明如下:

  • 此模块提供管理socket集成,允许Drupal动态使缓存条目无效,还允许您查询Varnish管理界面的状态等。

注:如果您使用的是Drupal的系统比7的版本较旧的,你还需要使用这个模块,由于处理cookies来参观Drupal的方式。

疑难解答,注释和提示


如何找到我的Linux发行版及其版本?

由于本文讨论多个发行版和版本,您可能希望确保您的目标是正确的。 幸运的是,解决方案相当简单。 只需运行以下命令:

cat /etc/*-release

这应该给你分配的名称和版本。

我在哪里可以了解更多关于Apache虚拟主机( 虚拟主机 )?

有关虚拟主机文件的更多信息,请访问http://httpd.apache.org/docs/2.2/vhosts/examples.htmlhttps://www.digitalocean.com/community/articles/how-to-set-向上Apache的虚拟主机上,Ubuntu的12-04-LTS分别。

如何决定使用哪个端口? 在哪里可以了解更多关于港口?

你可以选择任何你想要的端口,但某些最好避免,以防止未来的问题或与其他应用程序的冲突。 其中一些端口是:

  • 端口 25 简单邮件传输协议(SMTP)
  • 网络新闻传输协议(NNTP)同步 端口 119
  • 端口 443 HTTP通过TLS / SSL(HTTPS)
  • 端口 3306 MySQL数据库系统

有关完整列表,请参阅:
http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

清除意味着什么是Varnish的功能?

清除是缓存文件的无效。 有关主题的更多信息,请参考: https://www.varnish-cache.org/docs/3.0/tutorial/purging.html

什么是守护进程

在计算,一个守护进程是不是对自己的运行与用户直接互动的一个后台进程。 在Varnish的情况下,它的守护进程在编译VCL配置文件时,连续运行,执行预设和编译的指令,就像你的web服务器。

:提交OS Tezer