主要观点:
- 在对 nginx 集群进行性能测试时发现 CPU 在较低请求率下就出现阻塞,
perf
报告显示rewrite
和ngx_http_regex_exec
相关符号占用大量样本。 - 即使在已知错误 URL 或触发块/速率限制配置时也会出现此问题,即使开启 PCRE JIT 引擎也改善有限。
- 问题原因是在
location
块之外的server
块中有大量rewrite
规则,且错误处理配置中使用相对路径导致每次触发错误时rewrite
规则会执行两次。 - 建议避免在
location
块之外使用rewrite
规则,优先使用命名路由代替普通 URL/路径以避免rewrite
规则的二次执行。
关键信息:
- 测试的是运行 vanilla nginx 的静态代理服务器,下游服务器延迟正常。
- 配置文件结构复杂,
rewrite
规则分散在多个文件中。 - 早期添加的用于“规范化”URL 的文件导致
rewrite
规则执行效率低下。 location
匹配在启动时构建树,比逐个串行匹配更高效。error_page
配置使用相对路径,触发错误时会重新匹配。
重要细节:
- 给出了具体的 nginx 配置示例,展示了
rewrite
规则执行情况及性能差异。 - 注释说明了各个配置指令的作用,如
rewrite
、location
、error_page
等。 - 提到类似配置在 Debian 11 默认包和 Nginx 官方 Docker 容器中都存在。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。