尝试优化Nginx正则表达式是否值得?

时间:2016-04-20 04:49:06

标签: regex performance nginx

在Nginx虚拟主机中,我添加了这些位置,其中两个使用正则表达式:

    location ~ /-/pubsub/subscribe/(.*)$ {
      # subscribe to websocket
    }
    location ~ /-/pubsub/publish/(.*)$ {
      # websocket publish endpoint
    }
    location / {
      # reverse proxy to the application server
    }

但我可以做这样的事情来“隐藏”正则表达式吗?

    location /-/pubsub/ {       <-- can be tested without any regex matching
      location ~ subscribe/(.*)$ { ... }
      location ~ publish/(.*)$ { ... }
    }

    location / {
      # reverse proxy
    }

在我看来,对于请求匹配location /,这将避免解析任何正则表达式,因为它们将与location /-/pubsub/(无正则表达式)而不是location ~ /-/pubsub/whatever/(.*)$进行比较(使用正则表达式) ),对吧?

以同样的方式,我将视频上传与其他上传分开,因为视频上传使用了正则表达式:

  location /-/uploads/public/video/ {
    location ~ \.(mp4|m4v|m4a)$ {   <-- regex matching for videos only
      mp4;
    }
  }

  location /-/uploads/public/ {
    # all other files: no regex matching needed
  }

但我不确定这是一个微小的,更复杂的配置,以避免正则表达式,这是有道理的。将视频保存在其他文件夹中,只是为了避免使用正则表达式。它应该更快吗?这值得吗?

2 个答案:

答案 0 :(得分:1)

这取决于您的使用案例。由于nginx使用pcre,最终你要求&#34; pcre是否使用CPU&#34;,这显然是的。但是,如果nginx所做的大部分工作都是为文件对象提供服务并管理远程tcp套接字,那么你就不会看到影响。如果您正在使用nginx进行非常快速的代理工作(想想50k +连接),我的经验是您将绝对体验正则表达式优化带来的主要性能影响

要确定您的瓶颈是什么,您需要使用像tcpdump这样的工具并查找时间到第一个数据字节。此外,apache bench是单线程的,因此对于高容量Web服务器的实用性非常有限。如果你必须使用该工具,我建议制作一组ab实例并添加结果;)

答案 1 :(得分:0)

我使用abhttps://httpd.apache.org/docs/2.4/programs/ab.html)进行了一些快速测试,我发现下面的简单正则表达式与未使用的表现有任何不同。

我测试了这个:

location /-/uploads/public/ {
  access_log off;
  alias /opt/debiki/uploads/public/;  <-- serving one 1.4 kb avatar image from here
  autoindex off;
  sendfile on;
  sendfile_max_chunk 2m;
  tcp_nopush on;
  expires 31d;  # later:  expires 365d;

  location ~ \.(mp4|m4v|m4a)$ {   <-- regex
    mp4;
  }
}

评论正则表达式并没有以我注意到的方式使事情变得更快。 (确实喜欢5或10个带正则表达式的样本,5或10个样本没有,ab -n50000 -c10每个样本。结果在14500和15500 req / seq之间,相当随机,有和没有正则表达式)

所以我的结论是,如果可以免费避免location正则表达式,那么是的。但是,如果避免像上面location ~ \.(mp4|m4v|m4a)$这样的简单正则表达式有点复杂,比如将某些文件移动到另一个目录,那么,不,不要这样做。这不值得。 (更复杂的正则表达式?然后我不知道。)