Nginx 不仅仅是一个 Web 服务器,它还可以作为一个缓存服务器使用。通过 Nginx 缓存,可以对一些静态资源或者数据更新频率较低的后端服务做缓存,降低静态资源或后端服务的响应时间,同时也会降低后端的负载。
nginx配置缓存的优点:
可以在一定程度上,减少服务器的处理请求压力。比如对一些图片,css或js做一些缓存,那么在每次刷新浏览器的时候,就不会重新请求了,而是从缓存里面读取。这样就可以减轻服务器的压力。
修改 Nginx 配置文件,在 http 上下文中使用 proxy_cache_path 指令创建 keys zone,即创建一块共享内存空间,用于存储缓存数据的 active key;同时,指定一个目录,用于存储缓存的数据。
在 http、server、location 上下文中,使用 proxy_cache 指令,指定要使用的 keys zone。
在 http、server、location 上下文中,使用 proxy_cache_valid 指令,指定针对哪些返回码的响应做缓存,以及缓存多长时间。
语法:proxy_cache zone | off ; # zone 是共享内存的名称 默认值:proxy_cache off; 上下文:http、server、location proxy_cache_path 设置缓存文件的存放路径。 语法:proxy_cache_path path [level=levels] ...可选参数省略,下面会详细列举 默认值:proxy_cache_path off 上下文:http 参数含义: path 缓存文件的存放路径; level path 的目录层级; keys_zone 设置共享内存; inactive 在指定时间内没有被访问,缓存会被清理,默认10分钟; proxy_cache_key 设置缓存文件的 key 。 语法:proxy_cache_key 默认值:proxy_cache_key $scheme$proxy_host$request_uri; 上下文:http、server、location proxy_cache_valid 配置什么状态码可以被缓存,以及缓存时长。 语法:proxy_cache_valid [code...] time; 上下文:http、server、location 配置示例:proxy_cache_valid 200 304 2m;; # 说明对于状态为200和304的缓存文件的缓存时间是2分钟 proxy_no_cache 定义相应保存到缓存的条件,如果字符串参数的至少一个值不为空且不等于“ 0”,则将不保存该响应到缓存。 语法:proxy_no_cache string; 上下文:http、server、location 示例:proxy_no_cache $http_pragma $http_authorization; proxy_cache_bypass 定义条件,在该条件下将不会从缓存中获取响应。 语法:proxy_cache_bypass string; 上下文:http、server、location 示例:proxy_cache_bypass $http_pragma $http_authorization; upstream_cache_status 变量 它存储了缓存是否命中的信息,会设置在响应头信息中,在调试中非常有用。 MISS: 未命中缓存 HIT: 命中缓存 EXPIRED: 缓存过期 STALE: 命中了陈旧缓存 REVALIDDATED: Nginx验证陈旧缓存依然有效 UPDATING: 内容陈旧,但正在更新 BYPASS: X响应从原始服务器获取
http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; ##################################################### ●path:强制参数,指定缓存文件的存放路径。 ●levels:定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最多256种选择,00-ff)表示,中间用 : 分隔。 proxy_cache_path /data/nginx/cache; 代表所有缓存只有一个目录,比如/data/nginx/cache/d7b6e5978e3f042f52e875005925e51b proxy_cache_path /data/nginx/cache levels=1:2; 代表缓存是二层目录(有16*256=4096个目录),比如/data/nginx/cache/b/51/d7b6e5978e3f042f52e875005925e51b ●keys_zone:强制参数,定义共享内存区的名称和大小,该共享内存用于保存缓存项目的元数据(所有活动的key和缓存数据相关的信息),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key。 ●inactive:删除指定时间内未被访问的缓存文件,默认10分钟。 ●max_size:设置了缓存存储的上限,如果不指定,最大会用掉所有磁盘空间。 ●use_temp_path:直接把临时文件放在缓存目录中。 ##################################################### upstream cache_server{ server 192.168.80.20:80; server 192.168.80.30:80; } server { listen 80; server_name www.kgc.com; location / { proxy_cache my_cache; #指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义 proxy_cache_valid 200 5m; #为不同的响应状态码设置不同的缓存时间,此为缓存状态码为200的请求,缓存时长为5分钟 proxy_cache_key $request_uri; #指定缓存文件的key为请求的URI add_header Nginx-Cache-Status $upstream_cache_status #把缓存状态设置为头部信息,响应给客户端 proxy_pass http://cache_server; #设置代理转发的后端服务器的协议和地址 } } } #对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; server_name cache.lion.club; #URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache" if ($request_uri ~ \.(txt|text)$) { set $cache_name "no cache" } location / { proxy_no_cache $cache_name; #判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存 proxy_cache my_cache; #设置缓存内存 proxy_cache_valid 200 5m; #缓存状态为200的请求,缓存时长为5分钟 proxy_cache_key $request_uri; #缓存文件的key为请求的URI add_header Nginx-Cache-Status $upstream_cache_status #把缓存状态设置为头部信息,响应给客户端 proxy_pass http://cache_server; #代理转发 } }