## 什么是 Nginx 缓存
Nginx 基于Proxy Store 实现,使用 Nginx 的 `http_proxy `模块可以实现类似于squid 的缓存功能。当启用缓存时,Nginx 会将相应数据保存在磁盘缓存中,只要缓存数据尚未过期,就会使用缓存数据来响应客户端的请求。
## 启用缓存
1. 在 http 模块下配置`proxy_cache_path `命令:
~~~
proxy_cache_path /data/cache keys_zone=huancun:10m;
~~~
第一个参数指定缓存保存的本地路径;第二个参数定义缓存数据的共享内存区域的名称和内存区大小。
Nginx 启动后,缓存加载程序只进行加载一次,加载时会将缓存的元数据加载到共享内存区域,但是如果一次加载整个缓存全部内容可能会使 Nginx 刚启动的前几分钟性能消耗严重,大幅度降低 Nginx 的性能。所以可以在 `proxy_cache_path`命令中配置缓存迭代加载。缓存迭代加载一共可以设置三个参数:
- loader_threshold:迭代的持续时间 (毫秒)(默认 200)
- loader_files:在一次迭代期间加载的最大项目(毫秒)(默认 100)
- loader_sleeps:迭代之间的延迟(毫秒)(默认为50)
例:
~~~
proxy_cache_path /data/cache keys_zone=niyueling:10m loader_threshold=300 loader_files=200;
~~~
2. 在虚拟服务器配置中配置`proxy_cache`命令:
~~~
proxy_cache huancun;
~~~
指定内存区。
> ps:通过配置 proxy_cache_path 中的 keys_zone 参数内存大小为 10m,并不会限制缓存数据大小,实际上缓存数据是存储在文件系统中的特定文件的元数据副本。如果想要限制缓存数据的上限,则需要在proxy\_cache\_path命令中添加max\_size参数设置缓存数据上限
3. 在虚拟服务器下配置`proxy_cache_methods`命令指定该虚拟服务器下什么类型的 HTTP 方法可以被缓存
~~~
proxy_cache_methods[GET HEAD POST];
~~~
默认情况下 `GET` 请求及 `HEAD` 请求会被缓存,而`POST`请求不会被缓存。
4. `proxy_cache_vaild` 针对不同状态码的响应数据设置不同的缓存时间
~~~
proxy_cache_valid reply_code [reply_code...] time;
~~~
例:
~~~
proxy_cache_valid 200 10m; # 200状态码的缓存时间为 10 分钟
proxy_cache_valid 404 1m; # 404的缓存时间为 1 分钟
proxy_cache_valid 302 5m; # 302重定向的缓存时间为 5 分钟
proxy_cache_valid any 5m; # 所有状态缓存时间 5 分钟
~~~
5. `proxy_cache_bypass`
~~~
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
·~~~
配置不从缓存中获取响应的条件。如果URL中包含该配置的值,则这次请求会直接跳过缓存直接请求后端服务去获取数据
6. `proxy_cache_min_uses`
~~~
proxy_cache_min_uses 2;
~~~
设置当某请求最少响应几次后会被缓存, 默认 1。
## 清除缓存
如果缓存过期则需要从缓存中删除过期的缓存文件,防止新旧缓存出现交错出错,当Nginx接收到自定义HTTP头或者PURGE请求时,缓存将会被清除。
### 配置缓存清除
http 模块下创建一个新变量 `$purge_method` 来标识使用 `PURGE `方法的请求并删除匹配的 URL。
~~~
http {
map $request_method $purge_method {
PURGE 1;
default 0;
}
}
~~~
进入虚拟服务器配置,在location中配置高速缓存,并且指定缓存清除请求命令`proxy_cache_purge`。
~~~
server {
listen 80;
server_name huancun.test;
location / {
proxy_cache huancun;
proxy_cache_purge $purge_method;
}
}
~~~
### 发送清除命令
发送PURGE请求来清除缓存
~~~
PURGE huancun.test
~~~
这些高速缓存数据不会从缓存中完全删除,它们将保留在磁盘上,直到它们被删除为非活动状态,或由缓存清除进程处理。
### 限制IP访问清除命令
~~~
geo $purge_allowed {
default 0;
192.168.1.100/24 1;
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
~~~
当Nginx接收到清除缓存请求时,Nginx 检查客户端 IP 地址,若 IP 地址已经获得清除缓存权限,则`$purge_method`设置为`$purge_allowed`,值为 1 表示允许清除缓存,值为0表示表示 IP 地址未获得权限。
> 相关函数文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- PHP
- PHP 核心架构
- PHP 生命周期
- PHP-FPM 详解
- PHP-FPM 配置优化
- PHP 命名空间和自动加载
- PHP 运行模式
- PHP 的 Buffer(缓冲区)
- php.ini 配置文件参数优化
- 常见面试题
- 常用函数
- 几种排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常见问题
- MySQL 索引
- 事务
- 锁机制
- Explain 使用分析
- MySQL 高性能优化规范
- UNION 与 UNION ALL
- MySQL报错:sql_mode=only_full_group_by
- MySQL 默认的 sql_mode 详解
- 正则表达式
- Redis
- Redis 知识
- 持久化
- 主从复制、哨兵、集群
- Redis 缓存击穿、穿透、雪崩
- Redis 分布式锁
- RedisBloom
- 网络
- 计算机网络模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常见几种网络攻击方式
- Nginx
- 状态码
- 配置文件
- Nginx 代理+负载均衡
- Nginx 缓存
- Nginx 优化
- Nginx 配置 SSL 证书
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 进程管理
- CentOS与Ubuntu系统区别
- Java
- 消息队列
- 运维
- RAID 磁盘阵列
- 逻辑分区管理 LVM
- 业务
- 标准通信接口设计
- 业务逻辑开发套路的三板斧
- 微信小程序登录流程
- 7种Web实时消息推送方案
- 用户签到
- 用户注册-短信验证码
- SQLServer 删除同一天用户重复签到
- 软件研发完整流程
- 前端
- Redux
- 其他
- 百度云盘大文件下载
- 日常报错记录
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客户端无法连接SVN服务器,主机积极拒绝
- Python
- 基础
- pyecharts图表
- 对象
- 数据库
- PySpark
- 多线程
- 正则
- Hadoop
- 概述
- HDFS