rewrite本身开销极小,高并发瓶颈在于完整请求链路(ssl、location匹配、正则回溯、proxy_pass等),而非rewrite引擎单独性能。

直接压测 rewrite 本身没有意义——Nginx 的 rewrite 指令在配置加载阶段就已编译为内部指令树,实际请求处理时只是 O(1) 或 O(n) 的字符串匹配/正则执行,开销极小。真正决定 QPS 上限的是整个请求生命周期:网络栈、SSL 握手、location 匹配、变量求值、正则回溯(若用 PCRE)、proxy_pass 转发、后端响应等待等。因此,要测“rewrite 在高并发下的极限”,本质是测含重写逻辑的典型请求路径的吞吐瓶颈,而非 rewrite 引擎单独性能。
明确测试目标:不是 rewrite,而是带重写的完整请求链路
rewrite 本身不耗 CPU,但以下环节会显著影响高并发表现:
- 使用
rewrite ^/old/(.*) /new/$1 break;这类简单规则,几乎无感知;但若用rewrite ^/api/v(\d+)/(.*)$ /v$1/api/$2 last;+ 多层嵌套正则,且开启rewrite_log on,日志和回溯会拖慢吞吐 - location 块中大量
if ($args ~* ...)或set $var ...变量赋值,在每请求中重复解析,比 rewrite 本身更重 - rewrite 后跳转到 proxy_pass,瓶颈常卡在 upstream 连接池、后端响应延迟,而非 Nginx 重写
设计可复现的压测场景(关键步骤)
避免测“空配置”,聚焦真实负载模式:
-
固定 rewrite 规则集:例如定义 5 条常用规则(含 1 条 PCRE 正则、2 条字符串替换、1 条条件 if + rewrite、1 条 break/last 混用),关闭
rewrite_log,启用pcre_jit on(需 PCRE 8.32+) -
构造典型请求:用 ab / wrk 发送带 query 参数、path 动态段、合理 header 的请求,如
GET /old/product?id=123&v=2 HTTP/1.1,确保每次请求都触发 rewrite 流程 - 隔离变量干扰:禁用 access_log(或写入 /dev/null),关闭 gzip、limit_req 等非核心模块,仅保留 http、rewrite、proxy(如需)
-
监控真实指标:用
nginx -V确认启用--with-http_stub_status_module,通过/nginx_status实时看 Active connections、Requests/sec;同时用pidstat -u 1观察 worker 进程 CPU 是否打满
定位瓶颈的实操方法
当 QPS 不再随并发数线性增长时,按顺序排查:
- CPU 瓶颈:worker 进程 CPU > 90%,说明正则太复杂或变量计算过多;改用更简正则,或把逻辑前置到上游(如用 Lua/OpenResty 预处理)
-
内存/上下文切换:
vmstat 1显示 cs(context switch)突增,可能因 rewrite 导致频繁 location 重匹配或子请求;检查是否误用last引发循环 -
连接耗尽:
netstat -an | grep :80 | wc -l接近 ulimit -n,需调大worker_connections和系统 file-max - 后端拖累:对比直接访问后端(绕过 Nginx rewrite)的 QPS,若差距大,说明瓶颈在 upstream,此时 rewrite 性能已足够
给出一个最小可验证压测配置示例
在 http 块中添加:
log_format minimal '$status';
access_log /dev/null minimal;
error_log /dev/null warn;
<pre class="brush:php;toolbar:false;">map $request_uri $rewritten {
~^/v1/(.*)$ /api/v1/$1;
~^/legacy/(.*)$ /new/$1;
default $request_uri;
}
server {
listen 8080;
location / {
rewrite ^/old/(.*)$ /new/$1 break;
rewrite ^/api/(\d+)/(.*)$ /v$1/api/$2 last;
return 200 "rewritten: $rewritten\n";
}
}用 wrk 压测:wrk -t4 -c1000 -d30s http://127.0.0.1:8080/old/user?id=7,观察稳定 QPS 和 worker CPU 占用率。若 CPU











