AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 30705
Accepted
Continuation
Continuation
Asked: 2009-06-24 17:35:45 +0800 CST2009-06-24 17:35:45 +0800 CST 2009-06-24 17:35:45 +0800 CST

如何将 Nginx 设置为缓存反向代理?

  • 772

我最近听说 Nginx 在其反向代理功能中添加了缓存。我环顾四周,但找不到太多关于它的信息。

我想将 Nginx 设置为 Apache/Django 前面的缓存反向代理:让 Nginx 代理请求一些(但不是全部)动态页面到 Apache,然后缓存生成的页面并从缓存中为这些页面提供后续请求。

理想情况下,我想以两种方式使缓存无效:

  1. 设置缓存项的到期日期
  2. 显式地使缓存项无效。例如,如果我的 Django 后端更新了某些数据,我想告诉 Nginx 使受影响页面的缓存无效

是否可以设置 Nginx 来做到这一点?如何?

proxy nginx varnish reverse-proxy
  • 13 13 个回答
  • 174279 Views

13 个回答

  • Voted
  1. Best Answer
    outcassed
    2009-09-24T12:01:54+08:002009-09-24T12:01:54+08:00

    我不认为有一种方法可以显式地使缓存项无效,但这里有一个如何做其余部分的示例。更新:正如 Piotr 在另一个答案中提到的,您可以使用一个缓存清除模块。您还可以使用 nginx 的 proxy_cache_bypass 强制刷新缓存项目 - 有关更多信息,请参阅Cherian 的答案。

    在此配置中,未缓存的项目将从 example.net 检索并存储。缓存的版本将提供给未来的客户端,直到它们不再有效(60 分钟)。

    您的 Cache-Control 和 Expires HTTP 标头将受到尊重,因此,如果您想明确设置到期日期,您可以通过在您要代理的任何内容中设置正确的标头来实现。

    您可以调整很多参数 - 请参阅 nginx 代理模块文档以获取有关所有这些的更多信息,包括有关不同设置/参数含义的详细信息:http: //nginx.org/r/proxy_cache_path

    http {
      proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
      proxy_temp_path /var/www/cache/tmp; 
    
    
      server {
        location / {
          proxy_pass http://example.net;
          proxy_cache my-cache;
          proxy_cache_valid  200 302  60m;
          proxy_cache_valid  404      1m;
        }
      }
    }
    
    • 99
  2. Cherian
    2011-11-26T20:00:25+08:002011-11-26T20:00:25+08:00

    您可以通过以下方式专门使缓存页面无效

    proxy_cache_bypass       
    

    假设你要缓存一个页面,这样设置缓存

    location = /pageid {
      proxy_pass http://localhost:82;
      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_ignore_headers Set-Cookie; 
      proxy_ignore_headers Cache-Control; 
      proxy_cache_bypass        $http_secret_header;
      add_header X-Cache-Status $upstream_cache_status;
    }
    

    现在,当您想使该页面无效并再次缓存时

    使用标题进行秘密 curl 调用

    curl "www.site.com/pageid" -s -I -H "secret_header:true" 
    

    它将使其无效并缓存。

    从 nginx 0.7 开始工作。

    作为一个额外的好处,add_header X-Cache-Status可以用来检查页面是否来自缓存。

    • 49
  3. Dave Cheney
    2009-06-24T18:43:02+08:002009-06-24T18:43:02+08:00

    我建议你试试Varnish 。Varnish 专门设计为反向代理缓存。它将尊重您从原始服务器发送的所有缓存控制标头,以满足您的第一个请求。

    对于您的第二个请求,显式无效。我的强烈建议是通过重命名文件或使用某种形式的查询字符串缓存破坏器来更改要使资源无效的 url 的名称。Varnish 确实有一个PURGE操作可以从 Varnish 的缓存中删除资源,但它不会让您控制您和用户之间的任何其他缓存。正如您所说,您想显式清除资源,那么标准的 http 控制标头对您没有帮助。在这种情况下,打败资源缓存的最简单的方法是重命名它。

    • 38
  4. Randy Wallace
    2012-04-11T15:02:24+08:002012-04-11T15:02:24+08:00

    大多数缓存工具 (Citrix) 允许强制刷新 (Ctrl+r) 重新填充缓存页面。

    这是我发现在 nginx 中做类似事情的一个技巧。

    server  {
            # Other settings
            proxy_pass_header       Set-Cookie; # I want to cache logged-in users
            proxy_ignore_headers    X-Accel-Redirect;
            proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
            if ($http_cache_control ~ "max-age=0") {set $eac 1;}
            proxy_cache_bypass $eac;
    }
    

    这假定当您在浏览器中执行 Ctrl+r 时,Cache-Control 标头在其请求中具有 max-age=0。我知道 Chrome 会这样做,但我没有在其他浏览器中尝试过。添加更多标题字段很容易,只需添加更多将$eac变量设置为 1 的 if 语句。

    • 10
  5. Piotr Sikora
    2009-11-17T23:38:50+08:002009-11-17T23:38:50+08:00

    为了使所选页面无效,您可以使用 nginx-0.8.x 的“cache_purge”补丁,这正是您想要的;)

    它在这里可用。

    • 8
  6. SaveTheRbtz
    2009-06-24T18:25:22+08:002009-06-24T18:25:22+08:00

    缓存是 nginx 中相当新的功能(目前还没有很好的文档记录),但足够稳定,可以在生产中使用。

    • 使用英文文档

    • 在邮件列表中询问

    • 用谷歌翻译之类的东西翻译俄语文档

    • 使用清漆

    • 5
  7. Taras Chuhay
    2009-06-25T02:12:59+08:002009-06-25T02:12:59+08:00

    我相信NginxHttpProxyModule能够缓存 http 请求。查找以以下开头的指令:

    proxy_cache
    

    是的,可以通过以下指令控制缓存行为:

    proxy_cache_valid
    
    • 4
  8. womble
    2009-06-24T17:38:12+08:002009-06-24T17:38:12+08:00

    基于你在上面找不到文档的事实,我会对在生产中依赖它有点警惕。你考虑过清漆吗?这是我的“反向代理的 nginx”,小巧轻便,做一项工作并且做得很好。

    • 3
  9. Martin Murphy
    2009-11-17T07:20:01+08:002009-11-17T07:20:01+08:00

    如果您在应用程序上使用 eTag 并将 nginx 放在其前面,那么它将为您处理到期,因为如果 eTag 更改,它将使缓存无效。

    • 2
  10. czerasz
    2015-04-01T10:06:34+08:002015-04-01T10:06:34+08:00

    您可以使用多个指令/参数控制 Nginx 的缓存过期:

    • proxy_cache_valid 200 302 10m;
    • 添加下面的 HTTP 标头之一(优先级很重要 - 查看我的博客文章):
      • Expires
      • Cache-Control
      • X-Accel-Expires
    • inactive指令中的参数proxy_cache_path:

      proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

    如果您想了解有关 Nginx 缓存的更多信息,我推荐我的博客文章。

    清除主题非常有趣,因为此功能仅存在于 Nginx Plus(Nginx 的商业版)中。我真的很喜欢@randy-wallace 的回答。但还有其他可能性,例如ngx_cache_purge 模块。

    您可以做的最简单的事情是手动删除缓存文件:

    • 生成您的哈希键:

      echo -n ‘httpczerasz.com/time.php’ | md5sum
      
    • 从文件系统中删除文件:

      rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
      
    • 2

相关问题

  • 使用Passenger时使用Nginx over Apache with Rails的优缺点是什么

  • 当公司网络被锁定时,如何在公司网络中下载可执行文件?

  • 外部托管的代理服务器作为内部 HTTP 服务器的前端

  • 使用 IIS7 请求路由和负载平衡模块进行负载平衡

  • 阿帕奇的替代品

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve