Nginx 反向代理 proxy_cache 配置

本篇主要介绍一下 nginx 中 缓存 proxy_cache 的基本配置


1.概述

前面我们介绍过nginx 的动静分离, 就是把图片等资源直接放到nginx所在的服务器上, 需要把图片等资源手动迁移过去, 那使用nginx的时候 我们也可以动态的缓存后端返回的图片 css js 等等资源 , 也就是当访问一次后nginx就把这些资源缓存下来 实现动态的效果, 可以利用 nginx的 proxy_cache 配置

下面一起来看看吧


2.后端准备

简单起见 直接使用 thymeleaf来做模板引擎 , 虽然现在大部分是 前后端分离, 但是这种后端渲染的方式利于SEO 等,适合中小型项目


2.1 引入依赖thymeleaf

这里使用gradle 的方式, 可以选择maven

implementation("org.springframework.boot:spring-boot-starter-thymeleaf")


2.2 配置application.yaml

application.yaml 添加thymeleaf配置

spring:
thymeleaf:
  cache: false # 不缓存 方便调试 但是修改html后需要 build 一下项目才能体现!!
  prefix: classpath:/templates/   # 指定html模板文件在哪里


2.3 添加 templates 模板文件userinfo.html

在resources/templates/userinfo.html  添加一个 html模板文件, 使用 thymeleaf语法引入变量

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
   <title>title</title>
   <meta charset="UTF-8">
</head>
<body>
<h1 th:text="${info}"></h1>
<img  alt="headImage" th:src="${headimagepath}" th:width="200"  th:height="200"/>
</body>

</html>


2.4 添加 static  静态图片

Nginx 反向代理 proxy_cache 配置


2.5 后端接口返回 thymeleaf html

返回html的名称并且绑定好 2个数据,供thymeleaf 里使用 , 我这里用的是kotlin , 用你熟悉的java 写法一样的

@Controller
class UserInfoController {

   @GetMapping("/userinfo")
   fun userInfo(model:ModelMap):String{
       //注意默认前面会去 classpath/static/ 下面寻找 所以这里直接写 /img/head.jpg
       model.addAttribute("headimagepath","/img/head.jpg")
       model.addAttribute("info","头像")
       return "userinfo"
  }
}


2.6 访问测试

可以看到 html 已经渲染成功了

Nginx 反向代理 proxy_cache 配置


3. Nginx proxy_cache 配置

前面是后端的一些准备工作 ,下面来看看 如何利用 nginx proxy_cache 来缓存上面后端返回的图片资源


3.1 配置proxy_cache


http {
   # ...省略
   upstream backend {
     # 后端服务
     server 172.16.225.1:8899;
  }
   # 配置缓存的一些规则 路径等等 注意在 http 模块 keys_zone 相当于一个标识名称,给下面引用的, levels:目录的字母数
   # inactive=1d 1天会自动清理
   # max_size: 表示最大磁盘占用空间
   proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g ;
   server {
       listen       80;
       server_name localhost;

       #charset koi8-r;

       location / {
           # 添加一个header 方便浏览器上查看是否已经缓存
           add_header  Nginx-Cache "$upstream_cache_status";
           # 这里引用上面的 定义
           proxy_cache test_cache;
           # 这个一定要配置 如果只配置上面的 不生效的, 表示缓存的有效期
   proxy_cache_valid 168h;
           proxy_pass http://backend;
      }

       #error_page 404             /404.html;
       # redirect server error pages to the static page /50x.html
       #
       error_page   500 502 503 504 /50x.html;
       location = /50x.html {
           root   html;
      }

  }
  • add_header  Nginx-Cache "$upstream_cache_status";  把缓存状态返回到响应头去

  • proxy_cache_path: 配置缓存的一些规则 路径 等等

  • proxy_cache test_cache : 引用上面定义的 keys_zone

  • proxy_cache_valid 168h :  表示缓存的有效期 , 这个一定要配置 如果只配置上面的 不生效的


3.2 实验测试

第一次访问 可以看到 MISS 状态 就是未命中缓存

Nginx 反向代理 proxy_cache 配置


第二次访问已经可以看到 是 HIT命中状态

Nginx 反向代理 proxy_cache 配置


再来看看 上面配置的缓存路径下面有什么

如果没有 tree 命令则 yum -y install tree  

可以看到 已经缓存了2个文件 一个是后端返回html 一个是html中引用的 jpg 图片

Nginx 反向代理 proxy_cache 配置



直接把后端的资源文件删除看看 或者直接把后端项目直接停了..

Nginx 反向代理 proxy_cache 配置


*可以看到并不影响 还是能够访问 , 说明确实走的是 nginx 的缓存**

Nginx 反向代理 proxy_cache 配置




4. 扩展 proxy_cache_key

找到html的缓存内容可以看到 有个KEY:表示这个默认的 proxy_cache_key 这个是可以配置的, 可以配置用什么去作为key 缓存, 默认$scheme$proxy_host$request_uri 其实这里有个问题 因为默认的key 带 scheme 就是http和https 还有 proxy_host 这些当 http 和 https 两个访问的时候 会导致2次请求并且缓存2分相同数据, 因为key不同 但是内容相同, 这个肯定是不希望看到的, 可以只定义 proxy_cache_key 是uri 后缀即可

Nginx 反向代理 proxy_cache 配置



总结

本篇主要介绍了Nginx 的proxy_cache 的相关配置, cache模块是nginx发行版已经编译进去的 不用额外添加模块

从后端准备到nginx的配置 全套带你了解如何配置和实验,这对于一些场景优化还是有好处的


原文始发于微信公众号(Johnny屋):Nginx 反向代理 proxy_cache 配置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/105578.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!