您的服务器是否需要处理大量流量?缓存是最大化Linode输出的最佳方法之一。但究竟什么是缓存呢?
缓存的想法是,您的服务器不应该每次访问时都重新生成相同的动态内容。通过在Web服务前放置Varnish等缓存代理来加速对HTTP请求的响应并减少服务器工作负载,从而节省您的Linode资源。
Varnish的工作原理是在请求进入后端之前处理请求,无论您的后端是Apache,nginx还是任何其他Web服务器。如果有一个未缓存的请求,Varnish会将该请求转发到您的后端,然后缓存其输出。然后,您可以将这些缓存的请求存储在内存中,这样会比从磁盘中检索并将它们传送给客户端更快。
此外,Varnish缓存可用作高可用性环境的一部分,可确保高流量负载或服务器故障期间的正常运行。
如果您的Web服务器是nginx并且您打算使用Varnish缓存来提供WordPress,请访问Linode的使用指南:在Debian 8上通过SSL和HTTP使用Varnish&nginx提供WordPress服务。
sudo apt update && sudo apt upgrade
注意本指南是为非root用户编写的。需要提升权限的命令带有前缀
sudo
。如果您不熟悉该sudo
命令,请参阅 用户和组指南。
1. 使用包管理器安装Varnish:
sudo apt install varnish
2. 要避免将来的更新覆盖您的配置,请为默认值创建一个副本:
cd /etc/varnish sudo cp default.vcl user.vcl
3. 在更改配置时停止Varnish服务:
sudo systemctl stop varnish
通过Varnish配置语言(VCL)配置Varnish。一旦系统加载配置文件,Varnish就会将VCL代码转换并编译成与Varnish进程一起运行的C程序。
Debian(8及更新版本)和Ubuntu(15.04及更新版本)的最新版本需要通过systemd进行Varnish配置。
1. 打开varnish.service
文件,在ExecStart
行设置端口,配置文件和内存分配。在以下示例中,这些值是:-a :80
,/etc/varnish/user.vcl
和malloc,1G
。
文件 | /lib/systemd/system/varnish.serviceundefined |
---|---|
1 |
|
2. 上面的配置分配了最多1GB的内存来存储其缓存项。如果您需要调整此分配大小,请编辑-s malloc,1G
中的数字。例如,要分配2GB的内存:
-s malloc,2G
3. 重新加载系统:
sudo systemctl daemon-reload
现在您已经将Varnish启动脚本指向了user.vcl
,您需要配置该文件以提供Varnish从Web服务器获取的内容。编辑/etc/varnish/user.vcl
的backend default {
部分,告诉Varnish在哪里获取服务器(后端)内容。以下示例使用端口 8080
,Web服务器设置如下:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 4 | backend default { .host = "127.0.0.1"; .port = "8080"; } |
默认情况下,Varnish会将请求缓存两分钟。要调整此时间,请打开VCL文件重写vcl_backend_response
子程序,并更新后端声明:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 | sub vcl_backend_response { set beresp.ttl = 5m; } |
从后端获取请求后将调用此子程序。在这个例子中,我们将对象上的TTL变量设置为五分钟(5m
)。其值可以是秒(120s
),分钟(2m
)或小时(2h
)。您理想的TTL可能会有所不同,具体取决于您网站内容的更新频率以及您需要处理的流量。
现在您已经配置了Varnish,本节通过交换Web服务器提供的和Varnish侦听的端口使其成为您的Web服务器。如下图所示,所有网络流量将由Varnish缓存提供,并每两分钟或按上面配置的间隔刷新一次:
要允许Varnish与您的Web服务器通信,您需要修改站点的虚拟主机文件中的一些设置。
1. 如果您使用的是nginx,请跳过此步骤。如果您正在使用Apache,请更改Apache侦听的端口。编辑/etc/apache2/ports.conf
和任何虚拟主机。打开ports.conf
,修改Listen 80
中的80
到另一个端口。此例中使用8080
端口:
Listen 8080
2. 修改虚拟主机文件或服务器信息以侦听端口8080:Apache:
文件 | /etc/apache2/sites-available/example.com.conf |
---|---|
1 |
|
Nginx:
文件 | /etc/nginx/sites-available/example.com |
---|---|
1 2 | listen 8080; listen :::8080; |
3. 检查您的/etc/varnish/user.vcl
文件并确保将backend default
设置为使用端口8080:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
4. 重新加载Web服务器的配置:
sudo systemctl reload apache2
sudo systemctl restart nginx
5. 启动Varnish:
sudo systemctl start varnish
一旦启动,Varnish将为站点访问者提供服务,并且根据您的配置,尽可能从缓存中获取内容。
VCL允许扩展控制请求缓存的方式,您需要进行一些修改。本节将介绍几种常见的VCL配置。
这些修改在您的user.vcl
文件中进行。
您可能希望从Varnish缓存中排除网站的特定部分,尤其是非公开或管理部分。要做到这一点,你需要访问Varnish的请求对象获取请求的信息,并有条件地告诉Varnish向后端传递请求而不缓存它。
您需要覆盖VCL文件中的vcl_recv子程序,该子程序在每次Varnish收到请求时运行,添加如下条件:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 4 5 6 7 8 | sub vcl_recv { if (req.http.host == "example.com" && req.url ~ "^/admin") { return (pass); } } |
此示例检查您不想缓存的两个条件。第一个是任何对于example.com
的请求,第二个是以/admin
开头的任何URI请求。如果这两个条件都是真的,Varnish将不会缓存请求。
如前所述,如果Varnish检测到您的网站正在设置Cookie,则会假定您的网站需要与这些Cookie进行交互并相应地显示动态内容,因此,Varnish不会缓存这些网页。您可以通过在Varnish的 req.http
对象上取消Cookie
设置来覆盖此行为。
在vcl_recv
部分的底部添加行:
文件 | /etc/varnish/user.vcl |
---|---|
1 | unset req.http.Cookie; |
您可能会发现特定cookie对于显示内容或者确定您的用户是否已登录很重要。在这种情况下,您可能不希望显示缓存内容,而只是想将用户直接发送到后端。
对于这种情况,您将检查req.http.Cookie
中名为“logged_in”的cookie,如果找到,则该请求将被传递到后端而不进行缓存。到目前为止,这是我们完整的vcl_recv
子程序:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 4 5 6 7 8 9 10 11 | sub vcl_recv { if ((req.http.host ~ "example.com" && req.url ~ "^/admin") || req.http.Cookie == "logged_in") { return (pass); } unset req.http.Cookie; } |
您可能不希望缓存POST(https://en.wikipedia.org/wiki/POST_(HTTP%29)请求,因为它们可能需要与后端交互以收集动态数据或设置用户会话。在上面的示例中,您选择如果用户已登录,则不缓存请求。本节确保用户可以在开始登录时即不缓存。一种简单的方法是一起跳过POST请求。
要完成此操作,请将以下条件添加到vcl_recv
中现有的return (pass)
块中:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 4 5 6 7 | if ((req.http.host == "example.com" && req.url ~ "^/admin") || req.http.Cookie == "logged_in" || req.method == "POST") { return (pass); } |
Varnish可以使用称为后端轮询的内置工具来检查后端服务器,并在后端无法访问时继续提供缓存内容。如果Varnish检测到停机,它将在您在user.vcl
中配置的宽限时间内继续为您提供缓存内容。
要设置轮询,请在/etc/varnish/user.vcl
中将probe节添加到后端声明中:
文件 | /etc/varnish/user.vcl |
---|---|
1 2 3 4 5 6 7 8 9 10 11 | backend default { .host = '127.0.0.1'; .port = '8080'; .probe = { .url = "/"; .timeout = 40ms; .interval = 1s; .window = 10; .threshold = 8; } } |
这些只是基本设置,您可以根据您的网站调整它们。此示例指示Varnish 每秒轮询或测试与http://127.0.0.1:8080/
的连接,如果在最近10次轮询中至少8次响应时间不到40ms,则认为后端是健康的。
如果后端未通过测试,则认为它是不健康的,并且根据其宽限时间设置从缓存中获取对象。要设置宽限时间,请在vcl_backend_response
以下行中包含以下内容:
文件 | /etc/varnish/user.vcl |
---|---|
1 | set beresp.grace = 1h; |
“1h”允许后端停机一小时而不会对网站用户造成任何影响。如果您正在提供静态内容,则宽限时间可以更长,以确保正常运行。
为了增加可用性,请考虑从单独的Linode提供Varnish缓存。在这种情况下,Varnish安装步骤应在与Web服务器相同的数据中心中独立的Linode上执行。安装后,将Varnish后端.host
值配置为指向Web服务器Linode的专用IP地址。请注意,您的站点的DNS记录应指向Varnish Linode,因为这是客户端连接的位置。
是的!如果一切顺利,您网站的访问者现在可以从内存中获取Varnish缓存的内容,从而显着提高您网站的速度。
现在所有流量都配置为到达Varnish缓存,启动varnishlog
查看Varnish活动。请注意,这是一个实时的持续日志,除非发生活动,否则不会显示任何信息。启动Varnishlog后,使用浏览器查看应缓存的页面并查看活动日志:
sudo varnishlog
完成后用CTRL + C停止varnishlog
。
使用防火墙时,Varnish需要稍微修改您在设置Web服务器时可能使用的规则。
如果Varnish运行在与Web服务器相同的Linode上,请确保允许端口80上的传入连接。此外,您还需要允许端口8080上来自localhost的连接,因为这是Varnish与Web服务器通信的方式。
如果Varnish和您的Web服务器在独立的Linode上运行,您将需要接受Varnish Linode上端口80以及Web服务器上端口8080的传入流量,。
这两个只是最小的规则修改。强烈建议您根据运行的其他服务对每个服务使用单独的防火墙规则。如果您不确定如何设置防火墙,请查看我们的iptables和UFW指南。
有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。