如何配置Nginx的FastCGI缓存目录?

  

下面是如何配置Nginx的FastCGI缓存目录的完整攻略:

  1. 创建缓存目录

需要先在服务器上创建一个用于缓存的目录,比如 /var/cache/nginx/fastcgi。你可以使用如下命令:

sudo mkdir -p /var/cache/nginx/fastcgi
sudo chown -R www-data:www-data /var/cache/nginx/fastcgi

其中 www-data:www-data 是 Nginx 运行用户和用户组,如果你在配置 Nginx 时使用的是其它用户,则需要相应地修改这个值。

  1. 配置 Nginx

找到你的 Nginx 配置文件,在 http 或者 server 块下添加如下配置:

fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgicache:100m inactive=60m;

其中:

  • /var/cache/nginx/fastcgi 是 FastCGI 缓存目录的路径;
  • levels=1:2 表示缓存目录下的子目录个数,这里表示使用一级子目录和二级子目录;
  • keys_zone=fastcgicache:100m 定义了缓存 key 的存储区域及其大小,这里将 key 存储区域命名为 fastcgicache,大小为 100MB;
  • inactive=60m 指定了缓存内容的过期时间,这里设置为 60 分钟。

  • 配置 FastCGI 缓存

继续在 Nginx 配置文件中添加如下配置:

location ~ \.php$ {
    # ... 其它 PHP 相关配置
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $no_cache;
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_valid 404 10m;
    fastcgi_cache_min_uses 3;
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}

其中:

  • fastcgi_cache_key "$scheme$request_method$host$request_uri" 定义了缓存的 key,这里使用了请求的协议、请求方法、主机名和请求 URI 进行组合;
  • fastcgi_cache_bypass $skip_cache 定义了当 $skip_cache 变量为 1 时,不使用缓存;
  • fastcgi_no_cache $no_cache 定义了当 $no_cache 变量为 1 时,不使用缓存,且会将带有缓存的响应头直接返回;
  • fastcgi_cache_valid 200 60m 定义了当返回码为 200 时,缓存有效期为 60 分钟;
  • fastcgi_cache_valid 404 10m 定义了当返回码为 404 时,缓存有效期为 10 分钟;
  • fastcgi_cache_min_uses 3 定义了至少有 3 个请求才会将内容缓存;
  • fastcgi_cache_use_stale error timeout invalid_header http_500 定义了当后端 FastCGI 出现错误、超时、返回无效的头或者返回 500 时,使用缓存响应。

  • 测试缓存效果

完成上面的配置后,就可以测试缓存的效果了。可以使用以下命令来测试:

curl -I http://example.com/index.php

第一次访问会返回一个普通的 HTTP 响应头,第二次访问会返回带有 X-Cache-Status 响应头的 HTTP 响应。当响应头中包含 X-Cache-Status: HIT 时,表示请求使用了缓存。当响应头中包含 X-Cache-Status: MISS 时,表示请求没有使用缓存。

示例配置:

将 FastCGI 缓存存储在 /data/cache/nginx/fastcgi 目录下,缓存 key 使用请求 URI,仅缓存响应码为 200 的请求,并且缓存时间为 30 分钟。

http {
    # ...
    fastcgi_cache_path /data/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgicache:100m inactive=30m;

    server {
        listen 80;
        server_name example.com;
        root /var/www/html;

        location ~ \.php$ {
            fastcgi_pass unix:/run/php/php7.1-fpm.sock;

            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $no_cache;
            fastcgi_cache_key "$request_uri";
            fastcgi_cache_valid 200 30m;
            fastcgi_cache_min_uses 3;

            include fastcgi_params;
        }
    }
}

将 FastCGI 缓存存储在 /var/cache/nginx/fastcgi 目录下,缓存 key 使用请求 URI,缓存时间分别为 10 分钟和 1 分钟,同时缓存 404 响应。

http {
    # ...
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgicache:100m inactive=10m;

    server {
        listen 80;
        server_name example.com;
        root /var/www/html;

        location ~ \.php$ {
            fastcgi_pass unix:/run/php/php7.1-fpm.sock;

            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $no_cache;
            fastcgi_cache_key "$request_uri";

            fastcgi_cache_valid 200 10m;
            fastcgi_cache_valid 404 1m;

            include fastcgi_params;
        }
    }
}
相关文章