eval: 评估 memcached 或代理响应到变量中
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7, 8, 9 和 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-eval
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-eval
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:
load_module modules/ngx_http_eval_module.so;
本文档描述了 nginx-module-eval v2016.6.10 于 2016 年 2 月 10 日发布。
# 一个与 ngx_drizzle + ngx_rds_json
# 模块一起工作的示例,但您必须在 nginx 配置时将 ngx_rds_json *放在*
# ngx_eval 之后,例如:
# ./configure --add-module=/path/to/nginx-eval-module \
# --add-module=/path/to/rds-json-nginx-module \
# --add-module=/path/to/drizzle-nginx-module
location = /mysql {
eval_subrequest_in_memory off;
eval_override_content_type text/plain;
eval_buffer_size 4k; # 默认 4k,溢出时会被截断
eval $res {
drizzle_query "select * from cats";
drizzle_pass my_mysql_backend;
rds_json on;
}
# 现在 $res 保存了 JSON 格式的结果集
if ($res ~ '"Tom"') {
echo "找到了 Tom 猫!";
break;
}
echo "Tom 猫不见了!";
}
# 一个与 ngx_postgres 模块一起工作的示例
location = /login {
eval_subrequest_in_memory off;
eval_override_content_type text/plain;
eval_buffer_size 1k;
eval $uid {
postgres_query "select id
from users
where name=$arg_name and pass=$arg_pass";
postgres_pass pg_backend;
postgres_output value 0 0;
}
if ($uid !~ '^\d+$') {
rewrite ^ /relogin redirect; break;
}
# 您的内容处理程序设置...
}
描述
这个 ngx_eval 的分支可以与任何内容处理程序一起工作,
甚至在启用过滤器的情况下,只要您在 nginx 配置时将 ngx_eval 放在
您的过滤模块之前,例如
./configure --prefix=/opt/nginx \
--add-module=/path/to/this/nginx-eval-module \
--add-module=/path/to/your/filter/module \
--add-module=/path/to/your/other/filters
这样 ngx_eval 的过滤器在您的过滤模块 之后 工作。
从 NGINX 1.9.11 开始,您还可以将此模块编译为动态模块,通过在
上面的 ./configure 命令行中使用 --add-dynamic-module=PATH 选项,而不是 --add-module=PATH。
然后,您可以通过 load_module
指令在您的 nginx.conf 中显式加载该模块,例如,
load_module /path/to/modules/ngx_http_eval_module.so;
使用 Lua 替代
然而,如今我们更倾向于使用 ngx_lua 来执行原本由 ngx_eval 完成的任务,
因为 ngx_eval 存在各种固有的限制。
以下是使用 ngx_lua 的一个小示例:
location = /filter-spam {
internal;
proxy_pass http://blah.blah/checker;
}
location / {
rewrite_by_lua '
local res = ngx.location.capture("/filter-spam")
if res.status ~= ngx.HTTP_OK or res.body == nil then
return
end
if string.match(res.body, "SPAM") then
return ngx.redirect("/terms-of-use")
end
';
fastcgi_pass ...;
}
这大致相当于
location / {
eval $res {
proxy_pass http://blah.blah/checker;
}
if ($res ~ 'SPAM') {
rewrite ^ /terms-of-use redirect;
break;
}
fastcgi_pass ...;
}
尽管 Lua 示例稍长,但灵活性和稳定性更高。
限制
- 从 eval 块中发出的子请求的内容(例如通过 echo_subrequest 触发的内容)将无法正确捕获。
Nginx 兼容性
以下版本的 Nginx 应与此模块兼容:
- 1.9.x(最后测试:1.9.7)
- 1.8.x
- 1.7.x(最后测试:1.7.7)
- 1.5.x(最后测试:1.5.12)
- 1.4.x(最后测试:1.4.4)
- 1.3.x(最后测试:1.3.11)
- 1.2.x(最后测试:1.2.9)
- 1.1.x(最后测试:1.1.5)
- 1.0.x(最后测试:1.0.15)
- 0.9.x(最后测试:0.9.4)
- 0.8.0 ~ 0.8.41, 0.8.54+(0.8.42 ~ 0.8.53 需要打补丁,见下文)(最后测试:0.8.54)
- 0.7.x >= 0.7.21(最后测试:0.7.68)
请注意,nginx 0.8.42 ~ 0.8.53 由于自 0.8.42 以来出现的 著名回归 而无法工作。
原始 ngx_eval 文档
此模块的文档可以在以下 URL 找到:
此工作由 gadu-gadu.pl 委托。
另见
- ngx_lua 模块。
GitHub
您可以在 nginx-module-eval 的 GitHub 仓库 中找到此模块的其他配置提示和文档。