带有memcache、gunzip和ssi don的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; #

我正在尝试将打包(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; #  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;
      }
    
    }