专栏首页运维录Nginx 缓存服务器(下)

Nginx 缓存服务器(下)

上一节讲解了在那些场景下使用 Nginx Cache服务器,以及如何配置、调试 Nginx Cache功能,需要的可以看这里,这一节讲一讲 Nginx Cache服务器在使用中经常遇到的一些问题。 第一个问题 我们自定义了 Nginx日志格式,并添加了 $upstream_cache_status变量,可以在日志查看请求的资源是否命中缓存。 例如 nginx日志: 10.42.248.154 - 省略... - MISS 0.004 表示请求没有命中缓存,请求由上游服务器负责返回响应,花费 0.004秒。 但是我们不可能时时刻刻的登录后台查日志,如果请求结果中带有缓存状态信息那就方便了,其实在 CDN中都是带有缓存状态信息的,幸运的是在 Nginx可以很方便的添加一个http 头信息。 第二个问题 缓存更新问题,由于在用户端(浏览器) 与 服务器端(App) 添加了代理缓存层(Nginx), 浏览器强制刷新的功能因为加入代理缓存层失效,举个例子: 用户端访问 http://demo.com/css/ui/test.css 资源,命中 Nginx Cache服务器 Expires时间为5天,但是前端小伙伴在缓存期间调整了 test.css样式文件,那么当用户再次访问 test.css 仍然获得是旧的数据(Nginx Cache认为没有过期),所以我们需要能够主动清理/更新缓存的功能,同样幸运的是 Nginx提供了 ngx_cache_purge 第三方模块可以解决这个问题。

目标

好了梳理一下问题,要完成的目标有两个。 1. 为 nginx cache 添加 X-Cache-Status http头部信息,用于调试时直接输出缓存状态信息。 2. 为 nginx cache 添加 ngx_cache_purge 模块,用于主动清理缓存的数据。

环境

1. 软件版本 Docker 版本 18.09.5 nginx 镜像版本 nginx:1.14-alpine nginx 容器(镜像)操作系统版本 Alpine Linux 3.9 2. 系统架构 仍然同 Nginx 缓存服务器(上) 相同

添加 X-Cache-Status http头部信息

1. 配置文件

cat default.conf server { listen 80; server_name localhost; location / { proxy_pass http://demo-web:8080; ...其它配置项省略 add_header X-Cache-Status $hostname,$upstream_cache_status; } }

2. 检查并重启

nginx -t && nginx -s reload

3. 测试

注意红框, HIT(命中缓存) / 2f03e9cb7353 (对应 $hostname变量为主机名)。 4. $upstream_cache_status 变量含义 HIT 响应包含来自缓存的最新有效的内容。 MISS 响应在缓存中找不到,所以需要在服务器中取得。 BYPASS 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass 这个响应之后可能会被缓存。 EXPIRED 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容。 STALE 内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale。 REVALIDATED Nginx 检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match ),需要配置 proxy_cache_revalidate 。

添加 ngx_cache_purge 模块

1. 安装模块

# apk add nginx-mod-http-cache-purge (1/2) Installing nginx (1.14.2-r1) Executing nginx-1.14.2-r1.pre-install (2/2) Installing nginx-mod-http-cache-purge (1.14.2-r1) Executing busybox-1.29.3-r10.trigger OK: 16 MiB in 31 packages

模块安装路径: /usr/lib/nginx/modules/ngx_http_cache_purge_module.so 2. 配置模块 # 使用前需要加载模块,在配置文件首行前添加.

sed -i '1 i \load_module /usr/lib/nginx/modules/ngx_http_cache_purge_module.so;' /etc/nginx/nginx.conf

# server 字段配置项

cat /etc/nginx/conf.d/default.conf server { #... 其它配置项省略 location / { proxy_pass http://demo-web:8080; # ...其它配置项省略 add_header X-Cache-Status $hostname,$upstream_cache_status; } location ~ /purge(/.*) { allow 127.0.0.1; deny all; proxy_cache_purge proxyCache $1$is_args$args; } }

# 参数 allow deny 表示只允许本机访问,可以根据实际情况调整或者添加多个 allow。 proxy_cache_purge 表示使用名为 proxyCache的对应缓存配置,并清理 /purge/ 目录后附带的url路径(见图3删除缓存)。 # 重启服务

nginx -t && nginx -s reload

3. 清理缓存 还是以 test.css 为例,X-Cache-Status: 2f03e9cb7353,HIT 状态为 HIT 既命中缓存。

删除缓存,访问本机 /purge/目录 + 要删除缓存资源的 url 路径 。(图中命令行为 rancher控制台)

再次访问,X-Cache-Status: 2f03e9cb7353,MISS 状态为MISS 说明删除缓存成功。 注意,last-modified 与 etag 两次返回的结果不同 ,因为更新 test.css文件后它们发生了改变。

结束

写到这里我们已经完成了目标,不过有一个小瑕疵为了方便演示 proxy_cache_purge 设置 allow 127.0.0.1 也就是只允许本机进行 purge操作,外网是无法操作的,所以这里留个作业: 再添加一个信任的 IP地址,允许其进行 purge操作。

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​创建一个Docker 容器

    之前公众号发布了三篇关于Docker镜像与仓库的文章,如果需要阅读可以在微信公众号后台回复 镜像 获得文章链接,接下来让我们创建第一个容器。

    用户1560186
  • Nginx 缓存服务器(上)

    1. 如果你的 web应用支持使用动态CDN(全站)直接加速,那么你可能不需要 Nginx Cache功能。 2. 如果你的 web应用有专用的静态服务器(CD...

    用户1560186
  • 如何为Nginx 配置防盗链功能?

    referer 请求头包含了当前请求页面的来源地址,即表示当前页面是通过这个来源页面里的链接进入的。

    用户1560186
  • Cache 功能、映射方法

    cache是一种高速缓冲寄存器,是为解决CPU和主存之间速度不匹配而采用的一项重要技术。

    week
  • 一篇文章让你明白CPU缓存一致性协议MESI

    CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算...

    程序员追风
  • Progressive Web Apps

    一种提升Web用户体验的方式。除了Web天生的(便捷)体验外,还有3个特点:Reliable, Fast, Engaging

    ayqy贾杰
  • ABP从入门到精通(3):aspnet-zero-core 使用Redis缓存

    晓晨
  • 在Hibernate中,使用二级缓存机制要注意什么?

    qubianzhong
  • Redis缓存,持久化,高可用

    Redis 作为缓存服务器是众多企业中的选择之一,虽然该技术很成熟但也是存在一定的问题。就是缓存带来的缓存穿透,缓存击穿,缓存失效问题,继而引用分布式锁。

    业余草
  • 原码、补码及反码

    一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。

    Yif

扫码关注云+社区

领取腾讯云代金券