Nginx 中位置块外部的重写是不好的!

主要观点:

  • 在对 nginx 集群进行性能测试时发现 CPU 在较低请求率下就出现阻塞,perf报告显示rewritengx_http_regex_exec相关符号占用大量样本。
  • 即使在已知错误 URL 或触发块/速率限制配置时也会出现此问题,即使开启 PCRE JIT 引擎也改善有限。
  • 问题原因是在location块之外的server块中有大量rewrite规则,且错误处理配置中使用相对路径导致每次触发错误时rewrite规则会执行两次。
  • 建议避免在location块之外使用rewrite规则,优先使用命名路由代替普通 URL/路径以避免rewrite规则的二次执行。

关键信息:

  • 测试的是运行 vanilla nginx 的静态代理服务器,下游服务器延迟正常。
  • 配置文件结构复杂,rewrite规则分散在多个文件中。
  • 早期添加的用于“规范化”URL 的文件导致rewrite规则执行效率低下。
  • location匹配在启动时构建树,比逐个串行匹配更高效。
  • error_page配置使用相对路径,触发错误时会重新匹配。

重要细节:

  • 给出了具体的 nginx 配置示例,展示了rewrite规则执行情况及性能差异。
  • 注释说明了各个配置指令的作用,如rewritelocationerror_page等。
  • 提到类似配置在 Debian 11 默认包和 Nginx 官方 Docker 容器中都存在。
阅读 31
0 条评论