memc: Расширенная версия стандартного модуля memcached для NGINX
Установка на Debian/Ubuntu
Эти документы применимы к пакету APT nginx-module-memc, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT репозиторий, как описано в настройке APT репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-memc
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|-------------|-------------------|------------|----------------|
| 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_memc - Расширенная версия стандартного модуля memcached, которая поддерживает команды set, add, delete и многие другие команды memcached.
Синопсис
# GET /foo?key=dog
#
# POST /foo?key=cat
# Значение кота...
#
# PUT /foo?key=bird
# Значение птицы...
#
# DELETE /foo?key=Tiger
location /foo {
set $memc_key $arg_key;
# $memc_cmd по умолчанию равен get для GET,
# add для POST, set для PUT и
# delete для метода запроса DELETE.
memc_pass 127.0.0.1:11211;
}
# GET /bar?cmd=get&key=cat
#
# POST /bar?cmd=set&key=dog
# Моё значение для ключа "dog"...
#
# DELETE /bar?cmd=delete&key=dog
# GET /bar?cmd=delete&key=dog
location /bar {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;
set $memc_flags $arg_flags; # по умолчанию 0
set $memc_exptime $arg_exptime; # по умолчанию 0
memc_pass 127.0.0.1:11211;
}
# GET /bar?cmd=get&key=cat
# GET /bar?cmd=set&key=dog&val=animal&flags=1234&exptime=2
# GET /bar?cmd=delete&key=dog
# GET /bar?cmd=flush_all
location /bar {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;
set $memc_value $arg_val;
set $memc_flags $arg_flags; # по умолчанию 0
set $memc_exptime $arg_exptime; # по умолчанию 0
memc_cmds_allowed get set add delete flush_all;
memc_pass 127.0.0.1:11211;
}
http {
...
upstream backend {
server 127.0.0.1:11984;
server 127.0.0.1:11985;
}
server {
location /stats {
set $memc_cmd stats;
memc_pass backend;
}
...
}
}
...
# считать флаги memcached в заголовок Last-Modified
# чтобы ответить 304 на условный GET
location /memc {
set $memc_key $arg_key;
memc_pass 127.0.0.1:11984;
memc_flags_to_last_modified on;
}
location /memc {
set $memc_key foo;
set $memc_cmd get;
# доступ к unix-сокету, к которому подключается memcached
memc_pass unix:/tmp/memcached.sock;
}
Описание
Этот модуль расширяет стандартный модуль memcached, чтобы поддерживать почти весь асси-протокол memcached.
Он позволяет вам определить пользовательский REST интерфейс для ваших серверов memcached или получить доступ к memcached очень эффективно изнутри сервера nginx с помощью подзапросов или независимых фейковых запросов.
Этот модуль не предполагается объединить с основным Nginx, потому что я использовал Ragel, чтобы сгенерировать парсеры ответов memcached (на C) для радости :)
Если вы собираетесь использовать этот модуль для кеширования ответов по умолчанию, попробуйте модуль srcache-nginx-module с этим модулем, чтобы добиться этого.
При использовании совместно с lua-nginx-module рекомендуется использовать библиотеку lua-resty-memcached вместо этого модуля, потому что первая гораздо более гибкая и эффективная по памяти.
Соединения keep-alive с серверами memcached
Вам нужен HttpUpstreamKeepaliveModule вместе с этим модулем для поддержания TCP-соединений keep-alive с вашими задними серверами memcached.
Вот пример конфигурации:
http {
upstream backend {
server 127.0.0.1:11211;
# пул с максимум 1024 соединениями
# и не различает сервера:
keepalive 1024;
}
server {
...
location /memc {
set $memc_cmd get;
set $memc_key $arg_key;
memc_pass backend;
}
}
}
Как это работает
Он реализует протокол TCP для memcached полностью самостоятельно, основываясь на механизме upstream. Все операции ввода-вывода являются неблокирующими.
Сам модуль не поддерживает TCP-соединения с серверами memcached на верхнем уровне между запросами, как и другие модули upstream. Для рабочей версии см. раздел Соединения keep-alive с серверами memcached.
Поддерживаемые команды Memcached
Хранения команд memcached set, add, replace, prepend и append используют $memc_key как ключ, $memc_exptime как время истечения (или задержки) (по умолчанию 0), $memc_flags как флаги (по умолчанию 0), чтобы построить соответствующие запросы memcached.
Если $memc_value вообще не определено, то тело запроса будет использоваться как значение для $memc_value, за исключением команд incr и decr. Обратите внимание, что если $memc_value определено как пустая строка (""), то эта пустая строка все равно будет использоваться как значение.
Следующие команды memcached были реализованы и протестированы (с их параметрами, обозначенными соответствующими переменными nginx, определенными этим модулем):
get $memc_key
Извлекает значение с использованием ключа.
location /foo {
set $memc_cmd 'get';
set $memc_key 'my_key';
memc_pass 127.0.0.1:11211;
add_header X-Memc-Flags $memc_flags;
}
Возвращает 200 OK с помещенным в тело ответа значением, если ключ найден, или 404 Not Found в противном случае. Число flags будет записано в переменную $memc_flags, поэтому часто желательно добавить эту информацию в заголовки ответа с помощью стандартной директивы add_header.
Вернет 502 для ERROR, CLIENT_ERROR или SERVER_ERROR.
set $memc_key $memc_flags $memc_exptime $memc_value
Чтобы использовать тело запроса в качестве значения memcached, просто избегайте настройки переменной $memc_value:
# POST /foo
# моё значение...
location /foo {
set $memc_cmd 'set';
set $memc_key 'my_key';
set $memc_flags 12345;
set $memc_exptime 24;
memc_pass 127.0.0.1:11211;
}
Или позвольте переменной $memc_value содержать значение:
location /foo {
set $memc_cmd 'set';
set $memc_key 'my_key';
set $memc_flags 12345;
set $memc_exptime 24;
set $memc_value 'my_value';
memc_pass 127.0.0.1:11211;
}
Возвращает 201 Created, если сервер memcached ответит STORED, 200 для NOT_STORED, 404 для NOT_FOUND, 502 для ERROR, CLIENT_ERROR или SERVER_ERROR.
Оригинальные ответы memcached возвращаются как тело ответа, за исключением 404 NOT FOUND.
add $memc_key $memc_flags $memc_exptime $memc_value
Похоже на команду set.
replace $memc_key $memc_flags $memc_exptime $memc_value
Похоже на команду set.
append $memc_key $memc_flags $memc_exptime $memc_value
Похоже на команду set.
Обратите внимание, что по состоянию на версию memcached 1.2.2 команды "append" и "prepend" не поддерживаются. По крайней мере версии 1.2.4 и более поздние версии, похоже, поддерживают эти две команды.
prepend $memc_key $memc_flags $memc_exptime $memc_value
Похоже на команду append.
delete $memc_key
Удаляет запись memcached с использованием ключа.
location /foo {
set $memc_cmd delete;
set $memc_key my_key;
memc_pass 127.0.0.1:11211;
}
Возвращает 200 OK, если удаление прошло успешно, 404 Not Found для NOT_FOUND, или 502 для ERROR, CLIENT_ERROR или SERVER_ERROR.
Оригинальные ответы memcached возвращаются как тело ответа, за исключением 404 NOT FOUND.
delete $memc_key $memc_exptime
Похоже на команду delete $memc_key, за исключением того, что она принимает необязательное время expiration, заданное переменной $memc_exptime.
Эта команда больше недоступна в последней версии memcached 1.4.4.
incr $memc_key $memc_value
Увеличивает существующее значение $memc_key на количество, указанное в $memc_value:
location /foo {
set $memc_cmd incr;
set $memc_key my_key;
set $memc_value 2;
memc_pass 127.0.0.1:11211;
}
В приведенном выше примере каждый раз, когда мы обращаемся к /foo, значение my_key увеличивается на 2.
Возвращает 200 OK с новым значением, связанным с этим ключом, в теле ответа, если операция выполнена успешно, или 404 Not Found, если ключ не найден.
Вернет 502 для ERROR, CLIENT_ERROR или SERVER_ERROR.
decr $memc_key $memc_value
Похоже на incr $memc_key $memc_value.
flush_all
Обозначает все ключи на сервере memcached как истекшие:
location /foo {
set $memc_cmd flush_all;
memc_pass 127.0.0.1:11211;
}
flush_all $memc_exptime
Точно так же, как flush_all, но также принимает время истечения, заданное переменной $memc_exptime.
stats
Вызывает вывод общих статистических данных и настроек сервера memcached
location /foo {
set $memc_cmd stats;
memc_pass 127.0.0.1:11211;
}
Возвращает 200 OK, если запрос выполнен успешно, или 502 для ERROR, CLIENT_ERROR или SERVER_ERROR.
Сырой вывод команды stats от верхнего сервера memcached будет помещен в тело ответа.
Директивы
Все стандартные директивы модуля memcached в nginx 0.8.28 наследуются прямо, с заменой префикса memcached_ на memc_. Например, директива memcached_pass записывается как memc_pass.
Здесь мы документируем только две самые важные директивы (вторая - это новая директива, введенная этим модулем).
memc_pass
синтаксис: memc_pass <IP-адрес memcached-сервера>:<порт memcached-сервера>
синтаксис: memc_pass <имя хоста memcached-сервера>:<порт memcached-сервера>
синтаксис: memc_pass <имя_upstream_backend>
синтаксис: memc_pass unix:<путь_к_unix_домашнему_сокету>
по умолчанию: нет
контекст: http, server, location, if
фаза: контент
Укажите бэкенд сервера memcached.
memc_cmds_allowed
синтаксис: memc_cmds_allowed <cmd>...
по умолчанию: нет
контекст: http, server, location, if
Перечисляет команды memcached, которые разрешено использовать. По умолчанию доступны все команды memcached, поддерживаемые этим модулем. Пример:
location /foo {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;
set $memc_value $arg_val;
memc_pass 127.0.0.1:11211;
memc_cmds_allowed get;
}
memc_flags_to_last_modified
синтаксис: memc_flags_to_last_modified on|off
по умолчанию: off
контекст: http, server, location, if
Читает флаги memcached как секундный временной формат и устанавливает его как значение заголовка Last-Modified. Для условного GET это будет сигнализировать nginx об ответе 304 Not Modified, чтобы сэкономить трафик.
memc_connect_timeout
синтаксис: memc_connect_timeout <время>
по умолчанию: 60s
контекст: http, server, location
Таймаут на соединение с сервером memcached, по умолчанию в секундах.
Разумно всегда явно указывать единицу времени, чтобы избежать путаницы. Поддерживаемые единицы времени: "s" (секунды), "ms" (миллисекунды), "y" (годы), "M" (месяцы), "w" (недели), "d" (дни), "h" (часы) и "m" (минуты).
Это время должно быть меньше 597 часов.
memc_send_timeout
синтаксис: memc_send_timeout <время>
по умолчанию: 60s
контекст: http, server, location
Таймаут на отправку TCP-запросов на сервер memcached, по умолчанию в секундах.
Разумно всегда явно указывать единицу времени, чтобы избежать путаницы. Поддерживаемые единицы времени: "s" (секунды), "ms" (миллисекунды), "y" (годы), "M" (месяцы), "w" (недели), "d" (дни), "h" (часы) и "m" (минуты).
Это время должно быть меньше 597 часов.
memc_read_timeout
синтаксис: memc_read_timeout <время>
по умолчанию: 60s
контекст: http, server, location
Таймаут на чтение TCP-ответов от сервера memcached, по умолчанию в секундах.
Разумно всегда явно указывать единицу времени, чтобы избежать путаницы. Поддерживаемые единицы времени: "s" (секунды), "ms" (миллисекунды), "y" (годы), "M" (месяцы), "w" (недели), "d" (дни), "h" (часы) и "m" (минуты).
Это время должно быть меньше 597 часов.
memc_buffer_size
синтаксис: memc_buffer_size <размер>
по умолчанию: 4k/8k
контекст: http, server, location
Этот размер буфера используется для памяти, чтобы удерживать
- полный ответ для команд memcached, кроме
get, - полный заголовок ответа (т.е. первая строка ответа) для команды
getmemcached.
Этот размер по умолчанию соответствует размеру страницы, может быть 4k или 8k.
memc_ignore_client_abort
синтаксис: memc_ignore_client_abort on|off
по умолчанию: off
контекст: location
Определяет, следует ли закрывать соединение с сервером memcached, когда клиент закрывает соединение, не дождавшись ответа.
Эта директива была впервые добавлена в выпуске v0.14.
Изменения
Изменения каждого релиза этого модуля можно получить из журналов изменений пакета OpenResty:
Набор тестов
Этот модуль поставляется с набором тестов, управляемым Perl. Тестовые случаи также декларативны. Спасибо модулю Test::Base из мира Perl.
Чтобы запустить его на своей стороне:
$ PATH=/path/to/your/nginx-with-memc-module:$PATH prove -r t
Вам нужно завершить все процессы Nginx, прежде чем запускать набор тестов, если вы изменили двоичный файл сервера Nginx.
Либо LWP::UserAgent, либо IO::Socket используется тестовым каркасом test scaffold.
Поскольку один сервер nginx (по умолчанию, localhost:1984) используется во всех тестовых скриптах (.t файлы), нет смысла запускать набор тестов параллельно, указывая -jN при вызове утилиты prove.
Вам также следует убедиться, что сервер memcached слушает на порту 11211 на localhost перед выполнением набора тестов.
Некоторые части набора тестов требуют, чтобы модули rewrite и echo также были включены при сборке Nginx.
См. также
- Оригинальное объявление по электронной почте на почтовом списке nginx: ngx_memc: "расширенная версия ngx_memcached, которая поддерживает set, add, delete и многие другие команды"
- Мои слайды, демонстрирующие различные варианты использования ngx_memc: http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#34 (используйте стрелочные или клавиши PageUp/PageDown на клавиатуре для переключения страниц)
- Последний TCP-протокол memcached.
- Модуль ngx_srcache
- Библиотека lua-resty-memcached, основанная на API cosocket lua-nginx-module.
- Стандартный модуль memcached.
- Модуль echo для автоматического тестирования модулей Nginx.
- Стандартный модуль заголовков и сторонний модуль headers-more.