Nginx使用教程(六):使用Nginx缓存之FastCGI缓存
启用FastCGI缓存
<br\>
编辑必须启用缓存的虚拟主机配置文件。
- nano /etc/nginx/sites-enabled/vhost
将以下行添加到server{}指令之外的文件顶部:
- fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
- fastcgi_cache_key "$scheme$request_method$host$request_uri";
“fastcgi_cache_path”指令指定缓存(/etc/nginx/cache)的位置,其大小(100m),内存区域名称(MYAPP),子目录级别和非活动定时器。
位置可以在硬盘上的任何地方; 但是,大小必须小于您的服务器的RAM +交换,否则你会收到一个错误,“无法分配内存”。 如果缓存在“inactive”选项指定的特定时间内没有被访问(这里为60分钟),Nginx将删除它。
“fastcgi_cache_key”指令指定如何哈希缓存文件名。 Nginx基于此指令使用MD5加密访问的文件。
在location ~ .php$ { }里添加如下行:
- fastcgi_cache MYAPP;
- fastcgi_cache_valid 200 60m;
“fastcgi_cache”指令引用我们在“fastcgicache_path”指令中指定的内存区域名称,并将缓存存储在此区域中。
默认情况下,Nginx根据这些响应头里指定的时间决定存储缓存对象的时间:X-Accel-Expires / Expires / Cache-Control。
如果缺少这些头,“fastcgi_cache_valid”指令用于指定默认缓存生命周期。 在上面输入的语句中,只缓存状态代码为200的响应。 也可以指定其他响应代码。
测试配置:
- service nginx configtest
重载Nginx:
- service nginx reload
完整的vhost配置文件如下:
- fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
- fastcgi_cache_key "$scheme$request_method$host$request_uri";
- server {
- listen 80;
- root /usr/share/nginx/html;
- index index.php index.html index.htm;
- server_name example.com;
- location / {
- try_files $uri $uri/ /index.html;
- }
- location ~ \.php$ {
- try_files $uri =404;
- fastcgi_pass unix:/var/run/php5-fpm.sock;
- fastcgi_index index.php;
- include fastcgi_params;
- fastcgi_cache MYAPP;
- fastcgi_cache_valid 200 60m;
- }
- }
测试FastCGI缓存是否生效
<br\>
创建/usr/share/nginx/html/time.php,内容如下:
- <?php
- echo time();
- ?>
使用curl或您的Web浏览器多次请求此文件。
- root@droplet:~# curl http://localhost/time.php;echo
- 1382986152
- root@droplet:~# curl http://localhost/time.php;echo
- 1382986152
- root@droplet:~# curl http://localhost/time.php;echo
- 1382986152
如果缓存工作正常,您应该在缓存响应时在所有请求上看到相同的时间戳。
执行缓存位置的递归列表以查找此请求的缓存。
root@droplet:~# ls -lR /etc/nginx/cache/
/etc/nginx/cache/:
total 0
drwx—— 3 www-data www-data 60 Oct 28 18:53 e
/etc/nginx/cache/e:
total 0
drwx—— 2 www-data www-data 60 Oct 28 18:53 18
/etc/nginx/cache/e/18:
total 4
-rw——- 1 www-data www-data 117 Oct 28 18:53 b777c8adab3ec92cd43756226caf618e
我们还可以使Nginx为响应添加一个“X-Cache”头,指示缓存是否被丢失或命中。
在server{}指令上面添加以下内容:
- add_header X-Cache $upstream_cache_status;
重新加载Nginx服务,并使用curl执行详细请求以查看新标题。
root@droplet:~# curl -v http://localhost/time.php
* About to connect() to localhost port 80 (#0)
* Trying 127.0.0.1…
* connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /time.php HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK < Server: nginx < Date: Tue, 29 Oct 2013 11:24:04 GMT < Content-Type: text/html < Transfer-Encoding: chunked < Connection: keep-alive < X-Cache: HIT < * Connection #0 to host localhost left intact 1383045828* Closing connection #0
不需要缓存的页面
<br\>
某些动态内容(例如认证所需页面)不应缓存。 可以基于诸如“requesturi”,“requestmethod”和“http_cookie”的服务器变量来排除这样的内容被高速缓存。
如下例子:
- #Cache everything by default
- set $no_cache 0;
- #Don't cache POST requests
- if ($request_method = POST)
- {
- set $no_cache 1;
- }
- #Don't cache if the URL contains a query string
- if ($query_string != "")
- {
- set $no_cache 1;
- }
- #Don't cache the following URLs
- if ($request_uri ~* "/(administrator/|login.php)")
- {
- set $no_cache 1;
- }
- #Don't cache if there is a cookie called PHPSESSID
- if ($http_cookie = "PHPSESSID")
- {
- set $no_cache 1;
- }
要将“$no_cache”变量应用到相应的指令,请将以下行放在location〜.php $ {}中,
- fastcgi_cache_bypass $no_cache;
- fastcgi_no_cache $no_cache;
“fasctcgicachebypass”指令忽略之前由我们设置的条件相关的请求的现有缓存。 如果满足指定的条件,“fastcginocache”指令不缓存请求。
清除缓存
<br\>
缓存的命名约定基于我们为“fastcgicachekey”指令设置的变量。
- fastcgi_cache_key "$scheme$request_method$host$request_uri";
根据这些变量,当我们请求“http//localhost/time.php”时,以下是实际值:
- fastcgi_cache_key "httpGETlocalhost/time.php";
将此字符串传递到MD5哈希将输出以下字符串:
b777c8adab3ec92cd43756226caf618e
这就是高速缓存的文件名,就像我们输入的“levels = 1:2”子目录。 因此,目录的第一级将从这个MD5字符串的最后一个字符命名为1个字符,即e; 第二级将具有在第一级之后的最后2个字符,即18.因此,该高速缓存的整个目录结构如下:
/etc/nginx/cache/e/18/b777c8adab3ec92cd43756226caf618e
基于这种缓存命名格式,您可以用您最喜欢的语言开发一个清除脚本。 对于本教程,我将提供一个简单的PHP脚本,它清除POSTed URL的缓存。
/usr/share/nginx/html/purge.php:
- <?php
- $cache_path = '/etc/nginx/cache/';
- $url = parse_url($_POST['url']);
- if(!$url)
- {
- echo 'Invalid URL entered';
- die();
- }
- $scheme = $url['scheme'];
- $host = $url['host'];
- $requesturi = $url['path'];
- $hash = md5($scheme.'GET'.$host.$requesturi);
- var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
- ?>
向此文件发送带需要清除的URL的POST请求。
- curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php
该脚本将根据是否清除缓存而输出true或false。 请确保从高速缓存中排除此脚本,并限制访问。
Nginx使用教程(六):使用Nginx缓存之FastCGI缓存的更多相关文章
- Nginx使用教程(一):Nginx编译参数详解
从源代码编译应用程序时通常有三个步骤:配置,编译和安装. 配置步骤允许您选择一些在程序编译后无法编辑的选项,因为它对程序二进制文件有直接影响. 因此,这是一个非常重要的阶段,你需要仔细选择,如果你想避 ...
- Hibernate4教程六:性能提升和二级缓存
抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的元数 ...
- Nginx使用教程(三):Nginx配置性能优化之I/O和TCP配置
配置Nginx I/O <br\> Sendfile 当应用程序传输文件时,内核首先缓冲数据,然后将数据发送到应用程序缓冲区. 应用程序反过来将数据发送到目的地. Sendfile方法是一 ...
- Nginx使用教程(二):Nginx配置性能优化之worker配置
配置Nginx workers <br\>NGINX根据指定的配置运行固定数量的工作进程. 这些工作进程负责处理所有处理. 在下面的章节中,我们将调整NGINX worker参数. 这些参 ...
- Nginx详解六:Nginx基础篇之Nginx日志
1.Nginx日志类型 error.log:记录Nginx处理http请求的错误的状态,以及Nginx服务本身服务运行的错误的状态 access_log:记录通过Nginx的http请求的访问状态,用 ...
- Nginx总结(六)nginx实现负载均衡
前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...
- Nginx使用教程(五):使用Nginx缓存之缓存静态内容
NGINX虽然已经对静态内容做过优化. 但在高流量网站的情况下,仍然可以使用open_file_cache进一步提高性能. NGINX缓存将最近使用的文件描述符和相关元数据(如修改时间,大小等)存储在 ...
- Nginx详解十六:Nginx场景实践篇之缓存服务
缓存类型: 服务端缓存 代理缓存 客户端缓存 Nginx代理缓存 配置语法 使用之前需要先定义一个proxy_cache_path配置语法:proxy_cache_path path [levels= ...
- [Linux] 一个前端必会的 Nginx 免费教程-在虚拟机中用deepin测试
原文技术胖的 nginx 技术胖 专注于前端开发 deepin Linux Deepin 是一个基于 DEB 包管理的一个独立操作系统,和那些 Ubuntu(下个大版本是基于 debian 开发) 的 ...
随机推荐
- camera测试之MTF
1.MTF介绍 MTF(Modulation Transfer Function)模量传递函数.MTF是camera成像对比度和分辨率的综合表现.从另一个角度来看,camera成像过程可以简单看成下图 ...
- mongodb遇到的问题
安装好mongodb之后,服务里默认增加了一个mongodb service的服务,但是服务打不开,右键选择其属性,看他的执行路径执行的是cfg配置文件,看了配置文件里的东西,发现和自己想要的差不多, ...
- c# 模拟网易足彩算法
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- 最长滑道问题(非递归,C++)
这是爱奇艺的一道算法题. 题目描述请参考博客http://blog.csdn.net/sinat_30186009/article/details/52356053,在此表示感谢. 基本思路参考了以上 ...
- javaScript 设计模式之中介者模式示例
飞机把注册信息放到铁塔里,发送数据到铁塔,报告其它的飞机一些信息. var feiji = function( name ){ this.name = name; } feiji.prototype. ...
- C#基础(201)--常量枚举
本文知识点: 1.掌握常量的定义和使用方法 2.理解枚举的作用和特点 3.掌握枚举的使用方法 1.1.常量的定义语法 const 数据类型 常量名称 = 值: 1.2.常见错误 1.3常量的 ...
- readLine()的注意点
我在用socket做即时通讯的时候,读取服务器返回的信息用了BufferedReader,用起来挺方便的. BufferedReader br = new BufferedReader(new Inp ...
- Nginx 日志格式配置介绍
Nginx日志格式配置介绍 by:授客 QQ:1033553122 测试环境 CentOS 6.5-x86_64 nginx-1.10.0 配置例子 log_format main '$ ...
- 微信小程序开发之初探
本文是以一个简单的小例子,来简要讲解微信小程序开发步骤,希望促进学习分享. 概念 微信小程序,简称小程序,缩写xcx,英文mini program.是一种不需要下载安装即可使用的应用,它实现了应用“触 ...
- C# RichTextBox 制作文本编辑器
本文利用一个简单的小例子[文本编辑器],讲解RichTextBox的用法,仅供学习分享使用,如有不足之处,还请指正. Windows窗体中的RichTextBox控件用于显示,输入和操作格式化的文本, ...