入口 nginx 缓存

2023-11-26

我试图弄清楚如何使用 nginx 代理缓存和一些特定的规则。例如,当我托管 Ghost 或 Wordpress 时,我不想缓存管理部分。使用服务器片段,我尝试了很多不同的组合,但管理部分的缓存仍然存在问题。

nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/server-snippet: |-
  proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
  proxy_ignore_headers Set-Cookie;
  proxy_cache app_cache;
  proxy_cache_lock on;
  proxy_cache_valid any 30m;
  add_header X-Cache-Status $upstream_cache_status;

我想在管理区域中使用 (ghost|sinout) 路径的 nginx 代码片段来绕过缓存,但我丢失了 proxy_pass 上下文,导致 502 错误网关。

这是当前缓存每个页面的入口配置,还有管理路径:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/server-snippet: |-
      proxy_cache my_blog_cache;
      proxy_cache_lock on;
      proxy_cache_valid any 30m;
      add_header X-Cache-Status $upstream_cache_status;
      proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
  name: my-blog
  namespace: web
spec:
  rules:
  - host: blog.example.com
    http:
      paths:
      - backend:
          serviceName: ingress-541322b8660dbd2ceb1e8ff1813f0dd5
          servicePort: 2368
        path: /
  tls:
  - hosts:
    - blog.example.com
    secretName: my-blog-cert
status:
  loadBalancer:
    ingress:
    - ip: 1.2.3.4

这是我试图获取但与入口注释不兼容的 nginx 配置:

   location / {
        proxy_cache my_blog_cache;
        proxy_cache_valid 200 30m;
        proxy_cache_valid 404 1m;
        proxy_pass http://ghost_upstream;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
        proxy_ignore_headers Set-Cookie;
        proxy_hide_header Set-Cookie;
        proxy_hide_header X-powered-by;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        expires 10m;
    }
    location /content/images {
        alias /path/to/ghost/content/images;
        access_log off;
        expires max;
    }
    location /assets {
        alias /path/to/ghost/content/themes/uno-master/assets;
        access_log off;
        expires max;
    }
    location /public {
        alias /path/to/ghost/core/built/public;
        access_log off;
        expires max;
    }
    location /ghost/scripts {
        alias /path/to/ghost/core/built/scripts;
        access_log off;
        expires max;
    }
    location ~ ^/(?:ghost|signout) { 
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://ghost_upstream;
        add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0";
    }

感谢您的帮助 !


我有完全相同的愿望:缓存 Ghost 响应Cache-Control标头直接位于 Kubernetes 集群中的 Nginx Ingress 上。

经过几个小时的研究,这是我的解决方案:

第一步

首先,您需要定义proxy_cache_path在 Nginx Ingress 上ConfigMap level(文档确实不清楚如何应用它)。

就我而言,我通过 Helm 管理 Nginx Ingress 安装,因此我已将其添加到 Helm 值图表中:

# Default values https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml
controller:
  config:
    http-snippet: "proxy_cache_path /tmp/nginx_my_cache levels=1:2 keys_zone=mycache:2m use_temp_path=off max_size=2g inactive=48h;"

然后应用此更改:

helm upgrade -f my-nginx-ingress-values.yaml ingress-nginx ingress-nginx/ingress-nginx --recreate-pods

第二步

现在我们有了proxy_cache_path设置后,我们需要使用注释为特定主机配置 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  namespace: mynamespace
  annotations:
    kubernetes.io/ingress.class: "nginx"
    # Buffering must be enabled for Nginx disk cache to work.
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    # See https://www.nginx.com/blog/nginx-caching-guide/
    # Cache Key Zone is configured in Helm config.
    nginx.ingress.kubernetes.io/server-snippet: |
      proxy_cache mycache;
      proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
      proxy_cache_background_update on;
      proxy_cache_revalidate on;
      proxy_cache_lock on;
      add_header X-Cache-Status $upstream_cache_status;

Note:

我花了大部分时间来弄清楚为什么我仍然得到MISSes.原来是因为nginx.ingress.kubernetes.io/proxy-buffering Ingress 中的默认值off— 这会禁用 Nginx 缓存,因此您have将其设置为on这就是我们所做的。

