当前位置: 首页 > 编程日记 > 正文

nginx缓存功能的设置

首先用的缓存是proxy_cache.

在http段里加入下列几句:

[plain] view plaincopy
  1. proxy_connect_timeout 5;
  2. proxy_read_timeout 60;
  3. proxy_send_timeout 5;
  4. proxy_buffer_size 16k;
  5. proxy_buffers 4 64k;
  6. proxy_busy_buffers_size 128k;
  7. proxy_temp_file_write_size 128k;
  8. proxy_temp_path /home/temp_dir;
  9. proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:50m inactive=20m max_size=30g;


上面的各行的参数我再时不解释,网上有很多。

接下来在要缓存的service里加入:

[plain] view plaincopy
  1. location /gou/detail-id-116  {
  2. ##缓存
  3. index  index.html index.htm index.php;
  4. proxy_cache cache_one;
  5. proxy_cache_valid 200 302 1h;
  6. proxy_cache_key $host$uri$is_args$args;
  7. proxy_pass   http://contactpool;
  8. proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";#不处理后端服务器返回的指定响应头
  9. expires 30d;
  10. proxy_set_header Host $host;
  11. proxy_set_header X-Real-IP $remote_addr;
  12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13. }

当然可以用正则缓存更多的页面如:~.*\.(PHP|jsp|cgi)?$

上面的我只解释一下地方:

[plain] view plaincopy
  1. proxy_ignore_headers

这个表示不处理后端服务器返回的指定响应头,作用就是能够缓存动态页面,比如.php的页面,如果不加这一行就只能缓存静态的页面内容了。

现在:nginx -s reload 后缓存就有了,

接下来如何在需要的时候清理缓存呢,

网上一位大牛分析了nginx是如何存的缓存文件:

计算方法:
1) nginx先把请求地址/1.png用md5进行哈希,得到e0bd86606797639426a92306b1b98ad9
md5的参数就是上面的配置中:

[plain] view plaincopy
  1. proxy_cache_key

值,如md5("www.xxx.com/gou/detail-id-116");

2) level=1:2就是把最后一位数9拿出来建一个目录,然后再把9前面的2位建一个目录,最后把刚才得到的这个缓存文件放到9/ad目录中。
同样的方法推理,如果level=1:1,那么缓存文件的路径就是/usr/local/nginx/cache/9/d/e0bd86606797639426a92306b1b98ad9

那么我们就可以写一个脚本来清理特定的缓存了:

