【问题标题】:How much impact will NGINX rewrite rules have on performanceNGINX 重写规则对性能有多大影响
【发布时间】:2019-12-11 11:34:30
【问题描述】:

我有一个由 NGINX 提供服务的网站,有大约 1000 条重写规则,可确保网站完全重写之前存在的页面得到尊重。

比如:

location ~ ^/old/page/?$ {rewrite ^(.*)$ /new permanent;}
location ~ ^/old/page2/?$ {rewrite ^(.*)$ /new2 permanent;}
location ~ ^/old/page3/$ {rewrite ^(.*)$ /new3 permanent;}
location ~ ^/another$ {rewrite ^(.*)$ /new4 permanent;}

我想知道网络服务器可能需要多长时间来处理每个请求的这些规则(大概)。服务器受 uwsgi 的性能约束,而不是 nginx,因此规则不会占用大量 CPU。但是他们能在每个请求的响应时间中增加一个明显的块吗?还是它们的处理速度如此之快以至于一千个可能需要一毫秒?我正试图弄清楚将它们筛选下来是否有任何价值。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    一千个 NGINX“正则表达式”位置绝对会产生性能损失。具体而言,这将是多少时间测量,取决于您的服务器的硬件和工作负载。

    请注意,您提到的大多数常规位置都可以重写为完全匹配,就像我提到的here

    例如而不是:

    location ~ ^/old/page/?$ {rewrite ^(.*)$ /new permanent;}
    

    你可以使用:

    location = /old/page/ { return 301 /new; }
    location = /old/page { return 301 /new; }
    

    如果您以这种方式为数千个类似的位置重写,仅此一项将是一个巨大的改进。

    虽然,如果您可以通过更好地利用正则表达式来减少大部分位置,那么它可能会提供比原始配置更简洁/更短的配置,并且对性能的影响更小(更少的正则表达式位置 = 更好,但请注意,精确匹配仍在进行中更快):

    例如你可以替换:

    location ~ ^/old/page/?$ {rewrite ^(.*)$ /new permanent;}
    location ~ ^/old/page2/?$ {rewrite ^(.*)$ /new2 permanent;}
    location ~ ^/old/page3/$ {rewrite ^(.*)$ /new3 permanent;}
    

    类似:

    location ~ ^/old/page(\d+)?/?$ {rewrite ^(.*)$ /new$1 permanent;}
    

    无论哪种方式,请务必使用pcre_jit on;,因为它有助于 NGINX “预编译”用于位置匹配的正则表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2019-10-23
      • 1970-01-01
      • 2013-11-04
      • 2016-02-29
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多