本文指导如何使用Varnish4.0提升Web服务器性能,包括配置Varnish为LAMP服务器提供缓存,以及通过Nginx实现SSL终止并添加HTTPS支持。还介绍了Varnish的配置和故障排查方法。
简介
在本教程中,我们将介绍如何使用 Varnish Cache 4.0 来提高现有 Web 服务器的性能。我们还将向您展示如何通过使用 Nginx 执行 SSL 终止来为 Varnish 添加 HTTPS 支持。我们假设您已经设置了一个 Web 应用服务器,并且我们将使用一个通用的 LAMP(Linux、Apache、MySQL、PHP)服务器作为起点。
Varnish Cache 是一个缓存 HTTP 反向代理,或者说是 HTTP 加速器,它可以减少向用户提供内容所需的时间。它主要使用的技术是将来自 Web 或应用服务器的响应缓存在内存中,因此将来对相同内容的请求可以在无需从 Web 服务器检索的情况下提供服务。在各种环境中都可以大大提高性能,特别是在内容丰富的动态 Web 应用程序中特别有用。Varnish 的主要特点是缓存,但它还有其他用途,比如反向代理负载均衡。
在许多情况下,Varnish 默认情况下工作良好,但请记住,它必须进行调整以提高对某些应用程序的性能,特别是那些使用 cookie 的应用程序。本教程不涉及 Varnish 的深度调整。
先决条件
在本教程中,我们假设您已经有一个 Web 应用程序服务器,它正在其私有 IP 地址上监听 HTTP(端口 80)。如果您还没有设置 Web 服务器,请使用以下链接在 Ubuntu 14.04 上设置自己的 LAMP 堆栈:如何在 Ubuntu 14.04 上安装 Linux、Apache、MySQL、PHP(LAMP)堆栈。我们将把这台服务器称为 LAMP_VPS。
!现有环境
您需要创建一个新的 Ubuntu 14.04 VPS,用于安装 Varnish。通过完成 Ubuntu 14.04 服务器初始设置指南中的步骤 1-4,创建一个具有 sudo 权限的非根用户。我们将把这台服务器称为 Varnish_VPS。
请记住,Varnish 服务器将接收用户请求,并且应该根据您预期接收的流量进行充分大小的设置。
我们的目标
!我们的目标
我们的目标是在我们的 Web 应用程序服务器前设置 Varnish Cache,以便可以快速高效地提供请求。在设置缓存之后,我们将向您展示如何通过利用 Nginx 处理传入的 SSL 请求,为 Varnish 添加 HTTPS 支持。设置完成后,您的 HTTP 和 HTTPS 流量都将看到缓存的性能优势。
现在您已经设置了先决条件,并且知道您要构建什么,让我们开始吧!
安装 Varnish
获取 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
将返回以下错误页面:
!503 错误
这表示 Varnish 已安装并正在运行,但找不到它应该缓存的 Web 服务器。现在让我们配置它以使用我们的 Web 服务器作为后端。
配置 Varnish
首先,我们将配置 Varnish 使用我们的 LAMP_VPS 作为后端。
Varnish 配置文件位于 /etc/varnish/default.vcl
。现在让我们编辑它:
sudo vi /etc/varnish/default.vcl
找到以下行:
backend default { .host = "127.0.0.1"; .port = "8080"; }
并更改 host
和 port
的值以匹配您的 LAMP 服务器私有 IP 地址和监听端口。请注意,我们假设您的 Web 应用程序正在其私有 IP 地址和端口 80 上监听。如果不是这种情况,请修改配置以满足您的需求:
backend default { .host = "LAMP_VPS_private_IP"; .port = "80"; }
Varnish 有一个名为 “grace mode” 的功能,当启用时,它指示 Varnish 在您的 Web 服务器后端关闭并不可用时提供请求页面的缓存副本。现在让我们启用它。找到以下 sub vcl_backend_response
块,并添加以下突出显示的行:
sub vcl_backend_response { set beresp.ttl = 10s; set beresp.grace = 1h; }
这将将缓存页面的宽限期设置为一小时,这意味着如果 Varnish 无法访问您的 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 浏览器进行测试,通过这次在端口 80(HTTP)上访问您的 Varnish 服务器的公共 IP 地址:
http://varnish_VPS_public_IP
您应该看到与从您的 LAMP_VPS 服务的相同内容。在我们的情况下,它只是一个普通的 Apache2 Ubuntu 页面:
!Apache2 Ubuntu 默认页面
此时,Varnish 正在缓存我们的应用服务器 - 希望您会看到响应时间减少的性能优势。如果您的域名指向您现有的应用服务器,您可以将其 DNS 条目更改为指向您的 Varnish_VPS_public_IP。
现在我们已经设置了基本的缓存,让我们使用 Nginx 添加 SSL 支持吧!
Nginx 的 SSL 支持(可选)
Varnish 不原生支持 SSL 终止,因此我们将安装 Nginx,其唯一目的是处理 HTTPS 流量。我们将介绍安装和配置 Nginx 以使用自签名 SSL 证书,并将 HTTPS 连接的流量通过反向代理从 HTTPS 连接传输到 Varnish 上的 HTTP。
如果您想要更详细的关于在 Nginx 上设置自签名 SSL 证书的解释,请参考此链接:Ubuntu 上的 Nginx SSL。如果您想尝试使用 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 证书的 common name 匹配
- proxy_pass http://127.0.0.1:80;:重定向流量到 Varnish(它在 127.0.0.1(即
localhost
)的端口 80 上运行)
其他的 proxy_set_header
行告诉 Nginx 转发信息,例如原始用户的 IP 地址,以及任何用户请求。
现在让我们启动 Nginx,以便我们的服务器可以处理 HTTPS 请求。
sudo service nginx start
现在使用 Web 浏览器进行测试,通过访问您的 Varnish 服务器的公共 IP 地址,这次是在端口 443(HTTPS):
https://varnish_VPS_public_IP
注意: 如果您使用了自签名证书,您将会看到一个警告,类似于“该站点的安全证书不受信任”。由于您知道刚刚创建了证书,因此可以安全地继续。
同样,您应该看到与之前相同的应用程序页面。不同之处在于您实际上正在访问处理 SSL 加密并将未加密请求转发到 Varnish 的 Nginx 服务器。
配置后端 Web 服务器
如果您的后端 Web 服务器正在绑定到其所有网络接口(即公共和私有网络接口),您将希望修改您的 Web 服务器配置,以便它只监听其私有接口。这是为了防止用户通过其公共 IP 地址直接访问您的后端 Web 服务器,从而绕过您的 Varnish 缓存。
在 Apache 或 Nginx 中,这将涉及将 listen
指令的值分配给绑定到后端服务器的私有 IP 地址。
Varnish 故障排除
如果您在使 Varnish 正常提供页面方面遇到问题,以下是一些命令,可以帮助您查看 Varnish 在幕后的操作。
统计信息
如果你想了解缓存的性能如何,你可以使用 varnishstat
命令来查看。像这样运行它:
varnishstat
你会看到如下所示的屏幕:
!Varnish Stats
有各种各样的统计信息显示出来,使用上/下箭头滚动将显示每个项目的简短描述。cache_hit
统计信息显示了有多少请求是使用缓存结果返回的–你希望这个数字尽可能接近客户端请求的总数 (client_req
)。
按 q
键退出。
日志
如果你想详细查看 Varnish 如何处理每个单独的请求,以流式日志的形式,你可以使用 varnishlog
命令。像这样运行它:
varnishlog
一旦它开始运行,尝试通过 web 浏览器访问你的 Varnish 服务器。对于你发送到 Varnish 的每个请求,你将看到一个详细的输出,可以用来帮助排除故障并调整你的 Varnish 配置。
按 CTRL + C
键退出。
结论
现在你的 Web 服务器前面有一个 Varnish 缓存服务器,大多数情况下你会看到性能有所提升。请记住,Varnish 非常强大且可调整,可能需要额外的调整才能充分从中获益。