前言
用户请求的图片,脚本,样式等静态资源的请求对后端服务器造成的压力在高并发的情况下,可能会拖垮你的服务器, 对于这些静态的资源我们把它缓存起来,在用户向服务请求这些静态资源时,前置服务器已经缓存了后端的资源,直接给用户响应, 减少的后端的压力,后端专注与业务,从而不被这些静态资源消耗IO的支出.
概述
在使用缓存的时候, NGINX 把响应保存在磁盘中,并且使用它们应答客户端的连接,不必每次都代理相同的内容
启用响应式缓存
步骤1:将指令 proxy_cache_path 包含在 http{} 中,
强制的第一个参数: 本地文件系统路径
强制的第二个参数: key_zone 参数定义用于存储元数据的内存空间的名称和大小.
max_size: 缓存文件的大小
http{
...
proxy_cache_path/data/nginx/cachekeys_zone=one:10m;
}
将 proxy_cache 指令 放在(protocol type, virtual server 或者 location) 你想缓存响应的地方, 将前面指定的keyzone 的内存名称作为参数给 proxy_cache_path
http{
...
proxy_cache_path/data/nginx/cachekeys_zone=one:10m;
server{
proxy_cachemycache;
location/{
proxy_passhttp://localhost:8000;
}
}}
key-zone 定义的内存大小并不影响缓存数据的总量.
涉及缓存的nginx 进程
cache manager:
定期检查缓存的状态, 如果缓存的大小超出了 max_size ,则会删除最近访问的数据,缓存数据的数量可以临时超过缓存管理器激活之间的时间限制
cache loader:
它仅仅在nginx 启动的时候运行一次,它将加载之前缓存的元数据到共享内存空间, 一次加载大量的缓存缓存数据需要消耗很多的资源, 会在nginx启动的最初几分钟内降低nginx 的性能,
为了避免这种情况, 配置以下的参数到proxy_cache_path 来配置缓存的加载.
loader_threshold: 迭代的时间, 单位毫秒 (默认200)
loader_files :在一次迭代中加载的项目的最大数量 (默认100)
loader_sleeps: 迭代之间的延迟,单位毫秒(默认50)
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定要缓存的请求:
默认情况下, NGINX 缓存所有的对HTTP 的GET 和 HEAD 请求进行缓存(在第一次请求代理服务器获取响应的时候)
nginx 使用其你去的字符串作为key, 如果一个请求具有和缓存响应有相同的key, nginx 将缓存响应发送给客户端.
你可以将指令包含在 http{},server{}或者location{} 包含各种指令来缓存响应
proxy_cache_key: 更改key的特性
proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_min_uses: 同一个请求在缓存开始之前必须执行的最小次数.
proxy_cache_min_uses 5;
proxy_cache_methods: 如果要缓存 GET 和 HEAD 之外的请求, 将GET HEAD 一起作为参数放在该参数后面
proxy_cache_methods GET HEAD POST;
限制或禁用缓存
默认情况下,响应会永远保存在缓存中,只有当缓存超过最大的配置带下, 才会删除它.然后按照最后一次的请求时间长度排序
你可以在http{},server{}, orlocation{}设置缓存的有效时间,甚至是完全使用缓存
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
在这个例子中, 响应状态码是200 或者 302 的时候缓存10秒钟, 响应状态码是400 缓存1秒钟, 如果要缓存所有的状态码, 指定any 作为第一个参数即可
proxy_cache_valid any 5m;
定义nginx 不向客户端发送缓存的条件,在 proxy_cache_bypass 指令中定义, 每个参数定义一个条件, 如果任何一个参数不是空的并且不等于 0 ,nginx 会立即将请求发送的后端服务器.
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
定义nginx 完全不缓存的条件, 在proxy_no_cache 指令中定义和 proxy_cache_bypass 相同的参数即可.
下一章节:
从缓存中清除内容
字节范围的缓存
综合配置示例:
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300
loader_files=200 max_size=200m;
server {
listen 8080;
proxy_cache mycache;
location / {
proxy_pass http://backend1;
}
location /some/path {
proxy_pass http://backend2;
proxy_cache_valid any 1m;
}
}}
领取专属 10元无门槛券
私享最新 技术干货