如何在Ubuntu14.04上使用SSL终止配置VarnishCache4.0

来自菜鸟教程
跳转至:导航、​搜索

介绍

在本教程中,我们将介绍如何使用 Varnish Cache 4.0 来提高现有 Web 服务器的性能。 我们还将向您展示一种向 Varnish 添加 HTTPS 支持的方法,使用 Nginx 执行 SSL 终止。 我们将假设您已经设置了一个 Web 应用程序服务器,并且我们将使用一个通用的 LAMP(Linux、Apache、MySQL、PHP)服务器作为我们的起点。

Varnish Cache 是一种缓存 HTTP 反向代理或 HTTP 加速器,可减少向用户提供内容所需的时间。 它使用的主要技术是将来自 Web 或应用程序服务器的响应缓存在内存中,因此可以为将来对相同内容的请求提供服务,而无需从 Web 服务器检索它。 性能可以在各种环境中大大提高,当您拥有内容繁重的动态 Web 应用程序时,它尤其有用。 Varnish 的主要功能是缓存,但它也有其他用途,例如反向代理负载平衡。

在许多情况下,Varnish 在其默认设置下运行良好,但请记住,必须对其进行调整以提高某些应用程序的性能,尤其是使用 cookie 的应用程序。 Varnish 的深度调优超出了本教程的范围。

先决条件

在本教程中,我们假设您已经有一个 Web 应用程序服务器在其私有 IP 地址上侦听 HTTP(端口 80)。 如果您尚未设置 Web 服务器,请使用以下链接设置您自己的 LAMP 堆栈:如何在 Ubuntu 14.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈。 我们将此服务器称为 LAMP_VPS

您将需要创建一个新的 Ubuntu 14.04 VPS,它将用于您的 Varnish 安装。 通过完成 Ubuntu 14.04 初始服务器设置指南 中的步骤 1-4 来创建具有 sudo 权限的非 root 用户。 我们将此服务器称为 Varnish_VPS

请记住,Varnish 服务器将接收用户请求,并且应该根据您期望接收的流量来调整大小。

我们的目标

我们的目标是在我们的 Web 应用程序服务器前面设置 Varnish Cache,以便可以快速有效地处理请求。 设置好缓存后,我们将向您展示如何通过使用 Nginx 处理传入的 SSL 请求来为 Varnish 添加 HTTPS 支持。 设置完成后,您的 HTTP 和 HTTPS 流量都将看到缓存的性能优势。

现在您已经设置了先决条件,并且您知道要构建什么,让我们开始吧!

安装清漆

获得最新版本 Varnish 4.0 的推荐方法是通过官方存储库安装可用的软件包。

Ubuntu 14.04 附带 apt-transport-https,但只需在 Varnish_VPS 上运行以下命令即可确定:

sudo apt-get install apt-transport-https

现在将 Varnish GPG 密钥添加到 apt:

curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | sudo apt-key add -

然后将 Varnish 4.0 存储库添加到您的 apt 源列表中:

sudo sh -c 'echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list'

最后,使用以下命令更新 apt-get 并安装 Varnish:

sudo apt-get update
sudo apt-get install varnish

默认情况下,Varnish 配置为侦听端口 6081,并希望您的 Web 服务器位于同一台服务器上并侦听端口 8080。 打开浏览器并转到服务器的 6081 端口(将突出显示的部分替换为您的公共 IP 地址或域):

http://varnish_VPS_public_IP:6081

因为我们在新的 VPS 上安装了 Varnish,所以访问您服务器的公网 IP 地址或域名的端口 6081 会返回如下错误页面:

这表明 Varnish 已安装并正在运行,但它找不到应该缓存的 Web 服务器。 现在让我们将其配置为使用我们的 Web 服务器作为后端。

配置清漆

首先,我们将配置 Varnish 以使用我们的 LAMP_VPS 作为后端。

Varnish 配置文件位于 /etc/varnish/default.vcl。 现在让我们编辑它:

sudo vi /etc/varnish/default.vcl

找到以下几行:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

并更改 hostport 的值分别匹配您的 LAMP 服务器私有 IP 地址和侦听端口。 请注意,我们假设您的 Web 应用程序正在侦听其私有 IP 地址和端口 80。 如果不是这种情况,请修改配置以满足您的需求:

backend default {
    .host = "LAMP_VPS_private_IP";
    .port = "80";
}

Varnish 有一个称为“宽限模式”的功能,启用后,如果您的 Web 服务器后端出现故障并变得不可用,它会指示 Varnish 提供请求页面的缓存副本。 现在让我们启用它。 找到以下 sub vcl_backend_response 块,并将以下突出显示的行添加到其中:

sub vcl_backend_response {
    set beresp.ttl = 10s;
    set beresp.grace = 1h;
}

这将缓存页面的宽限期设置为一小时,这意味着如果 Varnish 无法访问您的 Web 服务器以查找新副本,它将继续为缓存页面提供长达一小时的服务。 如果您的应用程序服务器出现故障,并且您希望在恢复 Web 服务器时向用户提供陈旧的内容而不是错误页面(如我们之前看到的 503 错误),这会很方便。

保存并退出 default.vcl 文件。

我们希望将 Varnish 设置为侦听默认的 HTTP 端口 (80),这样您的用户将能够访问您的站点,而无需在您的 URL 中添加不寻常的端口号。 这可以在 /etc/default/varnish 文件中设置。 现在让我们编辑它:

sudo vi /etc/default/varnish

你会看到很多行,但大部分都被注释掉了。 找到以下 DAEMON_OPTS 行(应该已经取消注释):

DAEMON_OPTS="-a :6081 \

