简单Web框架FastCGI缓存与nginx - 第一部分

FastCGI服务器缓存是一种提高响应时间并减少Web应用程序负载的神奇技术。在本系列的 第一部分中,我们将探讨如何使用Catalyst、Dancer和Mojolocious来缓存响应,以及如何在使用nginx Web服务器时按需清除缓存。很快,您的Web应用程序将比赛马还要快!

FastCGI服务器缓存解释

FastCGI服务器缓存是指FastCGI应用程序在其对上游服务器的响应中设置一个缓存头。该max-age头定义了从请求时间起缓存响应消息的时间(以秒为单位)。如果配置正确,上游服务器将缓存响应,并在max-age值期间,对所有相同URL的请求返回缓存的响应。作为额外的奖励,max-age头可以传递给请求者,并将其在他们的浏览器中缓存。

FastCGI服务器缓存带来的好处

  • 将响应时间减少高达95%。
  • 减少FastCGI应用程序的负载(想象一下每个URL每小时只有一个请求)。
  • 通过浏览器缓存减少Web服务器的负载。
  • 避免在FastCGI应用程序中缓存响应时的并发读写带来的内存损坏风险。

如何缓存Catalyst / Mojolicious / Dancer响应

所有主要的Perl框架都支持服务器缓存,好消息是它很容易实现。例如,如果$seconds是缓存响应的秒数,在Catalyst中,您可以将此行添加到控制器方法中。

$c->response->header('Cache-Control' => "max-age=$seconds");

在Mojolicious中,将此代码添加到您的控制器操作中

$self->res->headers->cache_control('max-age=$seconds');

对于Dancer,使用以下代码更新路由

header 'max-age' => '$seconds';

如何设置nginx FastCGI缓存

要启用nginx缓存,请将fastcgi_cache指令添加到虚拟主机配置文件中。例如

fastcgi_cache_path  /var/nginx/cache levels=1:2
                    keys_zone=fcgi_cache:50m
                    inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_buffers 256 4k;

此代码指定了缓存目录、区域名称、缓存键和缓冲区(有关详细信息,请参阅手册)。代码应位于服务器声明之外。在服务器声明内部,添加

fastcgi_cache fcgi_cache;
fastcgi_cache_valid 200 1s;

此代码定义了要使用的缓存区域(“fcgi_cache”),将缓存大小设置为200mb,默认情况下缓存响应1秒。max-age头将覆盖默认缓存时间,但您可能需要根据应用程序的需求选择除1秒之外的其他值。以下是一个包含fastcgi缓存的完整示例虚拟主机文件

fastcgi_cache_path  /var/nginx/cache levels=1:2
                    keys_zone=PerlTricks:50m
                    inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_buffers 256 4k;

server {
    listen 80 default;
    server_name perltricks.com;
    try_files $uri @fcgi;
    location @fcgi {
        fastcgi_cache PerlTricks;
        fastcgi_cache_valid 200 5m;
        fastcgi_pass unix:/tmp/perltricks.socket;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param SCRIPT_NAME /;
    }
}

有关配置nginx fastcgi缓存的深入了解,请参阅这篇文章:有用的文章

清除缓存

虽然缓存响应可以带来巨大的好处,但能够按需清除缓存,以防应用程序状态发生变化,将更加方便。幸运的是,在nginx中,使用Perl这非常简单 - 您只需删除虚拟主机配置文件中声明的fastcgi_cache_path下的所有文件即可。例如,在基于Unix的系统上,操作如下

sub clear_cache {
    if (-e '/var/nginx/cache') {
        system('find /var/nginx/cache -type f -exec rm -f {} \;');
    }
}

结论

所有主要的Perl Web框架都支持FastCGI服务器缓存。然而,还有更多可以做的事情:在本系列的第二部分中,我们将通过添加清除特定URL响应的能力来使我们的缓存管理更加精确,而不是一次性清除整个缓存。我们还将探讨如何使“clear_cache”子程序更安全且与Windows兼容。

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

封面图片© David Hoshor,通过Creative Commons授权。图片已进行数字增强。


本文最初发布于PerlTricks.com

标签

David Farrell

David是一位职业程序员,他经常在Twitter博客上分享关于代码和编程艺术的见解。

浏览他们的文章

反馈

本文有误?请在GitHub上打开一个问题或提交一个pull request来帮助我们。