nginx rewrite_by_lua 执行了 2 次

当rewrite_by_lua_file配置在nginxserver层时,由于内部跳转,lua脚本在每次location匹配时都会执行,导致gray.lua在处理php请求时意外执行两次。这个问题可以通过调整配置,避免在不需要的地方重复执行lua代码。

问题背景

nginx.conf 配置如下(简化版), rewrite_by_lua_file gray.lua 配置在了server 层,gray.lua 非预期的执行了 2 次

server {
  listen 80 default_server;
  rewrite_by_lua_file gray.lua;
  location / {
    try_files $uri $uri/ =404;
  }
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
  }
} 

原因

rewrite_by_lua_file gray.lua 配置在 server 层的效果,等价于在每个 location 层都配置了rewrite,而对于 php 服务的访问,是经历了一次内部跳转的 location / -> location ~ [^/]\.php(/|$)

location / {
  rewrite_by_lua_file gray.lua;
  try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
  rewrite_by_lua_file gray.lua;
}

nginx发生内部跳转时,当前请求会重新执行rewrite、access 这些 nginx 的请求处理阶段,从而导致对应的 Lua 代码重复执行

参考资料

https://groups.google.com/g/openresty/c/9wjjtZMBGEk

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值