eval: Avaliar resposta do memcached ou proxy em uma variável
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e 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
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_http_eval_module.so;
Este documento descreve o nginx-module-eval v2016.6.10 lançado em 10 de fevereiro de 2016.
# um exemplo para trabalhar com os módulos ngx_drizzle + ngx_rds_json
# módulos, mas você deve colocar ngx_rds_json *depois*
# ngx_eval durante a configuração do nginx, por exemplo:
# ./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; # padrão 4k, truncado se exceder
eval $res {
drizzle_query "select * from cats";
drizzle_pass my_mysql_backend;
rds_json on;
}
# agora $res contém o conjunto de resultados formatado em JSON
if ($res ~ '"Tom"') {
echo "Encontrado o gato Tom!";
break;
}
echo "O gato Tom está desaparecido!";
}
# um exemplo para trabalhar com o 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;
}
# suas configurações de manipulador de conteúdo...
}
Descrição
Este fork do ngx_eval pode trabalhar com qualquer manipulador de conteúdo e
até mesmo com filtros habilitados, desde que você coloque ngx_eval antes
dos seus módulos de filtro durante a configuração do nginx, por exemplo
./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 modo que o filtro do ngx_eval funcione depois dos seus módulos de filtro.
A partir do NGINX 1.9.11, você também pode compilar este módulo como um módulo dinâmico, usando a opção --add-dynamic-module=PATH em vez de --add-module=PATH na linha de comando ./configure acima. E então você pode carregar explicitamente o módulo em seu nginx.conf via a diretiva load_module, por exemplo,
load_module /path/to/modules/ngx_http_eval_module.so;
Usar Lua em vez disso
Hoje em dia, no entanto, preferimos ngx_lua para realizar as tarefas originalmente feitas pelo ngx_eval
devido a várias limitações inerentes ao ngx_eval.
Aqui está um pequeno exemplo 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 ...;
}
isso é aproximadamente equivalente a
location / {
eval $res {
proxy_pass http://blah.blah/checker;
}
if ($res ~ 'SPAM') {
rewrite ^ /terms-of-use redirect;
break;
}
fastcgi_pass ...;
}
Embora o exemplo em Lua seja um pouco mais longo, é muito mais flexível e estável.
Limitações
- O conteúdo das subrequisições emitidas de dentro do bloco eval (como aquelas disparadas por echo_subrequest) não será capturado corretamente.
Compatibilidade com Nginx
As seguintes versões do Nginx devem funcionar com este módulo:
- 1.9.x (último testado: 1.9.7)
- 1.8.x
- 1.7.x (último testado: 1.7.7)
- 1.5.x (último testado: 1.5.12)
- 1.4.x (último testado: 1.4.4)
- 1.3.x (último testado: 1.3.11)
- 1.2.x (último testado: 1.2.9)
- 1.1.x (último testado: 1.1.5)
- 1.0.x (último testado: 1.0.15)
- 0.9.x (último testado: 0.9.4)
- 0.8.0 ~ 0.8.41, 0.8.54+ (0.8.42 ~ 0.8.53 requer patch, veja abaixo) (último testado: 0.8.54)
- 0.7.x >= 0.7.21 (último testado: 0.7.68)
Note que o nginx 0.8.42 ~ 0.8.53 não funcionará devido a uma famosa regressão que apareceu desde 0.8.42.
Documentação original do ngx_eval
A documentação para este módulo pode ser encontrada nos seguintes URLs:
Este trabalho é encomendado por gadu-gadu.pl
Veja Também
- o módulo ngx_lua.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-eval.