eval: Оценить ответ memcached или прокси в переменную
Установка на Debian/Ubuntu
Эти документы относятся к пакету APT nginx-module-eval, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте репозиторий APT, как описано в настройке репозитория APT.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-eval
Показать наборы и архитектуры
| Distro | Suite | Component | Architectures |
|----------|-------------------|-------------|-----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
ngx_eval - Захват тел ответов подзапросов в переменные NGINX
Статус
Этот модуль является экспериментальным, и его использование в производственной среде не рекомендуется. Если вам нужны аналогичные (но более мощные) функции, посмотрите на модуль ngx_lua.
Синопсис
## пример работы с модулями ngx_drizzle + ngx_rds_json
## однако вы должны разместить ngx_rds_json *после*
## ngx_eval во время конфигурации nginx, например:
## ./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 "Нашли кота Тома!";
break;
}
echo "Кота Тома нет!";
}
## пример работы с модулем 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 может работать с любыми обработчиками контента и даже с включенными фильтрами, при условии, что вы разместите ngx_eval до ваших модулей фильтров во время конфигурации nginx, например:
./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, вы также можете скомпилировать этот модуль как динамический модуль, используя опцию --add-dynamic-module=PATH вместо --add-module=PATH в
командной строке ./configure выше. Затем вы можете явно загрузить модуль в вашем nginx.conf с помощью директивы load_module, например,
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-адресам:
-
Английский: http://www.grid.net.ru/nginx/eval.en.html
-
Русский: http://www.grid.net.ru/nginx/eval.ru.html
Эта работа заказана gadu-gadu.pl
Смотрите также
- модуль ngx_lua.