• nginx缓存加速笔记


    1 服务端缓存原理

    主要是缓存代理的后端服务器
    proxy_cache 运用局部性的原理,备存一些先前被访问过、料将被再度使用的资源,使用户得以由前端服务器直接取得,从而减少后端服务器的资源开销,并缓解整个系统的压力。缓存也是反代的用途之一。本文介绍 Nginx 基本的缓存配置。

    1.1 定义一个缓存目录

    路径为 /usr/local/nginx/cache;采用二级的目录结构;建立一块用于存放缓存键 (cache keys) 和元数据 (metadata) 的共享内存区,名叫 “the_cache_zone” 且分配 10MB 的内存;不活跃的缓存文件 1 小时后将被清除;缓存所占磁盘空间的上限是 512MB;不另设临时目录。

    http {
        ...
        proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=500m;
        #proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;
        ...
    }
    

    1.2 启用缓存

    方便除错计,添加一响应头用以指示缓存状态 (MISS / BYPASS / HIT …)。

    下列指令请斟酌——
    proxy_cache_bypass 用于指定忽略缓存的情况,当其值为空或为零时,使用缓存。
    proxy_cache_key 用于生成缓存键,区分不同的资源。要特别留心 Query String。
    proxy_cache_min_uses 则规定缓存门槛,请求过多少次才缓存,不缓存低频请求,避免浪费。

    在下例中,$is_args 反映请求的 URI 是否带参数(网址中问号后面那一长串),若没有即为空值。$request_uri 近似于 $uri$is_args$args。key 是决定缓存命中率的因素之一。

            location /es {
                proxy_cache_key $request_uri;
                add_header X-Cache-Status $upstream_cache_status;
                proxy_cache cache_one;
                proxy_cache_valid any 5m;
                proxy_http_version 1.1;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_pass http://192.168.2.222:9200/; 
            }
    location / {
        ...
        proxy_pass http://www.example.com;
    
        proxy_cache the_cache_zone;
        #           proxy_cache_bypass $is_args;
        # (default) proxy_cache_key $scheme$proxy_host$request_uri;
        #           proxy_cache_min_uses 3;
        
        add_header X-Cache-Status $upstream_cache_status;
        ...
    }
    

    1.3 Nginx 作反代

    nginx相对来说也是客户端若希望抓取的源站内容总是新鲜,还需要忽略上游的缓存期限,即不遵循源站的 Cache-ControlExpires 等响应头,然后再来配置自己的缓存期限。

    服务端一侧,proxy_cache_valid 控制的是 expiration (有效期),针对不同的 HTTP 状态码可以设定不同的有效期。inactive 决定的是 retention (保留期限),时间一到管你新不新鲜都要丢掉 (refresh)。可以理解为 inactive 要优位于 proxy_cache_valid

    proxy_cache_revalidate 将对客户端传来之 Etag 或 Last-Modified 作出验证,若服务端资源没有变化,则使用“稍早前”缓存页面,无论其有效期为何。有助减少回源次数。

    location / {
        ...
        proxy_ignore_headers X-Accel-Expires Cache-Control Expires;
    
        proxy_cache_valid 301 1h;
        proxy_cache_valid 200 30m;
        proxy_cache_valid any 1m;
        proxy_cache_revalidate on;
        ...
    }
    

    1.4 缓存一时爽,全家火葬场。

    一大波缓存同时失效,会导致缓存雪崩 (Cache stampede),使得大批请求涌向源站。如果网站不是特别大、并发要求不是特别高,可以采取加锁排队和暂时返回陈旧数据的方式缓解问题。但根本的还是要各别设定缓存期限,错峰更新缓存,不要一窝蜂。

    proxy_cache_lock 对同一资源,未命中一次只回源一次,阻塞后续请求直至当前请求完成。
    proxy_cache_lock_age “不能者止”,如果当前请求未能如期完成,就放行后续请求。
    proxy_cache_lock_timeout 发生超时,同样放行,但不作缓存。
    proxy_cache_use_stale 则是指定“共体时艰”的情境,比如服务器正在更新 (updating) 缓存的时候,或者遭遇 503 服务不可用错误的时候,勉予使用 (inactive 还未清理的) 过期缓存,以保持可用性。
    proxy_cache_background_update 返回陈旧数据时,也跟源站要一份新鲜的,下次用。

    location / {
        ...
        proxy_cache_lock on;
        # (default) proxy_cache_lock_age 5s;
        # (default) proxy_cache_lock_timeout 5s;
    
        proxy_cache_use_stale error timeout updating http_503;
        proxy_cache_background_update on;
        ...
    }
    

    1.5 ngx_cache_purge

    倘若有手动清除缓存的需求,又用不起 NGINX Plus,不妨考虑 ngx_cache_purge

    下载源码、nginx -V 检视参数、追加参数 --add-module=../ngx_cache_purge-2.3 且重新编译 Nginx,以完成添加模块的动作。

    proxy_cache_purge 得回头看前面的配置,使用的缓存路径与 proxy_cache 的对应、缓存键向 proxy_cache_key 的看齐。URI 前面加上 /purge 即为清除缓存接口(最好不要被外部访问)。

    location / {
        ...
        proxy_cache the_cache_zone;
        proxy_cache_key $scheme$proxy_host$request_uri;
        ...
    }
    
    location ~ /purge(/.*) {
        ...
        allow 127.0.0.1;
        deny all;
        proxy_cache_purge the_cache_zone $scheme$proxy_host$1$is_args$args;
        ...
    }
    
    如果当你发现自己的才华撑不起野心时,那就请你安静下来学习
  • 相关阅读:
    SpringCloud分布式开发五大神兽
    Spring Cloud 架构 五大神兽的功能
    kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统
    ETL工具之Kettle的简单使用一(不同数据库之间的数据抽取-转换-加载)
    libjson 编译和使用
    一个用C++写的Json解析与处理库
    DB-library 常用函数
    什么是C++虚函数、虚函数的作用和使用方法
    C++用iconv进行页面字符转换
    QT学习:c++解析html相关
  • 原文地址:https://www.cnblogs.com/haozheyu/p/15667328.html
Copyright © 2020-2023  润新知