-a 选项用于分配 Varnish 监听请求的地址和端口。 让我们将其更改为侦听默认的 HTTP 端口,即端口 80。 修改后,它应该如下所示:

DAEMON_OPTS="-a :80 \

保存并退出。

现在重新启动 Varnish 以使更改生效:

sudo service varnish restart

现在使用 Web 浏览器测试它,这次通过其公共 IP 地址访问您的 Varnish 服务器,在端口 80 (HTTP) 上:

http://varnish_VPS_public_IP

您应该会看到 LAMP_VPS 提供的相同内容。 在我们的例子中,它只是一个普通的 Apache2 Ubuntu 页面:

此时,Varnish 正在缓存我们的应用程序服务器——希望您能看到缩短响应时间带来的性能优势。 如果您有一个指向现有应用程序服务器的域名,您可以更改其 DNS 条目以指向您的 Varnish_VPS_public_IP

现在我们已经设置了基本的缓存,让我们为 Nginx 添加 SSL 支持!

Nginx 的 SSL 支持(可选)

Varnish 本身不支持 SSL 终止,因此我们将安装 Nginx 仅用于处理 HTTPS 流量。 我们将介绍使用自签名 SSL 证书安装和配置 Nginx 的步骤,以及从 HTTPS 连接到通过 HTTP 的 Varnish 的反向代理流量。

如果您想更详细地了解如何使用 Nginx 设置自签名 SSL 证书,请参阅此链接:SSL with Nginx for Ubuntu。 如果您想尝试使用 StartSSL 的证书,这里有一个涵盖该的教程。

让我们安装 Nginx。

安装 Nginx

Varnish_VPS 上,让我们使用以下 apt 命令安装 Nginx:

sudo apt-get install nginx

安装完成后,你会注意到 Nginx 没有运行。 这是因为它默认配置为侦听端口 80,但 Varnish 已经在使用该端口。 这很好,因为我们想监听默认的 HTTPS 端口,端口 443。

让我们生成我们将使用的 SSL 证书。

生成自签名 SSL 证书

Varnish_VPS 上,创建一个可以放置 SSL 证书的目录:

sudo mkdir /etc/nginx/ssl

生成一个自签名的 2048 位 SSL 密钥和证书对:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

确保您设置 common name 以匹配您的域名。 此特定证书将在一年内到期。

现在我们已经有了证书,让我们配置 Nginx 以使用它。

配置 Nginx

打开默认的 Nginx 服务器块配置进行编辑:

sudo vi /etc/nginx/sites-enabled/default

删除文件中的所有内容并将其替换为以下内容(并更改 server_name 以匹配您的域名):

server {
        listen 443 ssl;

        server_name example.com;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location / {
            proxy_pass http://127.0.0.1:80;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header Host $host;
        }
}

保存并退出。 上面的配置有几个重要的行,我们将更详细地解释:

  • ssl_certificate:指定 SSL 证书位置
  • ssl_certificate_key:指定 SSL 密钥位置
  • listen 443 ssl:配置Nginx监听443端口
  • server_name:指定您的服务器名称,并应与您的 SSL 证书的通用名称匹配
  • proxy_pass http://127.0.0.1:80;:将流量重定向到Varnish(运行在127.0.0.1的80端口(即 localhost)

其他 proxy_set_header 行告诉 Nginx 转发信息,例如原始用户的 IP 地址,以及任何用户请求。

现在让我们启动 Nginx,以便我们的服务器可以处理 HTTPS 请求。

sudo service nginx start

现在使用 Web 浏览器测试它,这次是通过其公共 IP 地址访问您的 Varnish 服务器,在端口 443 (HTTPS) 上:

https://varnish_VPS_public_IP

注意: 如果您使用自签名证书,您将看到类似“站点的安全证书不受信任”的警告。 由于您知道您刚刚创建了证书,因此可以安全地继续。

同样,您应该看到与以前相同的应用程序页面。 不同之处在于,您实际上是在访问 Nginx 服务器,它处理 SSL 加密并将未加密的请求转发给 Varnish,Varnish 会像平常一样处理请求。

配置后端 Web 服务器

如果您的后端 Web 服务器绑定到它的所有网络接口(即 公共和私有网络接口),您将需要修改您的 Web 服务器配置,使其仅在其私有接口上侦听。 这是为了防止用户直接通过其公共 IP 地址访问您的后端 Web 服务器,这将绕过您的 Varnish 缓存。

在 Apache 或 Nginx 中,这将涉及分配 listen 指令的值以绑定到后端服务器的私有 IP 地址。

清漆故障排除

如果您无法让 Varnish 正确地为您的页面提供服务,这里有一些命令可以帮助您了解 Varnish 在幕后所做的事情。

统计数据

如果您想了解缓存的执行情况,您需要查看 varnishstat 命令。 像这样运行它:

varnishstat

您将看到如下所示的屏幕:

出现了各种各样的统计数据,使用向上/向下箭头滚动将显示每个项目的简短描述。 cache_hit 统计数据显示有多少请求通过缓存结果提供服务 - 您希望此数字尽可能接近客户端请求的总数 (client_req)。

q退出。

日志

如果你想以流日志的形式详细了解 Varnish 如何处理每个单独的请求,你将需要使用 varnishlog 命令。 像这样运行它:

varnishlog

运行后,尝试通过 Web 浏览器访问您的 Varnish 服务器。 对于您发送给 Varnish 的每个请求,您将看到一个详细的输出,可用于帮助排除和调整您的 Varnish 配置。

CTRL + C退出。

结论

现在您的 Web 服务器前面有一个 Varnish Cache 服务器,在大多数情况下您会看到性能有所提高。 请记住,Varnish 非常强大且可调整,它可能需要额外的调整才能从中获得全部好处。