帮助中心

立即注册 咨询客服

当前位置:首页 > 帮助中心> 如何在NGINX服务器中缓存内容

如何在NGINX服务器中缓存内容

发布时间:2020年06月19日 09:38:13    来源: A5互联

您可以通过配置NGINX来缓存本地上游服务器的响应,并为内容交付网络(CDN)创建边缘服务器,从而加速本地原始服务器。NGINX支持一些最大的CDN。

当配置为缓存时,NGINX将:

①缓存静态和动态内容。

②通过微缓存改善动态内容的性能。

③服务内容过时,同时在后台重新验证以提高性能。

④覆盖或设置Cache-Control标头等。

在本文中,您将学习如何在Linux 中将NGINX配置为内容缓存,以使您的Web服务器尽可能高效地运行。

先决条件:

您应该在Linux服务器上安装NGINX。如果安装Nginx,请先执行以下操作:如何在CentOS 8系统服务器上安装Nginx?

一、在Nginx上缓存静态内容

静态内容是网站的内容,它们在页面之间保持不变。静态内容的示例包括诸如图像,视频,文档之类的文件;以及 CSS文件和JavaScript文件。

如果您的网站使用了大量静态内容,那么您可以通过启用客户端缓存来优化其性能,在客户端缓存中浏览器可以存储静态内容的副本以加快访问速度。

下列示例配置是不错的选择,只需替换www.example.com为您的网站名称的URL,然后适当地修改其他路径名。

点此复制复制以上代码

二、在Nginx上缓存动态内容

NGINX使用位于本地文件系统中某个位置的基于磁盘的持久性缓存。因此,首先创建用于存储缓存内容的本地磁盘目录。

#mkdir -p / var / cache / nginx

接下来,在缓存目录上设置适当的所有权。它应该由NGINX用户(nginx)和组(nginx)拥有,如下所示。

#chown nginx:nginx / var / cache / nginx

现在,在下一节中进一步了解如何在Nginx上启用动态内容。

三、在NGINX中启用FastCGI缓存

FastCGI(或FCGI)是一种广泛使用的协议,用于将交互式应用程序(如PHP)与Web服务器(如NGINX)接口。它是CGI(通用网关接口)的扩展。

FCGI的主要优点在于,它可以在一个流程中管理多个CGI请求。没有它,Web服务器必须为每个客户对服务的请求打开一个新进程(必须对其进行控制,处理一个请求并关闭)。

为了在LEMP堆栈部署中处理PHP脚本,NGINX使用FPM(FastCGI流程管理器)或PHP-FPM(一种流行的替代PHP FastCGI实现)。一旦PHP-FPM进程正在运行,NGINX配置为代理请求给它进行处理。因此,NGINX也可以配置为缓存来自PHP-FPM后端应用程序服务器的响应。

在NGINX下,FastCGI内容缓存是在NGINX配置结构中使用fastcgi_cache_path在顶级http{}上下文中调用的指令声明的。您还可以添加,fastcgi_cache_key它定义了用于缓存的键(请求标识符)。

此外,要读取上游缓存状态,请在上下文中添加add_header X-Cache-Status指令http{}–这对于调试目的很有用。

假设您站点的服务器块配置文件位于/etc/nginx/conf.d/testapp.conf或/etc/nginx/sites-available/testapp.conf(在Ubuntu及其衍生版本中),请打开编辑文件并添加文件顶部的以下几行。

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;

fastcgi_cache_key "$scheme$request_method$host$request_uri";

add_header X-Cache $upstream_cache_status;

在NGINX中启用FastCGI缓存

该fastcgi_cache_path指令规定了它们的参数个数:

/ var / cache / nginx – 缓存的本地磁盘目录的路径。

levels –定义缓存的层次结构级别,它在/ var / cache / nginx下设置了两级目录层次结构。

keys_zone(name:size) – 启用共享存储区的创建,在这个区中存储所有的活动键和数据信息(meta)。请注意,将密钥存储在内存中可以使NGINX更加轻松地确定其是MISS还是HIT,从而加快了检查过程,而无需检查磁盘上的状态。

inactive – 指定在指定的时间内未访问的高速缓存数据从高速缓存中删除之前经过的时间量,而不考虑其新鲜度。在我们的示例配置中,值为60m意味着60后未访问的文件将从高速缓存中删除。

max_size – 指定缓存的最大大小。这里还有更多的参数可以使用,有关更多信息,请阅读NGINX文档。

fastcgi_cache_key指令中的变量如下所述。

NGINX使用它们来计算请求的密钥(标识符)。重要的是,要向客户端发送缓存的响应,该请求必须具有与缓存的响应相同的密钥。

$ scheme – 请求方案,HTTP或HTTPS。

$ request_method – 请求方法,通常是“ GET ”或“ POST ”。

$ host – 可以是请求行中的主机名,也可以是“ Host ”请求标头字段中的主机名,或者是与请求匹配的服务器名(按优先级顺序)。

$ request_uri – 表示完整的原始请求URI(带有参数)。

同样,为NGINX响应的每个请求计算add_header X-Cache-Status指令中的$upstream_cache_status变量,无论是MISS(在缓存中找不到响应,从应用程序服务器获取)还是HIT(从缓存中响应的响应),或其他任何受支持的值。

接下来,在location将PHP请求传递给PHP-FPM的fastcgi_cache指令中,使用指令来激活您刚刚在上面定义的缓存。

