代理缓存服务

  • 客户端缓存:浏览器缓存,expire、etag、last-modified
  • 代理缓存:nginx
  • 服务端缓存:memcached、redis

代理缓存参数

配置示例

    upstream flask_with_cache {
        server 192.168.2.20:5001;
        server 192.168.2.20:5002;
        server 192.168.2.20:5003;
    }
    # 缓存定义
    # 首先是缓存的目录
    # levels是缓存目录层级结构
    # key_zone定义缓存对象名称、10m为总的key的大小、通常1m~=8000key
    # max_size为最大缓存目录大小,当满了后nginx就会触发自己淘汰规则,将不常用的key淘汰掉
    # inactive定义了缓存超过60分钟没有使用就淘汰掉
    # use_temp_path定义为关闭临时缓存,不然还需要配置一个缓存的临时目录,通常会带来性能损耗
    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=flask_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen         80;
        server_name    www.flask.com;
        sendfile       on;
        location / {
            proxy_cache flask_cache;
            # 设置缓存过期时间,200和304为12小时
            proxy_cache_valid 200 304 12h;
            # 除了200和304其他的都是10m过期
            proxy_cache_valid any 10m;
            # 缓存hash的key
            proxy_cache_key $scheme$host$uri$is_args$args;
            # 返回给客户端是否命中
            add_header Nginx-Cache "$upstream_cache_status";
            # 当后端server返回以下异常时,访问另一个后端server
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

            proxy_pass http://flask_with_cache/;
            include proxy_params;
        }
}

测试请求,可以看到头部信息中,Nginx-Cache第一次时MISS,说明没有缓存,第二次就是HIT,说明命中缓存了

[root@bj-vmware-test1 conf.d]# curl -I http://www.flask.com/
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sat, 09 Dec 2017 07:56:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Connection: keep-alive
Nginx-Cache: MISS

[root@bj-vmware-test1 conf.d]# curl -I http://www.flask.com/
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sat, 09 Dec 2017 07:56:39 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Connection: keep-alive
Nginx-Cache: HIT

缓存信息就在定义的目录中

[root@bj-vmware-test1 conf.d]# ls /opt/app/cache/
9

清理nginx代理缓存

  • 方法一:删除全部缓存 cd cache_path && rm -rf *
  • 方法二:删除指定url缓存,nginx官方不支持,第三方模块ngx_cache_purge

部分页面不缓存

server {
    listen         80;
        server_name    www.flask.com;
        sendfile       on;
        if ( $request_uri ~ ^/(url3|login|register|passwod|reset)){
            set $cookie_nocache 1;
        }
        location / {
            proxy_cache flask_cache;
            # 设置缓存过期时间,200和304为12小时
            proxy_cache_valid 200 304 12h;
            # 除了200和304其他的都是10m过期
            proxy_cache_valid any 10m;
            # 缓存hash的key
            proxy_cache_key $scheme$host$uri$is_args$args;
            # 返回给客户端是否命中
            add_header Nginx-Cache "$upstream_cache_status";
            # 当后端server返回以下异常时,访问另一个后端server
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            # 如果cookie_nocache 为1不进行缓存,为空就进行缓存
            #proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

            proxy_pass http://flask_with_cache/;
            include proxy_params;
        }
}

大文件分片请求

优点:大请求切割成小请求,避免一个大请求断掉重新请求的问题 缺点:slice设置过小时fd损耗过多

results matching ""

    No results matching ""