【问题标题】:NGINX too long location (massive?)NGINX 位置太长(大量?)
【发布时间】:2013-11-13 07:50:12
【问题描述】:

NGINX

有一个类似的位置:

location ~ "^\/(place1|place2|...|place50)\/(service1|service2|...|service80)\-(else1|else2|...|else90)\/"
{...}

location ~ "^\/(word1|word2|...|word70)\/(place1|place2|...|place50)\-(else1|else2|...|else90)\/"
{...}

location ~ "^\/..."

问题是有很多地方、服务、文字等等。所以位置是非常长的字符串。是否有可能使它们更短?也许有大量的地方和大量的服务等等?或者其他的东西?谁有经验?

我要匹配的 URI 示例

/place23/service17-else87/

/world33/place42-else15/

以及任何组合

对于每个位置,我们将使用一组规则。为了使用缓存和卸载我们的 Apache

        #proxy_cache start
        set $do_not_cache 0;
        # POST requests and urls with a query string should always go to PHP
        if ($request_method = POST) {
            set $do_not_cache 1;
        }
        if ($query_string != "") {
            set $do_not_cache 1;
        }
        # Don't use the cache for logged in users or REBent commenters
        if ($http_cookie ~* "wordpress_logged_in|bn_my_logged") {
            set $do_not_cache 1;
        }
        if ($args ~* (show) ) {
            set $do_not_cache 1;
        }
        ssi_types "*";
        ssi on;
        if ($do_not_cache = 0) {
            set $memcached_key "SMREG|$request_uri";
            memcached_pass memc_server;
            ssi on;
        }

【问题讨论】:

  • 你能举出你想匹配的URI的例子吗
  • 刚刚添加了示例
  • 为什么要在 Web 服务器级别而不是应用程序级别处理这些?

标签: nginx location massive


【解决方案1】:

您可以在位置块中使用正则表达式来使它们匹配多个事物,而不是手动将它们全部列出。

例如

location ~* ^/world(\d{1,2})/place(\d{1,2})-else(\d{1,2})/ {

    set $originalURI  $uri;
    fastcgi_param  QUERY_STRING  q=$originalURI&world=$1&place=$2&else=$3;
    # or however you're passing it to your web server.
}

然而,正如 Mohammad AbuShady 所暗示的那样,你所做的似乎很愚蠢。

您应该让您的应用程序进行路由,并决定是否可以缓存事物,然后使用实际设计用于缓存网页的东西,例如Varnish,而不是试图将应用程序逻辑强制到 Nginx 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2015-01-27
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多