启用--with-pcre-jit(PCRE)或--with-pcre2(PCRE2,Nginx 1.21.0+)可激活正则JIT编译,提升location、rewrite等性能;需使用PCRE 8.32+/PCRE2,编译时指向含JIT的源码,通过nginx -V和错误日志验证。

在源码编译 Nginx 时启用 --with-pcre-jit 可以让 PCRE 库在运行时对正则表达式进行即时编译(JIT),显著提升涉及正则匹配的场景(如 location ~、if ($args ~)、rewrite 等)的处理性能,尤其在高并发或复杂规则下效果明显。
确认 PCRE 版本支持 JIT
JIT 功能从 PCRE 8.20 开始引入,但早期版本存在稳定性问题;建议使用 PCRE 8.32 或更高版本(推荐 PCRE2,即 pcre2,Nginx 1.21.0+ 原生支持 --with-pcre2 并默认启用 JIT)。编译前检查:
- 运行
pcre-config --version(若系统已装 PCRE) - 下载源码时优先选择 PCRE2 官方发布版(如 pcre2-10.42)
- PCRE2 编译时无需额外配置,默认构建 JIT 支持(确保未加
--disable-jit)
编译 Nginx 时正确启用 JIT
关键不是“指定 JIT”,而是让 Nginx 链接到支持 JIT 的 PCRE/PCRE2 库,并通过配置开关启用。分两种情况:
-
使用 PCRE(旧方式):需显式添加
--with-pcre-jit,且--with-pcre=必须指向含 JIT 的 PCRE 源码目录(不是系统库路径) -
使用 PCRE2(推荐):Nginx 1.21.0+ 默认识别 PCRE2 的 JIT,只需
--with-pcre2=指向 PCRE2 源码目录,无需额外加--with-pcre-jit
示例(基于 PCRE2):
./configure \ --with-pcre2=/path/to/pcre2-10.42 \ --with-http_ssl_module \ --with-http_v2_module
验证 JIT 是否生效
编译安装后,执行 nginx -V 2>&1 | grep -o with-pcre 查看是否链接到目标库;更直接的方式是运行时检测:
- 在配置中加入一条带正则的 location,例如:
location ~ ^/api/[0-9]+/item$ { return 200 "jit test"; } - 启动 Nginx 后,用
nginx -t不会报错,说明正则解析正常 - 查看错误日志,若出现
using PCRE2 JIT或类似提示(取决于 PCRE2 版本和编译选项),即表示 JIT 已激活 - 可通过 ab / wrk 对该接口压测,对比开启/关闭 JIT 时的 QPS 和 CPU 占用变化(需固定其他变量)
注意事项与常见问题
JIT 虽好,但并非总适用:
- JIT 编译会增加首次匹配的延迟(将正则编译为机器码),适合重复使用的规则,不适用于一次性、动态生成的正则
- 部分精简版 Linux 发行版(如 Alpine)的 PCRE2 包可能禁用 JIT,建议自行编译 PCRE2 源码
- OpenResty 用户注意:其集成的 Lua-nginx-module 在调用
ngx.re.match时自动受益于底层 PCRE2 JIT,无需额外配置 - 若编译报错
PCRE2_JIT_SUPPORTED not defined,说明 PCRE2 源码未启用 JIT(检查 configure 日志中是否有checking for JIT support... yes)










