使用fastcgi_cache缓存PHP动态页面
我于2012年在某公司开始推进web服务器由apache向nginx的过渡,可以说在制造业电商领域是最早接触nginx的一批人了。这些年来一直在研究如何在节省硬件投入的情况下,提高网站性能表现,提升网站排名。从开发wordpress插件super static cache到后来开发独立的Domai CMS,提升网站性能一直是最重要的工作之一。
对于展示型网站来说,业务逻辑一般较为简单,但大量的网站访问可能会造成数据库查询压力剧增,降低网站的访问速度,一些较为古老的CMS的解决办法直接生产静态页面,这样做的缺点是缓存无法设置过期时间,只能通过手动方式或者编写一些额外的自动化程序去定时更新缓存,长时间不更新的网站页面链接也得不到更新,对优化来说也不够友好。
所以,正如我在其他文章中说的,更科学的缓存策略应该是能够设置到期时间,到期之后能够自动更新。
通过正确配置CDN,当然能够达到这个目的,但CDN缓存服务器众多,不同地区的访客访问时可能都需要回源,加上某些情况下,访问得不到缓存,也可能造成服务器压力增加,如果能够PHP和Web服务器之间增加一个缓存业务层,用户访问时能够根据配置输出或者生成缓存文件,并有能力管理缓存,则能很好的优化此问题。
Nginx的fastcgi_cache就是为解决此问题而生的,下面介绍如何配置开启fastcgi_cache。
fastcgi_cache_path /tmp/ngcache levels=1:2 keys_zone=cgicachezone:200m inactive=5h; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_valid 200 5h; fastcgi_cache_methods GET HEAD; add_header cgi-cache $upstream_cache_status
然后在对应网站server字段中和php通信的fastcgi配置更改成如下配置:
set $skip_cache 0; if ($request_uri ~* "(/*-admin/|/admin/)") { set $skip_cache 1; } location ~ \.php($|/) { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE open_basedir=$document_root:/tmp; fastcgi_pass 你的php-sock地址 fastcgi_index index.php; fastcgi_cache cgicachezone; fastcgi_no_cache $skip_cache; }
然后重启nginx,fastcgi_cache即可工作,可以通过查看http响应字段是否含有cgi-cache来查看fastcgi_cache工作状态。
结论:
fastcgi_cache是由nginx提供的在nginx和fastcgi服务之间的一层缓存层,它可以帮助显著降低数据库查询和程序运行压力。
通过使用fastcgi_cache,可以帮助提高PHP网站的访问速度,它可以完美替代PHP网站的静态网页生成功能。
注意:
fastcgi_cache配置选项较多,网上的教程也不少,这里不在赘述具体配置选项的功能。
以上配置实例仅供参考,实际上每个服务器环境,网站功能也各不相同,无法给出通用配置,具体配置,读者可自行研究,也可加我微信探讨。
评论列表