zoukankan      html  css  js  c++  java
  • Nginx作为缓存服务

    一、缓存类型

    1、服务端缓存

    2、代理缓存

    3、客户端缓存

    4、代理缓存的工作流程:

     

     二、代理缓存配置语法

    1、代理缓存路径

    配置语法

    Syntax:    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
    Default:    —
    Context:    http

     定义缓存目录空间大小和名字。

     可参考 http_proxy_module中proxy_cache官网文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

     2、配置代理缓存

    配置语法:

    Syntax:    proxy_cache zone | off;
    Default:    
    proxy_cache off;
    Context:    http, server, location

     zone : 就是上一步所配置的 proxy_cache_path 中 path 的名字。表示缓存存入哪个路径。

     3、缓存过期时间

    配置语法:

    Syntax:    proxy_cache_valid [code ...] time;
    Default:    —
    Context:    http, server, location

    code : http 状态码。

    例如配置 proxy_cache_valid 200 12h 意思是状态码为 200 的 缓存 12个小时。

    4、缓存的维度

    Syntax:    proxy_cache_key string;
    Default: proxy_cache_key $scheme$proxy_host$request_uri;
    Context: http, server, location
    proxy_cache_key $scheme$proxy_host$request_uri : http协议 + 主机名 + uri 把这三个作为一个单独的key来缓存。

    如何还需要缓存别的,就按照这种格式来设置。

    示例:

    a、负载均衡缓存服务配置(/etc/nginx/conf.d/cache_test.conf)如下:

    upstream chrdai {
        server 192.168.0.133:8001;
        server 192.168.0.133:8002;
        server 192.168.0.133:8003;
    }
    
    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            proxy_cache chrdai_cache;
            proxy_pass http://chrdai;
            proxy_cache_valid 200 304 12h;
            proxy_cache_valid any 10m;
            proxy_cache_key $host$uri$is_args$args;
            add_header Nginx-Cache "$upstream_cache_status";
    
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            include conf.d/proxy_params; //proxy_params请参考我上一章的内容
        }
    }

     配置说明:

    proxy_cache_path /opt/app/cache

    存放缓存文件的目录

    levels=1:2

    目录分级,按照两层目录的方式来进行分级。

    keys_zone=chrdai_cache:10m

    zone空间的名字,后面配置 proxy_cache 后面配的就是这个名字。10m表示开辟key空间的大小,一般1m大概能存放8000个key。

    max_size=10g

    表示缓存目录最大是多大,不能让缓存无限增长占满整个磁盘。当缓存空间满了后,Nginx就会触发淘汰规则,把不常访问的就会淘汰掉。

    inactive=60m

    这个60m是时间单位,表示60分钟,表示如果在60分钟内如果某个缓存没有被访问过,就会把它清理掉。

    use_temp_path=off

    这个是用来存放临时文件的,建议关闭,如果打开的话,Nginx会另外建立一个目录和cache目录两个目录在更新缓存时容易出现一些性能方面的损耗。

    proxy_cache chrdai_cache

    表示我们已经开启了代理缓存,该值是proxy_cache_path中的 keys_zone 的值,如果不想使用代理缓存,将该值配置成 off。

    proxy_pass http://chrdai

    代理的地址

    proxy_cache_valid 200 304 12h;

    状态码为200,304的响应过期时间为 12h。

    proxy_cache_valid any 10m;

    除了200和304状态码的其它状态码的缓存时间为10分钟。

    proxy_cache_key $host$uri$is_args$args;

    设置默认缓存的key。

    $is_args表示请求中的URL是否带参数,如果带参数,$is_args值为"?"。如果不带参数,则是空字符串。

    $args表示HTTP请求中的参数。

    add_header Nginx-Cache "$upstream_cache_status";

    增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。

    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

    当我们的后端其中一台服务器出现错误,超时,或者500,502,503,504等不正常的头返回时,就跳过这一台,去访问下一台。避免因为单台服务器的异常对前端产生影响。

    b、 另外三台真实服务器的配置如下:

    第一台(/etc/nginx/conf.d/realserver1.conf):

    第二台(/etc/nginx/conf.d/realserver2.conf):

     

    第三台(/etc/nginx/conf.d/realserver3.conf):

    c、分别在三台真实服务器(当然我这里是在一台服务器中用三个端口模拟的)的项目目录下建立index.html文件。

    第一台(/opt/app/code1):

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>proxy_cache test</title>
    </head>
    <body>
        <p>Test proxy_cache1</p>
    </body>
    </html>

     第二台(/opt/app/code2):

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>proxy_cache test</title>
    </head>
    <body>
        <p>Test proxy_cache2</p>
    </body>
    </html>

     第三台(/opt/app/code3):

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>proxy_cache test</title>
    </head>
    <body>
        <p>Test proxy_cache3</p>
    </body>
    </html>

    c、先在代理服务器中将缓存关闭 (proxy_cache off),刷新页面,发现页面可以在三个站点间轮询显示。‘

    d、然后在把代理缓存打开,发现页面不在轮询了,请求头多了缓存头(这是头我们配置的)。

    刷新第一遍的时候,请求头 Nginx-Cache : MISS

    第二遍刷新的时候就命中了代理缓存。

     同时也会在我们配置的缓存目录(/opt/app/cache)生成缓存目录

    三、清理指定缓存

    方法一

    m -rf 缓存目录内容

    这样会把所有的缓存都给清空掉。

    方法二

    第三方拓展模块 ngx_cache_purge

    四、如何让部分页面不缓存

    配置语法

    Syntax:proxy_no_cache string...;
    Default:-;
    Context:http,server,location;

    配置示例:

    upstream chrdai {
        server 192.168.0.133:8001;
        server 192.168.0.133:8002;
        server 192.168.0.133:8003;
    }
    
    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        if ($request_uri ~ ^/(index.html|login|register|password|/reset)) {
            set $cookie_nocache 1;
        }
    
        location / {
            proxy_cache chrdai_cache;
            proxy_pass http://chrdai;
            proxy_cache_valid 200 304 12h;
            proxy_cache_valid any 10m;
            proxy_cache_key $host$uri$is_args$args;
            proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
            proxy_no_cache $http_pragma $http_authorization;
            add_header Nginx-Cache "$upstream_cache_status";
    
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            include conf.d/proxy_params;
        }
    }

    这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。

    五、缓存命中分析

    方式一

    通过设置 response 的头信息 Nginx-Cache

    add_header Nginx-Cache "$upstream_cache_status";

    方式二

    通过设置 log_format,打印日志进行分析。(打印 $upstream_cache_status 这个Nginx默认的变量)

    $upstream_cache_status 这个变量有以下几种值:

    状态 含义
    MISS 未命中,请求被传送到后台处理
    HIT 缓存命中
    EXPIRED 缓存已经过期,请求被传送到后台处理
    UPDATING 正在更新缓存,将使用旧的应答
    STALE 后端得到过期的应答

    缓存命中率 = HIT次数 / 总请求次数。

    示例:

    首先在 /etc/nginx/nginx.conf 中的 logformat 中加入 $upstream_cache_status 这个变量。

    然后配置缓存代理的 access_log 的路径

    然后使用linux 的awk 命分析日志 。

    awk '{if($NF==""HIT""){hit++}}END{printf "%.2f", hit/NR}' /var/log/nginx/proxy_cache_access.log

    命令解释:

    $NF日志每行的最后一个参数。

    hit我们自定义的一个变量,用来记录被命中的次数。

    NRAWK的内置变量,表示本次分析所扫描日志的总行数。

    命令执行结果:

    说明我们的缓存命中率为 58%。

    六、大文件的分片请求

    http_slice_module

    配置语法

    Syntax:slice size;
    Default:slice 0;
    Context:http,server,location;

     size 是一个大小,表示是大文件被分割后,小文件的大小。

    实现原理

    会根据 Range 的值分割成小的请求去请求后端,返回回来的就是一个一个小的缓存文件, 

    优势:

    每个子请求收到的数据都会形成一个独立文件,一个请求断了,其它请求不受影响。

    缺点:

    当文件很大或者 slice 很小的时候,可能会导致文件描述符耗尽等情况。

    本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/protected/p/11355423.html

  • 相关阅读:
    android studio 中如何合并冲突(转)
    关于学习ZigBee的书籍
    多一点学习之外的人文思考
    有关技术文档的一点感想
    有关文学知识对我大学生活的影响
    【转】华为PCB布线规范
    【转】怎么样从一个疯狂下载者成为一个学习者!!!值得反省下的问题·~~
    时钟1
    关于有源滤波器和无源滤波器
    【转】zz个人的制板习惯流程
  • 原文地址:https://www.cnblogs.com/chrdai/p/11355423.html
Copyright © 2011-2022 走看看