[plain] view plaincopy
    1. #!/usr/bin/env php
    2. <?php
    3. $cache_dir = '/usr/local/nginx/cache/';
    4. $request_uri = $argv[1];
    5. $url_hash = md5($request_uri);
    6. $dir1 = substr($url_hash,-1,1) . '/';
    7. $dir2 = substr($url_hash,-3,2) . '/';
    8. $cached_file = $cache_dir . $dir1 . $dir2 . $url_hash;
    9. if (is_file($cached_file)) {
    10. if (unlink($cache_dir . $dir1 . $dir2 . $url_hash)) {
    11. echo $request_uri . " 缓存清除成功\n";
    12. } else {
    13. echo $request_uri . " 缓存清除失败\n";
    14. }
    15. } else {
    16. echo $request_uri . " 未被缓存\n";

-----------------------------------------------------------------------------------------------------------------------

fastcgi cache

先看下测试数据:

未使用

Concurrency Level:      5
Time taken for tests:   9.016 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1696500 bytes
HTML transferred:       1669000 bytes
Requests per second:    11.09 [#/sec] (mean)
Time per request:       450.781 [ms] (mean)
Time per request:       90.156 [ms] (mean, across all concurrent requests)
Transfer rate:          183.76 [Kbytes/sec] received

日志里显示,页面执行需要0.004s

Concurrency Level:      5
Time taken for tests:   3.203 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1685400 bytes
HTML transferred:       1669000 bytes
Requests per second:    31.22 [#/sec] (mean)
Time per request:       160.156 [ms] (mean)
Time per request:       32.031 [ms] (mean, across all concurrent requests)
Transfer rate:          513.84 [Kbytes/sec] received

日志里显示,页面执行时间为0s

提高的很明显!
http里:

fastcgi_cache_path /www/php_cache  levels=1:2  keys_zone=cache_php:30m inactive=1d max_size=10g;

server里:

location ~ .*\.php?$
{#fastcgi_pass  unix:/tmp/php-cgi.sock;fastcgi_pass  127.0.0.1:9000;fastcgi_index index.php;include fcgi.conf;#以下是fastcgi_cache的配置fastcgi_cache   cache_php;fastcgi_cache_valid   200 302  1h;fastcgi_cache_min_uses  1;fastcgi_cache_use_stale error  timeout invalid_header http_500;fastcgi_cache_key $host$request_uri;}

fastcgi_cache_path:fastcgi_cache
缓存目录,可以设置目录层级,比如1:2会生成16*256个字目录,cache_php是这个缓存空间的名字,cache是用多少内存(这样热门的内容
nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间。本来还有个
fastcgi_temp_path参数,但发现似乎没用。

fastcgi_cache_valid:定义哪些http头要缓存
fastcgi_cache_min_uses:URL经过多少次请求将被缓存
fastcgi_cache_use_stale:定义哪些情况下用过期缓存
fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录
fastcgi_cache:用哪个缓存空间

指定删除某一URL的php文件的缓存的PHP程序
大致代码如下:

<?php
function purgeCache()
{ $url = $this->post('url');  //获取不带协议的url即可  如:192.168.100.121/index.php  md5为ca0523d698167fcc981bf9e04f3c792a 最终生成的文件名就是这个if (empty($url) || !Cola_Com_Validate::url($url)) {exit('请输入正确的URL。');}$md5 = md5($url);$cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;if (!file_exists($cacheFile)) {exit('缓存不存在。');}if (@unlink($cacheFile)) {echo '清除缓存成功。';} else {echo '清除缓存失败。';}
}

参考网站地址:http://www.fuchaoqun.com/2011/01/nginx-fastcgi_cache/

Nginx
fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义
fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的
头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

这样就告诉Nginx,这个页面不需要缓存。

好吧,要淡定不要D疼,还有最后一个问题,如果页面中只有一小部分内容不可以缓存,可以用Nginx
fastcgi_cache吗?比如某个内容页,大部分内容可以缓存,但希望把用户的登录信息更新上去。答案是肯定的,可以直接输出用户未登录的页面样
式,等页面加载完毕之后,通过ajax异步更新用户信息:

$().ready(function() {initUser();
})

转载于:https://www.cnblogs.com/web21/p/7416864.html

相关文章:

线性表List的基本创建

#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define IINFEASIBLE -1 #define OVERFLOW -2 typedef int Status; /*类型名定义用status代替int;Sta…

点点看   只有想不到没有看不到

看了这些好看的图片&#xff0c;不禁也想把自己看到的图片与大家一起分享了&#xff01;[url]http://mm-nn.com.cn/MM[/url]网[url]http://haotupic.cn/[/url]好图片网[url]http://www.picguan.cn/[/url]美女图片馆[url]http://www.nvyoou.cn/[/url]女友网[url]http://www.soft…

二叉树的基本应用知识总结

#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define IINFEASIBLE -1 #define OVERFLOW -2#define MAX_TREE_SIZE 100//二叉树的最大结点数 typedef ch…

JS原生选项卡 – 幻灯片效果

1 <!DOCTYPE HTML>2 <html>3 <head>4 <meta charset"utf-8">5 <title>JS实现幻动片选项卡</title>6 </head>7 <style>8 .container{9 text-align:center; 10 width:100%; 11 } 12 13 .ppt{ …

MSSQL 2008里事务的一个问题

今天在试MSSQL2008里的事务&#xff0c;发现如果事务中某条语句的表名错误&#xff0c;就无法用error或try回滚&#xff0c;具体如下&#xff1a;begin tran delete from test where id 5 --正确语句 dealete from testa where id1 4 --表名错误&#xff0c;testa 表…

避免在JSP中写java代码

作者&#xff1a;蜗牛学院CTO李懿老师 ​自从十年前的taglibs&#xff08;如JSTL&#xff09;和EL&#xff08;表达语言&#xff0c;这些事情&#xff09;诞生以来&#xff0c;在JSP中使用scriptlet&#xff08;<% %>这些东西&#xff09;的确是非常不鼓励的。 小脚本的主…

爱情也许是最忧伤的童话

也许爱情是一部忧伤的童话 惟其遥远与真实 惟其不可触摸与欠缺 方可成就起璀璨与神圣 或许&#xff0c;只有在难得最远的时候&#xff0c; 才能把曾经走过的那段日子 看得最真切、最清楚 放弃一个很爱你的人&#xff0c;并不痛苦 放弃一个你很爱的人&#xff0c;那才痛苦 爱…

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战&#xff08;六&#xff09; 原文:Docker最全教程——从理论到实战&#xff08;六&#xff09;托管到腾讯云容器服务 托管到腾讯云容器服务&#xff0c;我们的公众号“magiccodes”已经发布了相关的录屏教程&#xff0c;大家可以结合本篇教程一起…

c#中分割字符串的几种方法

第一种方法&#xff1a;打开vs.net新建一个控制台项目。然后在Main()方法下输入下面的程序。 string s"abcdeabcdeabcde"; string[] sArrays.Split(c); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果:ab deab deab de 我们看到了结果…

对相机所看的视角截屏保存为图片

对相机所看的视角截屏保存为图片&#xff1a; 1 using UnityEngine;2 using System.Collections;3 using UnityEngine.UI;4 /// <summary>5 /// 对相机截图6 /// </summary>7 public class Jietu : MonoBehaviour {8 9 public Camera camera; 10 Texture2D…

fsum函数测试以及分析

#include <stdio.h> #include <stdlib.h> #include <string.h>#define BUFSIZE 256//这是一句预定义&#xff0c;定义BUFSIZE的值是100&#xff0c;是缓冲空间的大小,作为数组的。int main(int argc, char *argv[]) //第一个int argc&#xff0c;是记录你输入…

oracle学习总结二(转义字符)

1、oracle 特殊字符 转义关键词&#xff1a; oracle 转义 环境&#xff1a;oracle 9i plsql在plsql里边执行:update userinfo set pageurlmyjsp?page1&pagesize10 where idtest这条sql语句往数据库的pageurl字段放进去了一…

C语言——冒泡法排序应用

#include <stdio.h> #include <stdlib.h> int main()/*有int main 就会有return 0;如果是void main ,就不用加上return 0了 */ {int i,j,temp;/*待会要用到&#xff0c;所以先定义,因为输入的都是整数&#xff0c;所以用int整数型*/int a[10];/*定义一个一维整型数…

2017 Multi-University Training Contest 3 hdu 6063

HDU 6063 思路&#xff1a; AC代码&#xff1a; #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "m…

[学习]GridView 学习集合 -- GridView中使用超链接的技巧

GridView中使用超链接的技巧 数据绑定方式有两种&#xff0c;如下示例&#xff1a; Eval方式 &#xff1c;%# Eval("id") %&#xff1e; Bind方式 &#xff1c;%# Bind("id","~/info.aspx?id{0}") %&#xff1e; 推荐使用第一种方式&#xff0c…

C# http 性能优化500毫秒到 60 毫秒

来源&#xff1a;https://www.cnblogs.com/hnsongbiao/p/9815808.html 偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 后来 整理 各种方法做了优化 HttpWebRequest request WebRequest.Create(address) as H…

一个计算机高手的成长(转)

这些日子我一直在写一个实时操作系统内核&#xff0c;已有小成了&#xff0c;等写完我会全部公开&#xff0c;希望能 够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 &#xff0c;所以把我的经历写出来与大家共勉&#xff0c;希望能给刚如行…

正则表达式整理

1.特殊字符 ^匹配输入字符串的开始位置$匹配输入字符串的结尾位置( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符&#xff0c;请使用 \( 和 \)。* 匹配前面的子表达式零次或多次。要匹配 * 字符&#xff0c;请使用 \*。匹配前面的子表达式一…

CSS-hover

1. padding:0 10px; 表示上下边距是0&#xff0c;左右边距是10. 2. padding:0 10px 0 10px&#xff1b; 上-右-下-左。&#xff08;顺时针方向&#xff09; 3. .pg-header .menu:hover&#xff1b; 表示只要鼠标移动到当前标签上时&#xff0c;就会应用这个下面所定义的样式。 …

Error原生类型

•表示错误对象 –EvalError, URIError, RangeError, etc. •捕获方式&#xff1a; –try { …throw new Error(…) } catch(e) { … } –理论上可以throw出任意对象 •Error对象IE和FireFox公有属性 –message&#xff1a;错误信息Error浏览器特定属性 •IE&#xff1a; –des…

求矩阵两条对角线元素之和

#include <stdio.h> #include <stdlib.h>int main() {int a[3][3];//定义一个二维数组&#xff0c;三行三列&#xff0c;a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],a[3][0],a[3][1],a[3][2]int i,j,sum0;printf("请输入9个数据给数组赋值:\n");f…

关于Java中各种修饰符与访问修饰符的说明

关于Java中各种修饰符与访问修饰符的说明 类&#xff1a; 访问修饰符 修饰符 class 类名称extends 父类名称 implement 接口名称 &#xff08;访问修饰符与修饰符的位置可以互换&#xff09;访问修饰符 名称 说明 备注 public可以被所有类访问&#xff08;使用&#xff0…

buffer IO和direct IO

最近在看很多框架&#xff0c;redis&#xff0c;kafka等底层都涉及到文件IO操作的效率问题&#xff0c;所以查了些资料&#xff0c;看到这篇文章讲的比较明白些&#xff0c;贴出来留存。 链接地址&#xff1a; https://www.ibm.com/developerworks/cn/linux/l-cn-directio/转载…

python 列表使用

下面实现的类似于java中的数组&#xff1a; names[-2]表示实现倒数的第2个参数 names[-3,-1]表示实现-3到-1的值不包含-1 增删改查 下面代码实现列表的增删改查功能&#xff1a; 复制copy 深copy:这个可以copy全部的参数列表&#xff08;一般不用&#xff09;。 For循环打印列表…

c语言——求单词个数

#include <stdio.h> #include <stdlib.h>int main() {char str[20];//定义一个字符型一维数组&#xff0c;长度为20int i,num;printf("请输入一行英文:\n");//提示语句gets(str);//输入一个字符串给字符数组strnum str[0]! ? 1:0;//? : 是条件运算符…

C# 各种进制之间相互转换 [ZT]

MessageBox.Show(Convert.ToString(12345, 2)); //10进制转换为2进制MessageBox.Show(Convert.ToString(12345, 8)); //10进制转换为8进制MessageBox.Show(Convert.ToString(12345, 16)); //10进制转换为16进制MessageBox.Show(Convert.ToInt32("1100", 2).ToStri…

慕课《深入理解计算机系统》袁林枫老师章节测试1-9

1以下有关冯.诺依曼结构思想的叙述中&#xff0c;错误的是&#xff08; C &#xff09;。 A.计算机内部以二进制形式表示指令和数据 B.程序由指令构成&#xff0c;计算机能自动执行程序中一条一条指令 C.指令和数据都放在存储器中&#xff0c;两者在形式上有差别&#xff08…

WCF 和 ASP.NET Web API

地址&#xff1a;https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/wcf-and-aspnet-web-api WCF 是 Microsoft 为生成面向服务的应用程序而提供的统一编程模型。 借助这一模型&#xff0c;开发人员可以构建既能跨平台与现有投资集成又能与现有投资交互的安全、可靠的事务…

php中操作mysql的函数库

发现php中的mysql库是一个函数库 而不是一个类库 使用面向过程的形式组织。mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 mysql_change_user -- 改变活动连接中登录的用户 mysql_client_encoding -- 返回字符集的名称 mysql_close -- 关闭 MySQL 连接 mysq…

Firetruck UVA - 208

DFS并查集 如果只用DFS的话会超时&#xff0c;用并查集剪枝&#xff0c;和起点终点不联通的点就不用跑了 这题有好多人写了博客&#xff0c;但是我觉得我的代码写的比较通俗易懂所以就贴上来了&#xff0c;我觉得我写代码的目标就是让任何人都能看懂&#xff0c;越小白越好&…