在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
}
但我不确定这是一个微小的,更复杂的配置,以避免正则表达式,这是有道理的。将视频保存在其他文件夹中,只是为了避免使用正则表达式。它应该更快吗?这值得吗?
答案 0 :(得分:1)
这取决于您的使用案例。由于nginx使用pcre,最终你要求&#34; pcre是否使用CPU&#34;,这显然是的。但是,如果nginx所做的大部分工作都是为文件对象提供服务并管理远程tcp套接字,那么你就不会看到影响。如果您正在使用nginx进行非常快速的代理工作(想想50k +连接),我的经验是您将绝对体验正则表达式优化带来的主要性能影响
要确定您的瓶颈是什么,您需要使用像tcpdump这样的工具并查找时间到第一个数据字节。此外,apache bench是单线程的,因此对于高容量Web服务器的实用性非常有限。如果你必须使用该工具,我建议制作一组ab实例并添加结果;)
答案 1 :(得分:0)
我使用ab
(https://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)$
这样的简单正则表达式有点复杂,比如将某些文件移动到另一个目录,那么,不,不要这样做。这不值得。 (更复杂的正则表达式?然后我不知道。)