【问题标题】:Bypass nginx cache if user is authenticated Django如果用户已通过身份验证 Django,则绕过 nginx 缓存
【发布时间】:2017-04-09 20:35:02
【问题描述】:

我正在实现 nginx 作为 Django 项目的反向代理。我现在正在尝试在下面实现 nginx 的缓存配置:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:5m max_size=1g inactive=60m;
proxy_temp_path /var/cache/nginx/tmp;

server {
  ...

  location / {
     proxy_pass http://127.0.0.1:8000;
     proxy_set_header Host $host;
     proxy_set_header X-Forwarded-Host $server_name;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';

     # cache
     proxy_cache my_cache;
     proxy_cache_min_uses 1;
     proxy_cache_valid 200 302 10m;
     proxy_cache_valid 404 1m;
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
     proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_cache_lock on;

     proxy_hide_header "Set-Cookie";

     add_header X-Proxy-Cache $upstream_cache_status;
  }
}

一切都很好,但是我希望它使经过身份验证的用户能够绕过缓存,否则当他们更新站点内容时,他们将看不到更改,只会看到缓存的内容,直到它过期。

解决这个问题的最佳方法是什么?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 缓存动态内容几乎总是一个坏主意
  • 该站点不是非常动态的,只是在管理员中进行更新时,进行修改的用户将无法查看更新,直到缓存过期(或者如果他们在 url 栏中输入 nocache)。
  • 您每天获得多少页面浏览量

标签: django caching nginx


【解决方案1】:

添加一个中间件来设置cookie(例如cachedisable),如果用户被认证,则删除该cookie。这样你就可以把$cookie_ cachedisable放到nginx conf中

location / {
    proxy_cache_bypass $cookie_cachedisable $arg_nocache;
    ...
}

只要你想绕过缓存,就做类似的请求

http://www.example.com/?nocache=true #or if cookie `cachedisable` is present 

欲了解更多信息https://www.nginx.com/blog/nginx-caching-guide/?utm_source=nginx-caching-guide&utm_medium=blog#caching-guide-faq-hole-punch

【讨论】:

  • 感谢您的帮助,我知道您可以使用查询字符串来绕过缓存,但是用户必须记住在更改某些内容时添加查询字符串并不是很理想。我希望有一个更自动化的解决方案
  • 如果这是 nginx 唯一可行的解​​决方案,是否有办法在 Django 中使用一些中间件,如果用户通过身份验证,它总是添加查询字符串。谢谢
  • 在 django 默认情况下,经过身份验证的用户会有sessionid。您可以将$cookie_nocache 更改为$cookie_sessionid。在查询字符串中不需要cache=true。简而言之,您可以通过查询字符串或cookie绕过nginx缓存。
  • 我刚刚尝试了您的解决方案,但不幸的是它不起作用。没有任何东西被缓存:(我试过proxy_cache_bypass $cookie_sessionid;proxy_cache_bypass $cookie_sessionid $arg_nocache;
  • 我会告诉一个解决方案,添加一个中间件来设置cookie(例如'cachedisable')作为响应,如果用户被认证,否则删除那个cookie。这样你就可以把$cookie_ cachedisable放到nginx conf中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2018-03-11
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多