使用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。
标签
反馈
这篇文章有什么问题吗?请在GitHub上打开一个问题或pull request来帮助我们。
- More commenting... maybe?
github.polettix.it - Perl Weekly Challenge 121: Invert Bit
blogs.perl.org - Web nostalgia: MojoX::Mechanize
github.polettix.it - On the eve of CPAN Testers
blogs.perl.org - PWC121 - The Travelling Salesman
github.polettix.it - PWC121 - Invert Bit
github.polettix.it - Floyd-Warshall algorithm implementations
github.polettix.it - Perl Weekly Challenge 120: Swap Odd/Even Bits and Clock Angle
blogs.perl.org - How I Uploaded a CPAN Module
blogs.perl.org - App::Easer released on CPAN
github.polettix.it