将更改应用到 Ingress。

调试 Nginx 配置结果

我认为你可以而且应该验证结果nginx.conf用于应用后生成的 IngressConfigMap和入口级注释。

为此,您可以复制nginx.conf从 Ingress Controller pod 到本地计算机并验证其内容(或exec进入 pod 并在那里看到它):

# Make sure to use correct namespace where Ingress Controller is deployed
# and correct Ingress Controller Pod name
kubectl cp -n default ingress-nginx-controller-xxxx:/etc/nginx/nginx.conf ~/Desktop/nginx.conf

它应该包含我们所做的所有更改!

调试实际响应缓存

现在我们已经配置好了所有内容 - 是时候验证实际的缓存了。请注意,我们已经添加了X-Cache-Status标头将指示它是否是HIT or MISS.

我个人喜欢httpie对于来自终端的 HTTP 请求,您可以使用curl或浏览器:

第一个请求将是MISS:

http https://example.com/myimage.jpg
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: public, max-age=31536000
Connection: keep-alive
Content-Length: 53588
Content-Type: image/jpeg
Date: Wed, 20 Oct 2021 10:39:06 GMT
ETag: W/"d154-17c3aa43389"
Last-Modified: Fri, 01 Oct 2021 06:56:52 GMT
Strict-Transport-Security: max-age=15724800; includeSubDomains
X-Cache-Status: HIT
X-Powered-By: Express
X-Request-ID: 0c73f97cb51d3071f14968720a26a99a

+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+

对同一 URL 的第二个请求现在是HIT并且没有碰到实际的Ghost安装,成功!

http https://example.com/myimage.jpg
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: public, max-age=31536000
Connection: keep-alive
Content-Length: 53588
Content-Type: image/jpeg
Date: Wed, 20 Oct 2021 10:39:43 GMT
ETag: W/"d154-17c3aa43389"
Last-Modified: Fri, 01 Oct 2021 06:56:52 GMT
Strict-Transport-Security: max-age=15724800; includeSubDomains
X-Cache-Status: HIT
X-Powered-By: Express
X-Request-ID: 0c73f97cb51d3071f14968720a26a99a

+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+

验证 Ghost 上的日志也很有用,可以仔细检查缓存命中请求实际上是直接从 Nginx 提供的,并且从未命中 Ghost。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

入口 nginx 缓存 的相关文章

