跳转至

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 委托。

另见

GitHub

您可以在 nginx-module-eval 的 GitHub 仓库 中找到此模块的其他配置提示和文档。