gpt4 book ai didi

带有 memcache、gunzip 和 ssi 的 Nginx 不能一起工作

转载 作者:行者123 更新时间:2023-12-03 17:34:10 27 4
gpt4 key购买 nike

我正在尝试在 Memcached 中保存打包 (gzip) html 并从 nginx 中使用:

  • memcached module 的 memcached 加载 html
  • 通过 nginx 解压 gunzip module如果包装
  • 通过 ssi module 处理 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" -->

    nginx 日志中没有错误。

    试过 ssi_types * - 没有效果

    知道如何解决吗?

    nginx 1.10.3 (Ubuntu)

    更新

    已尝试在上游再进行一次。结果一样 =(

    在日志中,我看到,在上游请求后应用了 ssi 过滤器,但没有检测到包含。
    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;
    }

    }

    如果可能,我想避免使用动态 nginx 模块的解决方案

    最佳答案

    基本上有两个问题需要考虑——过滤器模块的顺序是否合适,以及 gunzip 是否适合您的情况。

    0. gunzip/ssi/gzip的顺序。

    一个简单的search for "nginx order of filter modules"显示顺序是在编译时根据 auto/modules 的内容确定的外壳脚本:

  • http://www.evanmiller.org/nginx-modules-guide.html

    Multiple filters can hook into each location, so that (for example) a response can be compressed and then chunked. The order of their execution is determined at compile-time. Filters have the classic "CHAIN OF RESPONSIBILITY" design pattern: one filter is called, does its work, and then calls the next filter, until the final filter is called, and Nginx finishes up the response.

  • https://allthingstechnical-rv.blogspot.de/2014/07/order-of-execution-of-nginx-filter.html

    The order of filters is derived from the order of execution of nginx modules. The order of execution of nginx modules is implemented within the file auto/modules in the nginx source code.


  • 快速浏览 auto/modules 显示 ssi介于 gzip 之间和 gunzip ,但是,尚不清楚模块的执行方式(从上到下或从下到上),因此,默认值可能是合理的,或者您可能需要切换两者(不一定支持,恕我直言)。

    这里的一个提示是 http_not_modified 的位置。过滤器,作为 If-Modified-Since 的示例给出根据上面的 EMiller 指南进行处理;我想它必须排在最后,在所有其他人之后,如果是这样,那么,确实,gunzip/ssi/gzip 的顺序似乎与您需要的完全相反。

    1. gunzip 有效吗?

    根据 http://nginx.org/r/gunzip ,过滤器的文档中存在以下文本:

    Enables or disables decompression of gzipped responses for clients that lack gzip support.



    是否应该将上述语句解释为模块的描述(例如,缺少 gzip 支持的客户端是您可能要使用此模块的原因),或者是否是行为的描述(例如,是否模块自行确定客户端是否支持 gzip)。源代码位于 src/http/modules/ngx_http_gunzip_filter_module.c似乎暗示它只是检查 Content-Encoding原样回复的 gzip ,如果是,则继续。然而,文档中的下一句(在上面引用的一句之后)似乎表明它与 gzip 有更多的交互。模块,因此,也许还涉及其他内容。

    我的猜测是,如果您使用浏览器进行测试,那么浏览器确实支持 gzip,因此, gunzip 是合理的。不参与,因此,SSI 模块将永远不会有任何有效的东西可以处理。这就是为什么我建议您确定 gunzip 在通过 curl 执行简单的纯文本请求之间是否正常工作和/或不同。与使用 Accept-Encoding 的浏览器制作的相比其中包括 gzip .

    解决方案。

    根据上述调查的结果,我会尝试确定模块的顺序,如果不正确,可以选择重新编译或双重代理是否是解决方案。

    随后,如果问题仍未解决,我将确保 gunzip过滤器将无条件地对 memcached 中的数据进行解压。 ;我想你可能不得不忽略或重置 Accept-Encoding header 之类的。

    关于带有 memcache、gunzip 和 ssi 的 Nginx 不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590415/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com