1.Nginx的缓存简介
nginx的http_proxy模块,可以实现类似于Squid的缓存功能。Nginx对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginx服务器与后端服务器之间的网络流量,减轻网络拥塞,同时还能减小数据传输延迟,提高用户访问速度。同时,当后端服务器宕机时,Nginx服务器上的副本资源还能够回应相关的用户请求,这样能够提高后端服务器的鲁棒性。
2.nginx cache的最基本的配置
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
2. server {
3. set $upstream http://ip:port
4. location / {
5. proxy_cache my_cache;
6. proxy_pass $upstream;
7. }
8. }
配置项说明如下:
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. /path/to/cache #本地路径,用来设置Nginx缓存资源的存放地址
2. levels #默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中
3. key_zone #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
4. max_size #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
5. inactive #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
6. use_temp_path #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
7. proxy_cache #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。
3.nginx缓存的一些其他知识
(1)proxy_cache_use_stale增强站点容错能力
源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求。举个栗子:
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. location / {
2. ...
3. proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
4. }
如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。
(2)多磁盘分割缓存
使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。举个栗子:
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
2. proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
3. split_clients $request_uri $my_cache {
4. 50% "my_cache_hdd1";
5. 50% "my_cache_hdd2";
6. }
7. server {
8. ...
9. location / {
10. proxy_cache $my_cache;
11. proxy_pass http://my_upstream;
12. }
13. }
例子中的两个proxy_cache_path定义了两个缓存(my_cache_hdd1和my_cache_hd22)分属两个不同的硬盘。split_clients配置部分指定了请求结果的一半在my_cache_hdd1中缓存,另一半在my_cache_hdd2中缓存。基于$request_uri(请求URI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI的请求结果通常会被缓存在同一个缓存中。
(3)缓存命中情况的Nginx变量$upstream_cache_status
$upstream_cache_status的可能值有:
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. MISS —— 响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来
2. BYPASS —— 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass,这个响应之后可能会被缓存起来
3. EXPIRED —— 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容
4. STALE —— 内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale
5. UPDATING —— 内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置
6. REVALIDATED —— proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)
7. HIT —— 响应包含来自缓存的最新有效的内容
(4)http响应头Cache-Control
当在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,不允许代理对资源进行缓存。
(5)nginx对缓存的资源会设置一个key,NGINX生成的键的默认格式是类似于下面的NGINX变量的MD5哈希值:$scheme$proxy_host$request_uri,实际的算法有些复杂。 为了改变变量(或其他项)作为基础键,可以使用proxy_cache_key命令。例如,
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
(6)缓存指令proxy_cache_valid
为不同的HTTP返回状态码的资源设置不同的缓存时长。
命令格式为:
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. proxy_cache_valid [code ...] time;
举例来说,
**[plain]** [view plain](http://blog.csdn.net/wangjianno2/article/details/75201020# "view plain") [copy](http://blog.csdn.net/wangjianno2/article/details/75201020# "copy")
1. proxy_cache_valid 200 302 10m; #为响应码是200和302的资源,设置缓存时长为10分钟
2. proxy_cache_valid 404 1m; #为响应码是404的资源,设置的缓存的时长为1分钟
(7)缓存清理指令proxy_cache_purge
[原文地址](http://blog.csdn.net/wangjianno2/article/details/75201020)
- 关于我
- nginx
- 代理
- 实例1
- 使用Nginx实现反向代理
- nginx反向代理配置
- Nginx缓存原理及配置
- nginx 信号集
- rewrite
- nginx rewrite规则
- nginx rewrite 正则规则详解
- nginx+php-fpm fastcgi防止跨站、跨目录的安全设置
- 写了个shell脚本,实现nginx日志自动切割,并利用goaccess分析成HTML报表,然后通知管理人员查阅
- nginx禁止一些常见的不应该让用户访问的文件
- PHP
- 实现PHP多进程管理
- php代码规范
- PHP性能优化
- PHP结构优化大全
- PHP编码规范
- 常见的PHP安全性攻击
- Linux
- 常用命令
- scp
- touch
- nohup
- rsync
- ssh命令 远程登录
- chmod
- nginx日志切割脚本
- Linux使用ssh公钥实现免密码登录Linux
- 使用ssh公钥密钥自动登陆linux服务器
- Linux查看程序端口占用情况
- ssh 公钥私钥认证原理
- 路由图
- CentOS7防火墙设置
- linux下用户管理
- Linux 服务器安全技巧
- Linux shell 提取文件名和目录名
- Linux环境下设置命令别名(alias)
- Git
- 搭建Git服务器
- 手把手教你搭建git服务器
- Git 基本操作
- git删除文件夹/文件(不删除本地文件)
- git忽略文件和文件夹以及文件权限
- Git的四个区五种状态
- git init 和 git init --bare 的区别
- git仓库删除所有提交历史记录,成为一个干净的新仓库
- 如何正确使用Git Flow
- HTTP
- 前端跨域解决方案
- HTTP基本概念
- Redis
- Redis 数据类型及应用场景
- JavaScript
- WebSocket探秘
- socket与websocket的区别
- 基于 Swoole 的微信扫码登录
- Web前端开发规范手册
- 简单的学习了一下ES6
- ES6模块的import和export用法
- MySql
- MySql重置root密码的方法
- mysql 5.6.30 开启慢查询日志
- mysql查看锁表情况
- 我的设计稿
- 会计出纳系统
- 上门宝ERP系统
- 社交应用七大需求
- 出纳系统
- 利用SdfMpp搭建中大行软件系统
- B2C库存商品系统
- 软件
- 网上商城
- 思维逻辑
- 系统架构分层图
- 代码检查规范
- 研发计划
- 系统架构
- 我设计的架构架构图
- 电商网站架构案例
- 大型网站架构
- 服务熔断、降级、限流、异步RPC
- 软件版本号规范
- 第三方服务引擎
- kafka
- ElasticSearch
- 阿里云 推荐引擎
- 随记
- 人生最大的投资
- 产品研发团队管理的6个方面
- 我感觉自己根本不是一个创业者,更谈不上企业家,果然还是屌丝这个称呼更适合我。
- 学什么语音都应该养成的编程习惯
- 2018年5月23日 多云转阴 15-24°C 离职信
- 2017年12月25日
- 对“目标”的认知
- 个人简历
- API设计
- 理解OAuth 2.0
- OAuth 2.0四种授权方式小结
- 对 REST 的理解
- RESTful API 设计指南
- RESTful API 设计
- RPC
- 微服务架构方案
- SOA
- 理解RESTful架构
- RESTful API GET,DELETE,PUT和POST的响应状态码
- MongoDB
- MongoDB-无法启动的一个问题