带有memcache、gunzip和ssi don的Nginx';我们不能一起工作
我正在尝试将打包(gzip)html保存在Memcached中,并在nginx中使用:带有memcache、gunzip和ssi don的Nginx';我们不能一起工作,nginx,memcached,ssi,Nginx,Memcached,Ssi,我正在尝试将打包(gzip)html保存在Memcached中,并在nginx中使用: 从memcached加载html 如有包装,由nginx开箱 通过以下方式处理ssi插入: 将结果返回给用户 大多数情况下,除了ssi步骤外,配置工作正常: location / { ssi on; set $memcached_key "$uri?$args"; memcached_pass memcached.up; memcached_gzip_flag 2; #
location / {
ssi on;
set $memcached_key "$uri?$args";
memcached_pass memcached.up;
memcached_gzip_flag 2; # net.spy.memcached use second byte for compression flag
default_type text/html;
charset utf-8;
gunzip on;
proxy_set_header Accept-Encoding "gzip";
error_page 404 405 400 500 502 503 504 = @fallback;
}
看起来,nginx在通过gunzip模块解包之前进行ssi处理
在结果HTML中,我看到未解析的ssi指令:
<!--# include virtual="/remote/body?argument=value" -->
我想用动态NGNIX模块避免解决方案,如果可能的话,[P/>
基本上有两个问题要考虑——过滤模块的顺序是否合适,GunZip是否适合你的情况。 0gunzip/ssi/gzip的顺序。 一个简单的示例表明,顺序是在编译时根据shell脚本的内容确定的:
- 多个过滤器可以挂接到每个位置,因此(例如)可以对响应进行压缩,然后进行分块。它们的执行顺序在编译时确定。过滤器具有经典的“责任链”设计模式:一个过滤器被调用,完成其工作,然后调用下一个过滤器,直到调用最后一个过滤器,Nginx完成响应
- 过滤器的顺序源自nginx模块的执行顺序。nginx模块的执行顺序在nginx源代码的auto/modules文件中实现
ssi
介于gzip
和gunzip
之间,但是,现在还不清楚模块的执行方式(从上到下或从下到上),因此,默认值可能是合理的,或者,您可能需要切换这两种方式(IMHO不一定支持)
这里的一个提示是http\u not\u modified
过滤器的位置,这是作为如果修改的示例给出的,因为上面的EMiller指南中有处理;我可以想象,它必须排在最后,如果是的话,那么,事实上,gunzip/ssi/gzip的顺序似乎与您需要的正好相反
1.gunzip有效吗?
根据,过滤器的文档中包含以下文本:
为缺少gzip支持的客户端启用或禁用gzip响应的解压缩
不完全清楚上述语句是否应解释为对模块的描述(例如,缺少gzip支持的客户端是您可能希望使用此模块的原因),或者它是否是对行为的描述(例如,模块是否自行决定客户端是否支持gzip)。处的源代码似乎暗示它只是检查回复的内容编码是否为gzip
,如果是,则继续。然而,文档中的下一句话(在上面引用的那句话之后)确实表明它与gzip
模块有更多的交互作用,因此,可能还涉及到其他内容
我的猜测是,如果您使用浏览器进行测试,那么浏览器确实支持gzip,因此,gunzip
不参与是合理的,因此,SSI模块将永远不会有任何有效的处理。这就是为什么我建议您确定gunzip是否正常工作和/或通过执行简单的纯文本请求与使用包含gzip
的Accept-Encoding
浏览器发出的请求是否不同
解决方案
根据上面的调查结果,我将尝试确定模块的顺序,如果不正确,可以选择是重新编译还是双重代理
随后,如果问题仍未解决,我将确保gunzip
filter将无条件地从中解压缩数据;我想您可能必须忽略或重置接受编码
标题或类似的标题。您能否先从配置中删除缓存,看看它是否有效?您应该通过一次使用一个层来解决问题,而无需缓存或gzip,一切都很好。但是我需要带ssi=)的gzip缓存,看看这是否有帮助?我已经看过了。使用ssi进行缓存是可行的fine@demon101如果清除所有缓存,然后请求页面w/,而不使用任何更高级别的UA,会发生什么?gunzip工作得很好。尝试将memcached+gunzip的结果作为SSI片段插入页面。(另一种方式,在问题中——SSI片段到memcached+gunzip页面)。我认为,问题在于过滤顺序。但在这种情况下,我无法理解为什么配置服务器的解决方案也不起作用
upstream memcached {
server localhost:11211;
keepalive 100;
}
upstream unmemcached {
server localhost:21211;
keepalive 100;
}
server {
server_name dev.me;
ssi_silent_errors off;
error_log /var/log/nginx/error1.log debug; log_subrequest on;
location / {
ssi on;
ssi_types *;
proxy_pass http://unmemcached;
proxy_max_temp_file_size 0;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
location @fallback {
ssi on;
proxy_pass http://proxy.site;
proxy_max_temp_file_size 0;
proxy_http_version 1.1;
proxy_set_header Connection "";
error_page 400 500 502 503 504 /offline.html;
}
}
server {
access_log on;
listen 21211;
server_name unmemcached;
error_log /var/log/nginx/error2.log debug; log_subrequest on;
location / {
set $memcached_key "$uri?$args";
memcached_pass memcached;
memcached_gzip_flag 2;
default_type text/html;
charset utf-8;
gunzip on;
proxy_set_header Accept-Encoding "gzip";
error_page 404 405 400 500 502 503 504 = @fallback;
}
location @fallback {
#ssi on;
proxy_pass http://proxy.site;
proxy_max_temp_file_size 0;
proxy_http_version 1.1;
proxy_set_header Connection "";
error_page 400 500 502 503 504 /offline.html;
}
}