我正在为电子商务平台开发一个缓存系统,该系统将使用反向代理进行缓存。我计划通过使用正确的 HTTP/1.1 标头来处理失效。也就是说,我将在第一代内容上设置一个 ETag,并在应用程序中缓存该 ETag 值。Cache-Control 标头将指定“必须重新验证”,因此代理应在带有 ETag 的后续请求上设置 If-None-Match 标头。应用程序将查找缓存的 ETag 值,如果匹配将发送 304 响应,否则将生成完整的 200 响应。
我希望使用 nginx,但我不能确定它是否支持 ETag(文档表明它不支持,但也许它们已经过时了?)。清漆是另一种选择,但我在这里也不乐观..
哪些反向代理服务器完全支持 ETag?我希望它能够真正缓存多个版本,这样我就可以在不必禁用缓存的情况下进行拆分测试之类的操作。也就是说,HTTP/1.1 指定客户端可以发送带有多个 ETag 值的 If-None-Match,服务器应响应匹配的 ETag(如果有)。如果反向代理保留多个副本而不仅仅是最后看到的值,并让服务器在每个请求上指定要使用的值,那将是理想的。
我使用 Apache 2.4.3 作为反向代理,因为它宣传符合 RFC 2616。我的应用程序使用这样的标头来启用代理缓存:
Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: A
Vary: X-Group
ETag: W/"foo1"
Run Code Online (Sandbox Code Playgroud)
在第一个请求预热缓存后,如果我的应用程序更改为响应:
Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: B
Vary: X-Group
ETag: W/"foo2"
Run Code Online (Sandbox Code Playgroud)
如果来自 Apache 的 If-None-Match 标头与源生成的 ETag 匹配,则应用程序将响应 304 Not Modified。但是,Apache 然后缓存第二个 200 响应并用新响应替换“foo1”记录,而不是缓存具有不同 ETag 的两个响应。因此,而不是If-None-Match: W/"foo1", W/"foo2"下一个重新验证请求只是If-None-Match: W/"foo2". 所以缓存不断地丢失而不是总是得到命中。
来自 RFC 2616 第 12.1 节:
然而,源服务器不限于这些维度,可以根据请求的任何方面改变响应,包括请求头字段之外的信息或本规范未定义的扩展头字段内的信息。
我为 Vary 尝试了以下组合:
Vary: X-Foo
Vary: *
Vary: User-Agent
Run Code Online (Sandbox Code Playgroud)
我还尝试了强和弱 ETag,无论我无法让 Apache 同时缓存两个响应,它 …
我已经从运行 Wordpress 博客的源代码编译了 PHP 5.3.3 和 nginx 0.8.47。Wordpress 生成的 RSS 提要在大约 16k 处被截断(包括标题为 16k+90b)。通过将以下内容添加到我的 nginx 配置中:
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
Run Code Online (Sandbox Code Playgroud)
问题消失了.. 但是,从我在Nginx wiki 页面上阅读的内容来看,缓冲区仅确定缓冲何时会溢出到磁盘上。由于缓冲区太小,没有任何迹象表明响应可以被截断。
所以我的问题是,为什么在更改此设置之前响应会被截断?似乎请求不应该被截断,只是由于磁盘缓冲而变慢了一点。
附加信息:
我正在尝试调试 exim 配置问题(Ubuntu),我在配置中看到很多行,例如:
remote_smtp:
debug_print = "T: remote_smtp for $local_part@$domain"
driver = smtp
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何获取这些语句的输出。我尝试编辑 /etc/default/exim4 并在那里添加各种 CLI 参数,例如 -v、-d、-d+all,虽然它们确实有效,但 debug_print 行却找不到(stderr、stdout、 /var/log/exim4/mainlog)。
如何启用以及在哪里找到“T:remote_smtp for ...”输出?
我在 nginx 后面运行 Magento(电子商务 PHP 应用程序)作为运行 PHP 应用程序的 Apache 的反向代理。静态内容由 nginx 直接提供。Magento 有一个“维护模式”,它使用 503 HTTP 响应。使用我的配置,当启用维护模式时,nginx 返回一个带有 500 响应的空白页面,而不是带有 503 响应的 Magento 良好的维护模式页面。如何让nginx让503页面传递给客户端?
这是我的 nginx 配置:
上游 examplecluster { 服务器 1.2.3.4:80; }
服务器 {
听 1.2.3.5:80;
server_name www.example.com;
根/var/www/example.com/www;
# 安全
位置 ~ (/(app/|includes/|lib/|pkginfo/|var/|report/config.xml|downloader/(pearlib|template|Maged)/)|/\.svn/|/\.ht.+ ){
返回404;
}
位置 ~ \.php$ {
proxy_pass http://examplecluster;
proxy_redirect 默认;
}
# 静态内容
地点 / {
try_files $uri @apache;
7d 到期;
}
#阿帕奇
位置@apache {
proxy_pass http://examplecluster;
proxy_redirect 默认;
}
}