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

被折叠的 条评论
为什么被折叠?



