Nginx缓存模块详解-proxy-cache

Nginx缓存模块详解-proxy-cache

1、基本缓存概念

一个web缓存坐落于客户端和“原始服务器(origin server)”中间,它保留了所有可见内容的拷贝。如果一个客户端请求的内容在缓存中存储,则可以直接在缓存中获得该内容而不需要与服务器通信。这样一来,由于web缓存距离客户端“更近”,就可以提高响应性能,并更有效率的使用应用服务器,因为服务器不用每次请求都进行页面生成工作,在浏览器和应用服务器之间,存在多种“潜在”缓存,如:客户端浏览器缓存、中间缓存、内容分发网络(CDN)和服务器上的负载平衡和反向代理。缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。

图一:image_1dagv7ecj1b9q1cou187p1e5iupj9.png-293.3kB

2、Proxy Cache模块常用指令解析

本章节主要解析一下nginx ngx_http_proxy_module中的cache相关配置参数

1
2
3
4
5
#默认为off,即关闭proxy_cache功能,zone为用于存放缓存的内存区域名称。例:proxy_cache my_zone;从nginx0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的"Cache-Control"、"Expire"头域。如,Cache-Control为no-cache时,是不会缓存数据的。
proxy_cache
Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location

1
2
3
4
5
6
7
8
9
10
11
#定义缓存存放路径、缓存大小、缓存时间等参数
proxy_cache_path
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
#path 缓存文件路径
#levels 设置缓存文件目录层次;levels=1:2 表示两级目录
#keys_zone 设置缓存名字和共享内存大小
#max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源
#inactive:内存中缓存的过期检查周期。示例配置中如果 2h 内都没有被访问,则不论状态是否为 expired,都会清除缓存。需要注意的是,inactive 和 expired 配置项的含义是不同的,expired 只是判断过期时间,不会删除缓存;而 inactive 是直接删除过期缓存
#use_temp_path:如果为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 temp_path 指定的临时存储路径
1
2
3
4
5
#指定哪些响应在某些值不为空或不为0的情况下不走缓存,比如proxy_cache_bypass $http\_pragma $http_authorization;
proxy_cache_bypass
Syntax: proxy_cache_bypass string ...;
Default: —
Context: http, server, location
1
2
3
4
5
#定义 proxy_cache 生成文件的名称。值可以为 Nginx 支持的变量和字符串
proxy_cache_key
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
1
2
3
4
5
6
#默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存有数据要么限时等待锁释放;nginx 1.1.12才开始有
proxy_cache_lock
Syntax: proxy_cache_lock on | off;
Default: proxy_cache_lock off;
Context: http, server, location
#提示:This directive appeared in version 1.1.12.
1
2
3
4
5
6
#等待缓存锁超时之后将直接请求后端,结果不会被缓存 ; nginx 1.1.12才开始有
proxy_cache_lock_timeout
Syntax: proxy_cache_lock_timeout time;
Default: proxy_cache_lock_timeout 5s;
Context: http, server, location
#提示:This directive appeared in version 1.1.12.
1
2
3
4
5
#指定在多少次请求之后才缓存响应内容
proxy_cache_min_uses
Syntax: proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location
1
2
3
4
5
#指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存,比如proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_cache_use_stale
Syntax: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
Default: proxy_cache_use_stale off;
Context: http, server, location
1
2
3
4
5
#没有默认值,实例如proxy_cache_valid 200 302 10m,针对不同的response code设定不同的缓存时间,如果不设置code,默认为200,301,302,也可以用any指定所有code
proxy_cache_valid
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
1
2
3
4
5
6
7
8
9
10
11
12
13
#与Proxy cache有关的一项参数与配置,expires控制缓存生存期
expires
Syntax: expires [time|epoch|max|off]
Default: expires off
Context: http, server, location
#epoch:指定“Expires”的值为 1 January, 1970, 00:00:01 GMT。
#max:指定“Expires”的值为 31 December 2037 23:59:59 GMT,“Cache-Control”的值为10年。
#-1:指定“Expires”的值为 服务器当前时间 -1s,即永远过期
#“Cache-Control”头标的值由您指定的时间来决定:
#负数:Cache-Control: no-cache
#正数或零:Cache-Control: max-age = #, # 为您指定时间的秒数。
#"off":表示不修改“Expires”和“Cache-Control”的值
#提示:使用本指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标,(起到控制页面缓存的作用)。可以在time值中使用正数或负数。“Expires”头标的值将通过当前系统时间加上您设定的 time 值来获得。

3、生产配置详解

3.1、生产安装版本

平台 IP NGINX版本 安装模块
CentOS 6.7 64Bit 192.168.2.245 NGINX-1.12.1 naxsi\nginx-limit-upstream\nginx-upstream-jvm-route

3.2、NGINX生产配置

  • nginx主配置文件:/usr/local/nginx/conf/nginx.conf

    1
    2
    3
    4
    5
    proxy_cache_path /dev/shm/ngx_cache levels=1:2 keys_zone=cache_one:1m max_size=10m;
    #proxy_cache_path 缓存文件路径
    #levels 设置缓存文件目录层次;levels=1:2 表示两级目录
    #keys_zone 设置缓存名字和共享内存大小
    #max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源
  • 域名配置文件:/usr/local/nginx/conf/vhost_conf/wxejf123.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    location /jfpt {
    rewrite ^(.*)/template_abc_weixin/(.*)$ $1/template_weixins/$2 break;
    proxy_pass http://jfpt_load_balancing;
    include comproxy.conf;
    include /usr/local/nginx/conf/ccbejf.rules;
    access_log /usr/local/nginx/logs/ccbmob_access.log access;
    error_log /usr/local/nginx/logs/ccbmob_error.log;
    limit_except GET POST {
    deny all;
    }
    }
    location ~ /jfpt/.*\.(gif|jpg|png|css|js)$ {
    proxy_cache cache_one;.
    #使用名为cache_one的对应缓存配置
    proxy_cache_valid 200 304 12h;
    #对httpcode为200、304的缓存12小时
    proxy_cache_key $host$uri$is_args$args;
    #定义缓存唯一key,通过唯一key来进行hash存取
    expires 30d;
    #expires 指缓存过期时间为30天
    proxy_pass http://jfpt_load_balancing;
    }
  • 关于proxy.conf中的一项配置

    1
    2
    #控制缓存生存期,开启此配置默认会缓存所有内容
    add_header Cache-Control max-age=86400;
-------------本文结束感谢您的阅读-------------
LiGuanCheng wechat
如有问题,请与我微信交流或通过右下角“daovoice”与我联系~。
请我喝一杯咖啡~