深入Nginx + PHP 缓存详解


Posted in PHP onJuly 11, 2013

Nginx缓存
nginx有两种缓存机制:fastcgi_cache和proxy_cache
下面我们来说说这两种缓存机制的区别吧
proxy_cache
作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态的
fastcgi_cache作用是缓存fastcgi生成的内容,很多情况是php生成的动态内容
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端带宽
fastcgi_cache缓存减少了nginx与php的通信次数,更减轻了php和数据库的压力。
proxy_cache缓存设置

#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
server
{
listen 80;
server_name www.yourdomain.com 192.168.8.42;
index index.html index.htm;
root /data0/htdocs/www;
location /
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
expires 1d;
}
#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}
access_log off;
}
}

fastcgi_cache缓存设置
#定义缓存存放的文件夹
fastcgi_cache_path /tt/cache levels=1:2 keys_zone=NAME:2880m inactive=2d max_size=10G;
#定义缓存不同的url请求
fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y";
server {
listen 8080;
server_name www.example .com;
location / {
root /www;
index index.html index.htm index.php;
}
location ~ (|.php)$ {
root /www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache NAME;
fastcgi_cache_valid 200 48h;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
#设置缓存的过程中发现无法获取cookie,经查需要定义这句话
fastcgi_pass_header Set-Cookie;
}
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /httplogs/access.log access;
}

总的来说 nginx的proxy_cache和fastcgi_cache的缓存配置差不多。
--------------------------------------------------------------------------------
memcache缓存
在讨论memcache缓存之前,我们先了解下mysql的内存缓存吧
mysql的内存缓存可以在my.cnf中指定大小:内存表和临时表不同,临时表也是存放内存中,临时表最大的内存需要通过tmp_table_size=128M设定。当数据查过临时表的最大值设定时,自动转为磁盘表,此时因需要进行IO操作,性能会大大下降,而内存表不会,内存满了后,会提示数据满错误。
例:
create table test
(
id int unsigned not null auto_increment primary key
state char(10),
type char(20),
date char(30)
)engine=memory default charset=utf8

内存表的特性:
1.内存表的表定义存放在磁盘上,扩展名为.frm,所以重启不会丢失
2.内存表的数据是存放在内存中,重启会丢失数据
3.内存表使用一个固定的长度格式
4.内存表不支持blob或text列,比如varchar与text字段就不会被支持
5.内存表支持auto_increment列和对可包含null值的列的索引
6.内存表不支持事物
7.内存表是表锁,当修改频繁时,性能可能会下降

下面我们来看看memcache,相对而言mysql的内存表限制较多。
memcache的用途
1.提高系统的并发能力
2.减轻数据库的负担
注:memcache linux系统32位只支持4G内存,同时memcache最长保存时间为30天。

PHP 相关文章推荐
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
如何用php获取文件名后缀
Jun 09 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
基于PHP中的常用函数回顾
Jul 11 #PHP
PHP 获取文件权限函数介绍
Jul 11 #PHP
浅析php学习的路线图
Jul 10 #PHP
php对图像的各种处理函数代码小结
Jul 08 #PHP
php/js获取客户端mac地址的实现代码
Jul 08 #PHP
关于PHP语言构造器介绍
Jul 08 #PHP
php5.5新数组函数array_column使用
Jul 08 #PHP
You might like
使用PHP批量生成随机用户名
2008/07/10 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python学习小技巧之列表项的排序
2017/05/20 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
Python登录系统界面实现详解
2019/06/25 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
pycharm实现猜数游戏
2020/12/07 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
2014社区三八妇女节活动方案
2014/03/30 职场文书
借款协议书
2014/04/12 职场文书
补充协议书范本
2014/04/23 职场文书
新学期开学演讲稿
2014/05/24 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技