微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使代理重新validation来源的资源

我有一个Nginx反向代理与我的原始服务器在同一台机器上。 我希望代理caching来源的dynamic内容,但是当客户端重新validation资源时,我希望代理与原点一起重新validation,而不仅仅是返回304到客户端而不检查原点。

例如,如果我将max-age设置为60秒,则代理将愉快地返回304那段时间,而不检查原点。 我已经build立了一个testing,每秒产生一个新的etag,像这样(使用node.js express):

app.get('/dynamic/:file?',function(req,res){ var filename = req.params.file; var filepath = path.join(__dirname,'files',filename); res.setHeader('Cache-Control','public,must-revalidate,proxy-revalidate,max-age=60,s-maxage=60'); res.setHeader('ETag',filename+etagCounter); res.sendfile(filepath); console.log('request',requestCounter++); console.log('etag',etagCounter); console.log('date',new Date().toISOString()); });

而在Nginx中,通过这个请求的路由是这样configuration的:

location /cache/ { access_log on; add_header vary "Accept-Encoding"; add_header X-AppServer $upstream_addr; # Backend Server / Port add_header X-AppServer-Status $upstream_status; # Backend HTTP Status add_header X-Cache $upstream_cache_status; # HIT / MISS / BYPASS / EXPIRED proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; proxy_set_header Connection ""; proxy_cache one; proxy_cache_key $scheme$proxy_host$uri$is_args$args; proxy_pass http://localhost:4444/; }

当客户直接与Express交谈时,我看到Express被返回的304,但是当Express与Express之间有代理时,从不向Nginx返回304。 Nginx从caching中提供服务,只有当max-age已经过期时才从源端获取资源。

在使用PHP MysqL_connect函数时绑定到特定的IP地址

neo4j web界面背后的Nginx反向代理

如何使用.htaccess禁用代理caching

与Ubuntu的Android SDK设置代理

Apache2 ProxyPass for Rails App Gitlab

可以肯定的是,我把etag刷新间隔设置为60秒,最大年龄设置为1.结果,Nginx会从原点每秒钟获得一个新的资源(不需要重新validation,所以一个200响应),然后返回一个304直到60秒后etag发生变化。

我的结论是,Nginx永远不会重新validation原始服务器。 只要根据max-age认为它需要一个资源,它就会得到一个新的资源副本。

有没有办法做我想要的? 它不尊重代理重新validation头,还是我没有采取正确的做法?

[编辑]

我从那里find答案。 从这篇文章我弥补了2个解决scheme。

1)caching响应中的must-revalidate / proxy-revalidate应该足够让Nginx在请求中接收max-age = 0时触发重新validation。

2)当客户端在CC头中发送“no-cache”时,代理服务器肯定应该对源进行重新validation。

从我的testing都似乎没有工作。 例如,我正在做这样的一个请求:

curl 'http://img.zgserver.com/Nginx/image.jpg' -H 'if-none-match: image.jpg0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Host: localhost:9088' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/29.0.1547.76 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Cache-Control: no-cache,max-age=0' -H 'Cookie: octane.sid=s%3AUa64F6fk2Pw0uwZ28e7OICyv.z2FNPYjQ7%2Fn%2F3vZGXV7B3QBYtqN%2FHzjV1e3XTuZcnmwduE4SBFEPDv3zE3zRuA4Ae705RtI6Z%2BBrqJyMveSjNA' -H 'Connection: keep-alive' -H 'If-Modified-Since: Thu,06 Sep 2012 09:21:53 GMT' --compressed -I

它包含-H 'Cache-Control: no-cache,max-age=0' ,但是我仍然从Nginxcaching中获取内容,而不检查原点。

Nginx在这方面performance不好? 我正在使用版本1.5.4

如何在Nginx的子path中configurationIPython?

Nginx条件代理传递

Nginx作为docker上游代理与地图

无法在Windows 7上查询代理“自动检测设置”

多less个Nginx缓冲区太多了?

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

相关推荐