随机推荐

  • 如何创建打开呼叫日志活动的 Intent?

    我想创建一个 Intent 打开显示当前设备通话记录的屏幕 我如何指定这样的意图 Barmaley 引导我找到了正确的路径 我将类型设置为 Calls ContentType Intent showCallLog new Intent sh
  • Terraform 启用 VM Insights

    有人设法通过 terraforms Insights 为虚拟机启用吗 我能够创建虚拟机 启用日志记录 但无法启用见解 我见过这个问题 但没有找到明确的答案 如何使用 terraform 启用 azure vm application Ins
  • 如何设置 NSExtensionActivationRule 谓词?

    Even 人们比我聪明得多找到语法NSExtensionActivationRule神秘 但即使是像我这样的傻瓜也应该能够复制 粘贴示例 不是吗 不幸的是我什至无法得到苹果的例子上班 当您点击共享表按钮 下面的堆栈跟踪 时 我的操作扩展的主
  • 如何在 JavaScript 更改后重绘 SVG(Internet Explorer 和 Edge)

    有谁知道如何在更改内容后强制 IE 和 Edge 显示 刷新嵌入的 SVG 请参阅下面的代码
  • 如何杀死多进程中的所有池工作人员?

    我想停止单个工作人员的所有线程 我有一个有 10 个工作线程的线程池 def myfunction i print i if i 20 sys exit p multiprocessing Pool 10 init worker for i
  • 所有示例并发.futures 代码均因“BrokenProcessPool”而失败

    在创建我需要的实际应用程序之前 我试图对此有一个基本的了解 我最近从 2 7 升级到 3 3 直接复制粘贴这段代码来自 python 文档失败了 一个稍微简单的例子也是如此here 这是我的代码 源自第二个示例 import concurr
  • 通过属性版本控制在 Swagger 中利用 MultipleApiVersions

    使用属性路由时是否可以在 Swagger UI Swashbuckle 中利用 MultipleApiVersions 具体来说 我通过以下方式实现了版本控制 using System Web Http namespace RESTServ
  • Subversion - 始终使用我的解决一组文件的冲突

    我们在 subversion 中保留了大量自动生成的代码 有时我正在处理发电机的一个部件 而另一个同事正在处理发电机的另一个部件 我们中的一个人签到 另一个人得到最新的信息 现在我们生成的代码存在冲突 因为它是生成的 所以下次生成器运行时它
  • 获取总和最大的子矩阵?

    Input 二维数组 NxN 矩阵 具有正数和负数元素 Output 任意大小的子矩阵 其总和是所有可能的子矩阵中的最大值 要求 算法复杂度为O N 3 History 在算法师 Larry 的帮助下以及对 Kadane 算法的修改 我成功
  • java中查找字符串的所有大写字母

    所以我试图找到用户输入的字符串中的所有大写字母 但我不断收到此运行时错误 Exception in thread main java lang StringIndexOutOfBoundsException String index out
  • 删除特定匹配后的所有字符

    我正在使用 Notepad 从模式末尾删除一些不需要的字符串 这对我来说已经是我的生活了 我有以下几组字符串 myApp ComboPlaceHolderLabel myApp GridTitleLabel myApp SummaryLab
  • 使用 importlib 动态导入包含相对导入的模块

    我试图弄清楚如何以编程方式执行包含相对导入的模块 伪代码 spec importlib util spec from file location name path mod importlib util module from spec s
  • Xcode 和 XIB 自我文档 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有一个工具可以记录许多 Xcode 绑定 插座和IBAction绑定 键值绑定等 我看过以下主题Doxygen and 标题文档 但是这些文档程
  • 如何使用FirefoxProfile通过Firefox浏览器自动下载?

    我正在使用 selenium java 我需要下载 pdf 文件 我提到this this并且this答案在这里 但似乎在我的情况下没有任何效果 是否是由于设置了新的 Firefox 驱动程序实例 即System setProperty w
  • 有没有办法在 Visual Studio 中的 F# 中发出阴影值警告?

    对我来说 现有价值观的阴影如下所述 阴影和嵌套函数 F 中不可变 f 重复定义 FSharp 好玩又赚钱的评论 似乎违背了使 F 如此强大的不变性和类型安全的概念 F 中的阴影工作不同的比在 C 中 我花了相当长的时间才发现我的代码中的错误
  • 在 Haskell 中检索文件大小的 hFileSize 更快替代方案?

    我想知道如何以最少的开销获取 haskell 中文件的大小 现在我有以下代码 getFileSize FilePath gt IO Integer getFileSize x do handle lt openFile x ReadMode
  • PHP 数组的平均时间

    如何从一组时间中计算出平均时间 我有一个看起来像这样的数组 17 29 53 16 00 32 我希望达到这个结果16 45 12使用 PHP date H i s array sum array map strtotime array c
  • 如何在 Google Chrome 中查看 HTTP 标头?

    在 9 x 之前 标题位于开发人员工具中的资源下 但现在我在任何地方都找不到它 我不确定您的确切版本 但 Chrome 有一个 网络 选项卡 其中包含多个项目 当我单击它们时 我可以在选项卡右侧看到标题 Press F12 on windo
  • 我成功地从 C# 调用了 advapi32 的 LsaEnumerateAccountRights()。现在如何解组它返回的 LSA_UNICODE_STRING 数组?

    它是一个指向数组的指针LSA UNICODE STRING结构 我发现一些代码可以做相反的事情 即创建一个LSA UNICODE STRING来自 C 字符串 您可以在下面的帮助程序代码部分中看到这一点 我正在做什么 包括打电话给LsaEn
  • 入口 nginx 缓存

    我试图弄清楚如何使用 nginx 代理缓存和一些特定的规则 例如 当我托管 Ghost 或 Wordpress 时 我不想缓存管理部分 使用服务器片段 我尝试了很多不同的组合 但管理部分的缓存仍然存在问题 nginx ingress kub