多个位置块是否比单个块中的多个正则表达式重写更快?

多个位置块是否比单个块中的多个正则表达式重写更快?

在里面配置陷阱在 nginx 文档中,提到正则表达式应该保持简单。好吧,就我而言,我可以完全避免使用它,我想知道这对性能是否重要。

我想提供所有静态文件,将其他请求路由到单个index.php文件,并通过将它们传递给同一个index.php文件来阻止对几个文件夹中的文件的访问,然后呈现 404 页面。

我可以做这个:

location / {
    rewrite ^/foo/(.*) /index.php last;
    rewrite ^/bar/(.*) /index.php last;
    rewrite ^/baz/(.*) /index.php last;

    try_files $uri $uri/ /index.php;
}

...或这个:

location /foo/ {
    rewrite ^ /index.php last;
}

location /bar/ {
    rewrite ^ /index.php last;
}

location /baz/ {
    rewrite ^ /index.php last;
}

location / {
    try_files $uri $uri/ /index.php;
}

在第一个示例中,nginx总是必须评估 3 个正则表达式模式。在第二个示例中,它最多只需评估一个,而且更简单。我的理论是第二个配置会更快。我说得对吗?

答案1

性能上的差异很可能非常小,并且您需要对每种情况进行长时间的测试才能知道哪种情况性能最佳。

以下是实现您的要求的一些替代方法:

语句中没有捕获

location / {
    rewrite ^/foo/ /index.php last;
    rewrite ^/bar/ /index.php last;
    rewrite ^/baz/ /index.php last;
}

没有必要在正则表达式中使用捕获组,因为该值没有用于任何用途。

一个正则表达式匹配所有可能性

location / {
    rewrite ^/(?:foo|bar|baz) /index.php last;
}

此正则表达式将三个选项组合成一个表达式。这?:可防止使用括号时发生正则表达式捕获。

匹配 中的正则表达式的所有部分location

location ~ ^/(?:foo|bar|baz) {
    rewrite ^ /index.php last;
}

忽略正则表达式匹配与位置前缀匹配

location ^~ /foo/ {
    rewrite ^ /index.php last;
}

location ^~ /bar/ {
    rewrite ^ /index.php last;
}

location ^~ /baz/ {
    rewrite ^ /index.php last;
}

location / {
    try_files $uri $uri/ /index.php;
}

您应该测量这些选项之间的性能,看看哪个是最快的。速度也可能受到配置中的其他因素的影响。

这些替代方案在其他配置方面确实有点不同,因此您需要确保应用程序的其他部分能够正常工作。

相关内容