还使用fastcgi_cache_valid所示指令为不同的响应设置缓存时间。

fastcgi_cache CACHEZONE;

fastcgi_cache_valid 60m;

定义缓存区域和时间

如果只缓存时间规定为在我们的例子中,只有200,301和302的响应被缓存。但是,您也可以显式指定响应或使用任何响应(对于任何响应代码):

fastcgi_cache CACHEZONE;

fastcgi_cache_valid 200 301 203 60m;

fastcgi_cache_valid 404 10m;

或者

fastcgi_cache CACHEZONE;

fastcgi_cache_valid any 10m;

四、在Nginx上微调FastCGI缓存性能

要设置在缓存响应之前必须进行具有相同键的请求的最小次数,请fastcgi_cache_min_uses在http{}或server{}或location{}上下文中包含指令。

fastcgi_cache_min_uses 3

设置最小缓存使用率

要使用带有“ If-Modified-Since ”和“ If-None-Match ”头字段的条件请求来启用过期缓存项的重新验证,请fastcgi_cache_revalidate在http{}或server{}或location{}上下文中添加指令。

fastcgi_cache_revalidate on;

设置缓存重新验证

您还可以使用location指令中的指令,指示当源服务器或FCGI服务器关闭时NGINX传递缓存的内容proxy_cache_use_stale。

这个示例配置意味着,当NGINX收到来自上游服务器的错误、超时和任何指定的错误,并且缓存的内容中有请求文件的过期版本时,它会交付过期文件。

proxy_cache_use_stale error timeout http_500;

启用旧数据服务

另一个微调FCGI缓存性能的有用指令是fastcgi_cache_background_update与该proxy_cache_use_stale指令结合使用。设置为on时,它会指示NGINX在客户端请求文件已过期或正在从上游服务器进行更新的过程中提供过时的内容。

fastcgi_cache_background_update on;

启用缓存后台更新

这fastcgi_cache_lock对于缓存性能的微调也很有用,因为如果多个客户端请求的内容不在缓存中,则NGINX将仅将第一个请求转发到上游服务器,缓存响应,然后为来自其他服务器的其他请求服务缓存。

fastcgi_cache_lock on;

启用缓存锁定

在NGINX配置文件中进行以上所有更改后,保存并关闭它。然后,在重新启动NGINX服务之前,检查配置结构是否存在语法错误。

# nginx -t

# systemctl restart nginx

检查并启动Nginx服务

接下来,测试缓存是否正常运行,尝试使用以下curl命令访问您的Web应用程序或站点(第一次应指示MISS,但随后的请求应指示HIT,如屏幕快照所示)。

# curl -I http://你的域名

测试FastCGI缓存

这是另一个截图,显示了NGINX提供的过时数据。

测试Nginx服务过期数据

五、向旁路缓存添加异常

可以使用指令设置条件,使NGINX不应该将缓存的响应发送给客户端fastcgi_cache_bypass。要指示NGINX根本不缓存来自上游服务器的响应,请使用fastcgi_no_cache。

例如,如果您希望POST请求和带有查询字符串的URL始终转到PHP。首先,声明一个if语句以设置条件,如下所示。

set $skip_cache 0;

if ($request_method = POST) {

set $skip_cache 1;

}

然后使用fastcgi_cache_bypass和fastcgi_no_cache指令在传递PHP请求给PHP-FPM的location指令中激活上述异常。

fastcgi_cache_bypass $skip_cache;

fastcgi_no_cache $skip_cache;

您网站上的许多其他部分可能不想启用内容缓存。以下是nginx博客上提供的用于改善WordPress网站性能的示例NGINX配置。

要使用它,请进行更改(例如域名,路径,文件名等)以反映环境中存在的内容。

点此复制复制以上代码

六、在NGINX中启用代理缓存

NGINX还支持缓存来自其他代理服务器的响应(由proxy_pass指令定义)。对于此测试用例,我们将NGINX用作Node.js Web应用程序的反向代理,因此我们将启用NGINX作为Node.js应用程序的缓存。这里使用的所有配置指令与上一节中的FastCGI指令具有相似的含义,因此我们不再赘述。

要启用对来自代理服务器的响应的缓存,请proxy_cache_path在顶级http{}上下文中包含该指令。要指定如何缓存请求,您还可以proxy_cache_key如下添加指令。

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;

proxy_cache_key "$scheme$request_method$host$request_uri";

add_header X-Cache-Status $upstream_cache_status;

proxy_cache_min_uses 3;

接下来,在location指令中激活缓存。

location / {

proxy_pass http://127.0.0.1:3000;

proxy_cache PROXYCACHE;

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

}

要定义NGINX不发送缓存的内容并且根本不缓存来自上游服务器的响应的条件,请包括proxy_cache_bypass和proxy_no_cache。

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

proxy_no_cache $http_pragma $http_authorization;

七、微调代理缓存性能

以下指令对于微调代理缓存的性能很有用。它们也具有与FastCGI指令相同的含义。

proxy_cache_min_uses 3;

proxy_cache_revalidate on;

proxy_cache_use_stale error timeout updating http_500;

proxy_cache_background_update on;

proxy_cache_lock on;

有关更多信息和缓存配置指令,请参阅两个主要模块ngx_http_fastcgi_module和ngx_http_proxy_module的文档。