Debian下开启Nginx FastCGI Cache缓存加速

文章目录

在上一篇文章Debian下安装Zend Opcache加速PHP中,我介绍了通过安装php插件对操作码缓存从而加速php访问的方法。对于常见的LNMP架构来说,php缓存也只是其中一个环节,我们同样可以对nginx以及mysql进行缓存。今天就来介绍下如何通过开启nginx fastcgi cache进行缓存加速。

Nginx FastCGI Cache介绍

实际上nginx有两种常见的缓存模式:代理模式proxy_cache和本地模式fastcgi_cache

proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。减少了nginx与
后端通信的次数,节省了传输时间和后端宽带。

fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。减少了nginx与
php的通信的次数,更减轻了php和数据库(mysql)的压力,这比用memcached之类的缓存要轻松得多。

proxy_cache和fastcgi_cache可以在一个应用中同时使用,如果都用得着的话。

对于一般的应用来说,单台服务器就足够了。因此,我们这里重点介绍下Nginx的FastCGI CACHE缓存模式。

实际上FastCGI Cache的原理就是将Nginx通过FastCGI转发的请求缓存到硬盘中,再次请求的时候就可以直接从内存中读取,提升网站的加载速度。如果不太明白FastCGI的作用,可以参考CGI、FastCGI、PHP-FPM介绍

Nginx FastCGI Cache配置方法

1、创建Cache目录

首先创建Cache目录:

1
mkdir /tmp/cache

2、修改nginx配置文件

新建虚拟主机配置文件,假设正常的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
        listen 80;
        #ipv6
        #listen [::]:80 default_server;
        root /var/www/tennfy.com;
        index index.php index.html index.htm;
        server_name tennfy.com www.tennfy.com;
        location / {
                    include wordpress.conf;
        }
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        }

在server的上方添加缓存目录:

1
2
3
4
5
6
# !缓存文件存放目录
# levels    缓存层次
# keys_zone 缓存空间名和共享内存大小(热点内容放在内存)
# inactive  失效时间, 1d = 1天
# max_size  最大缓存空间(硬盘占用)
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=fcgi:15m inactive=1d max_size=1g;

然后在fastcgi部分添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 调用 cache 的命名空间
fastcgi_cache fcgi;
# 生效值: 即代理目标的状态码以及缓存时间
fastcgi_cache_valid 200 302 301 1h;  
fastcgi_cache_valid any 1m;
# 请求过多少次相同的URL后, 缓存将开始
fastcgi_cache_min_uses 1;
# 确定缓存成为过期数据的情况
fastcgi_cache_use_stale error timeout invalid_header http_500;  
# 生成的缓存名称的 key 的名字
# $scheme https/http
# $request_method 请求方法,基于上面的设置,这里为GET
# $host 主机
# $request_uri 请求地址
fastcgi_cache_key $request_method://$host$request_uri;

配置好FastCGI Cache之后的完整配置文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=fcgi:15m inactive=1d max_size=1g;
server {
        listen 80;
        #ipv6
        #listen [::]:80 default_server;
        root /var/www/tennfy.com;
        index index.php index.html index.htm;
        server_name tennfy.com www.tennfy.com;
        location / {
                    include wordpress.conf;
        }
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_cache fcgi;
                fastcgi_cache_valid 200 302 301 1h;  
                fastcgi_cache_valid any 1m;
                fastcgi_cache_min_uses 1;
                fastcgi_cache_use_stale error timeout invalid_header http_500;  
                fastcgi_cache_key $request_method://$host$request_uri;
        }
        }

查看FastCGI Cache效果

为了验证FastCGI Cache是否生效,我们可以在web目录下新建一个php文件

1
vi /var/www/tennfy.com/time.php

并添加如下内容

1
2
3
<?php
echo time();
?>

利用curl或者浏览器多次访问这个php文件,我们可以得到的结果均为1444405269。

然后查看缓存目录

1
ls -lR /tmp/cache/

得到如下结果

fastcgi_cache

可以看出在缓存目录下已经有缓存出现。

缓存规则及清理方法

很多时候,我们不希望缓存某些页面请求,同时,对于已缓存的内容也希望能够手动更新。

1、设置缓存规则

对于不希望缓存的页面及请求,我们可以利用requesturirequestmethodhttp_cookie等变量加以定义。
下面是一些通用的缓存规则的示例,这些代码添加到server {}location / {}块的上方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#默认缓存所有内容
set $no_cache 0;
#不缓存POST请求
if ($request_method = POST)
{
    set $no_cache 1;
}
#如果包含$query_string,则不缓存
if ($query_string != "")
{
    set $no_cache 1;
}
#不缓存以下URL
if ($request_uri ~* "/(administrator/|login.php)")
{
    set $no_cache 1;
}
#如果有名为PHPSESSID的cookie,则不缓存
if ($http_cookie = "PHPSESSID")
{
    set $no_cache 1;
}

特别的,对于wordpress有如下缓存规则

1
2
3
4
5
6
7
8
9
10
11
# 不缓存后台、登录、注册、自动任务等
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") 
{
     set $no_cache 1;
}
 
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") 
{
     set $no_cache 1;
}

为了使如上规则生效,我们需要在location ~ \.php$ {}fastcgi_cache fcgi的上面添加如下语句

1
2
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

2、清空缓存方法

对于手动更新缓存,可以在server {}location ~ \.php$ {}的下方添加如下代码

1
2
3
4
5
6
#请空缓存规则,只允许本机清空,需要在VPS的 /etc/hosts 将example.com指向127.0.0.1
location ~ /purge(/.*) {    
	allow 127.0.0.1;
	deny all;
	fastcgi_cache_purge fcgi"$scheme$request_method$host$1";
}

对于希望清空的内容,在域名及目录之间加入/purge/,然后访问即可

1
curl example.com/purge/location

添加缓存规则以及缓存清空功能的配置文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=fcgi:15m inactive=1d max_size=1g;
server {
        listen 80;
        #ipv6
        #listen [::]:80 default_server;
        root /var/www/tennfy.com;
        index index.php index.html index.htm;
        server_name tennfy.com www.tennfy.com;
        #默认缓存所有内容
        set $no_cache 0;
        #不缓存POST请求
        if ($request_method = POST)
        {
                    set $no_cache 1;
        }
        #如果包含$query_string,则不缓存
        if ($query_string != "")
        {
                    set $no_cache 1;
        }
        location / {
                    include wordpress.conf;
        }
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_cache_bypass $no_cache;
                fastcgi_no_cache $no_cache;
                fastcgi_cache fcgi;
                fastcgi_cache_valid 200 302 301 1h;  
                fastcgi_cache_valid any 1m;
                fastcgi_cache_min_uses 1;
                fastcgi_cache_use_stale error timeout invalid_header http_500;  
                fastcgi_cache_key $request_method://$host$request_uri;
        }
        location ~ /purge(/.*) {    
	allow 127.0.0.1;
	deny all;
	fastcgi_cache_purge fcgi"$scheme$request_method$host$1";
        } 
        }

针对wordpress这样的应用,也提供了wordpress缓存清理插件:Nginx Helper,在wordpress后台搜索安装即可。该插件的具体使用方法,参考第二篇参考文章。

参考文章:
How to Setup FastCGI Caching with Nginx on your VPS
Nginx开启fastcgi_cache缓存加速,支持html伪静态页面
LNMP优化指南:3)网站优化加速-Nginx篇
Nginx: 配置FastCGI Cache缓存页面

本文出自 TENNFY博客,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/3708.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

0 + 1 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部