使用nginx的简单Web框架FastCGI缓存 - 第二部分

在本系列的第一部分中,我们介绍了如何在nginx中缓存FastCGI响应以及如何按需清除缓存。我们看到了使用主要的Perl Web框架(Catalyst、Dancer和Mojolicious)设置缓存是多么容易。在本文中,我们将使用Nginx::FastCGI::Cache来管理我们的缓存响应,并在这个过程中获得一些有用的好处。

需求

您需要Perl v5.12.3或更高版本来安装Nginx::FastCGI::Cache。CPAN测试者的结果显示,它运行在包括Windows在内的大多数平台上。要使用CPAN安装模块,只需打开终端并输入

$ cpan Nginx::FastCGI::Cache

nginx fastcgi缓存解释

在nginx虚拟主机文件中,"fastcgi_cache_path"指令设置nginx将从其中构建缓存的根目录。nginx使用"fastcgi_cache_key"指令的变量来创建一个md5十六进制哈希键作为文件名。"levels"值确定子目录的数量和子目录名称长度。例如,使用此配置

fastcgi_cache_path  /var/cache/nginx levels=1:2
                    keys_zone=app_cache:50m
                    inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

对"http://perltricks.com/"的GET请求将有一个键"HTTPGETperltricks.com/",并将其存储在"http://var/cache/nginx/4/85/200d51ef65b0a76de421f8f1ec047854"。请注意,第一个子目录的名称是md5哈希的最后一位字母("4"),第二个子目录的名称是前两个字母("85") - 这是因为nginx虚拟主机文件中设置了"1:2"的"levels"值。删除文件"http://var/cache/nginx/4/85/200d51ef65b0a76de421f8f1ec047854"将使其从nginx缓存中清除。

介绍Nginx::FastCGI::Cache

我编写了Nginx::FastCGI::Cache,以便轻松地从nginx缓存中删除单个缓存的fastcgi响应。例如

use Nginx::FastCGI::Cache;
 
my $nginx_cache = Nginx::FastCGI::Cache->new({ location => '/var/cache/nginx' });
$nginx_cache->purge_file("http://perltricks.com/");

这将把URL转换为md5哈希缓存键,并从nginx缓存目录中删除它。默认情况下,“purge_file”假定HTTP请求类型是GET。如果您想清除不同请求类型的文件,只需将其作为参数包含即可

$nginx_cache->purge_file("http://perltricks.com/", "HEAD");

如果您想清除整个缓存,请使用“purge_cache”方法

$nginx_cache->purge_cache;

这两个方法应该足以方便地从您最喜欢的Perl Web应用程序中管理nginx缓存。

可移植性

在第一部分中,我们的清除缓存代码使用对GNU find程序的系统调用来删除缓存中的所有文件。虽然这作为一个快速修补方法是不错的,但使用外部程序限制了代码的可移植性(例如,它不会在Windows上运行)。Nginx::FastCGI::Cache使用Perl的opendir和unlink函数来读取缓存目录并删除文件,这应该在Perl运行的所有平台上工作。

安全第一

当您有一个将递归删除目录中所有文件的程序时,您希望确保它在查看正确的目录。这就是为什么"Nginx::FastCGI::Cache"构造函数需要一个强制性的"location"参数 - 不假定默认位置。另外,如果Perl进程没有足够的权限来读取缓存目录或删除缓存文件,Nginx::FastCGI::Cache将croak

其他nginx考虑事项

默认情况下,nginx不会缓存包含"Set-Cookie"头的fastcgi响应。根据您如何使用cookie,您可能希望nginx缓存响应并忽略"Set-Cookie"头。这可以通过在虚拟主机文件中添加此行来完成

fastcgi_ignore_headers "Set-Cookie";

请记住,"set-Cookie"头将从响应中完全删除,因此这对于服务不区分带有会话cookie的用户和无cookie的用户的不区分用户的统一响应是有用的。

默认情况下,nginx只会缓存GET和HEAD请求。这是一个很好的默认设置,但你可能只想将缓存限制为仅对GET响应进行缓存,或者启用其他类型的HTTP请求,例如POST。如果是这样,请将fastcgi_cache_methods指令添加到你的nginx虚拟主机文件中。例如,仅缓存GET请求:

fastcgi_cache_methods GET;

nginx的官方文档提供了关于fastcgi模块的全面详细说明。

结论

无论您是使用Catalyst、Dancer还是Mojolicious,设置适当的缓存头都很简单(请参阅第一部分)。考虑使用Nginx::FastCGI::Cache与nginx方便地按需清除缓存。

喜欢这篇文章吗?帮助我们并转发它!


这篇文章最初发布在PerlTricks.com

标签

David Farrell

David是一位职业程序员,他经常推文博客关于代码和编程的艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请在GitHub上打开一个问题或pull request来帮助我们。