Saltar a contenido

eval: Evaluar la respuesta de memcached o proxy en una variable

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y 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

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_eval_module.so;

Este documento describe nginx-module-eval v2016.6.10 lanzado el 10 de febrero de 2016.


# un ejemplo para trabajar con los módulos ngx_drizzle + ngx_rds_json
# pero debes poner ngx_rds_json *después*
# de ngx_eval durante la configuración de nginx, por ejemplo:
#     ./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; # por defecto 4k, truncado si se desborda
    eval $res {
        drizzle_query "select * from cats";
        drizzle_pass my_mysql_backend;
        rds_json on;
    }
    # ahora $res contiene el conjunto de resultados en formato JSON
    if ($res ~ '"Tom"') {
        echo "¡Encontré al gato Tom!";
        break;
    }
    echo "¡El gato Tom está desaparecido!";
}

# un ejemplo para trabajar con el módulo 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;
   }
   # tus configuraciones del manejador de contenido...
}

Descripción

Este fork de ngx_eval puede trabajar con cualquier manejador de contenido e incluso con filtros habilitados siempre que pongas ngx_eval antes de tus módulos de filtro durante la configuración de nginx, por ejemplo

./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

de tal manera que el filtro de ngx_eval funcione después de tus módulos de filtro.

A partir de NGINX 1.9.11, también puedes compilar este módulo como un módulo dinámico, utilizando la opción --add-dynamic-module=PATH en lugar de --add-module=PATH en la línea de comandos de ./configure anterior. Y luego puedes cargar explícitamente el módulo en tu nginx.conf a través de la directiva load_module, por ejemplo,

load_module /path/to/modules/ngx_http_eval_module.so;

Usar Lua en su lugar

Sin embargo, hoy en día, preferimos ngx_lua para realizar las tareas que originalmente hacía ngx_eval debido a varias limitaciones inherentes en ngx_eval.

Aquí hay un pequeño ejemplo usando 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 ...;
}

esto es aproximadamente equivalente a

location / {
    eval $res {
        proxy_pass http://blah.blah/checker;
    }
    if ($res ~ 'SPAM') {
        rewrite ^ /terms-of-use redirect;
        break;
    }

    fastcgi_pass ...;
}

Aunque el ejemplo en Lua es un poco más largo, es mucho más flexible y estable.

Limitaciones

  • Los contenidos de las subsolicitudes emitidas desde dentro del bloque eval (como las que se activan por echo_subrequest) no se capturarán correctamente.

Compatibilidad con Nginx

Las siguientes versiones de Nginx deberían funcionar con este módulo:

  • 1.9.x (última prueba: 1.9.7)
  • 1.8.x
  • 1.7.x (última prueba: 1.7.7)
  • 1.5.x (última prueba: 1.5.12)
  • 1.4.x (última prueba: 1.4.4)
  • 1.3.x (última prueba: 1.3.11)
  • 1.2.x (última prueba: 1.2.9)
  • 1.1.x (última prueba: 1.1.5)
  • 1.0.x (última prueba: 1.0.15)
  • 0.9.x (última prueba: 0.9.4)
  • 0.8.0 ~ 0.8.41, 0.8.54+ (0.8.42 ~ 0.8.53 requiere parches, ver abajo) (última prueba: 0.8.54)
  • 0.7.x >= 0.7.21 (última prueba: 0.7.68)

Ten en cuenta que nginx 0.8.42 ~ 0.8.53 no funcionará debido a una famosa regresión que apareció desde 0.8.42.

Documentación original de ngx_eval

La documentación para este módulo se puede encontrar en las siguientes URLs:

Este trabajo es encargado por gadu-gadu.pl

Ver También

GitHub

Puedes encontrar consejos adicionales de configuración y documentación para este módulo en el repositorio de GitHub para nginx-module-eval.