Nuster
Основанный на HAProxy высокопроизводительный HTTP-сервер с кешированием и RESTful NoSQL-кеш-сервер.
Основы
Nuster — это основанный на HAProxy сервер с высокой производительностью, который может использоваться как HTTP/TCP-балансировщик нагрузки или как HTTP-кеш-сервер для динамических и статических ресурсов. Также он может работать как RESTful NoSQL кеш-сервер, используя HTTP POST/GET/DELETE для добавления, получения и удаления данных «ключ-значение».
HTTP/TCP балансировщик нагрузки
Кеш HTTP-сервера
RESTful NoSQL кеш-сервер
Производительность
Очень высокая, в однопроцессном режиме в три раза быстрее nginx, в многопроцессном — в два раза, а также в три раза быстрее Varnish.
Подробности см. в разделе «Benchmark».
Руководство по началу работы
Загрузка
Компиляция
make TARGET=linux-glibc USE_LUA=1 LUA_INC=/usr/include/lua5.3 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1
make install PREFIX=/usr/local/nuster
Добавьте USE_PTHREAD_PSHARED=1 для использования pthread.
Если не нужно, удалите USE_LUA=1, LUA_INC=/usr/include/lua5.3, USE_OPENSSL=1, USE_PCRE=1 и USE_ZLIB=1.
Более подробную информацию можно найти в документации HAProxy INSTALL.
Конфигурационный файл Подготовьте конфигурационный файл nuster.cfg:
global
nuster cache on data-size 100m
nuster nosql on data-size 200m
master-worker # v3
defaults
mode http
frontend fe
bind *:8080
#bind *:4433 ssl crt example.com.pem alpn h2,http/1.1
use_backend be2 if { path_beg /_kv/ }
default_backend be1
backend be1
nuster cache on
nuster rule img ttl 1d if { path_beg /img/ }
nuster rule api ttl 30s if { path /api/some/api }
server s1 127.0.0.1:8081
server s2 127.0.0.1:8082
backend be2
nuster nosql on
nuster rule r1 ttl 3600
Nuster прослушивает порт 8080 и принимает HTTP-запросы. Запросы, начинающиеся с /_kv/, направляются в backend be2, где можно отправлять HTTP POST/GET/DELETE на /_kv/any_key для добавления, извлечения или удаления данных «ключ-значение». Остальные запросы направляются в backend be1 и пересылаются на серверы s1 или s2. Запросы /img/* будут кэшироваться в течение одного дня, а /api/some/api — в течение 30 секунд.
Запуск
/usr/local/nuster/sbin/nuster -f nuster.cfg
Docker
docker pull nuster/nuster
docker run -d -v /path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro -p 8080:8080 nuster/nuster
Использование
Nuster основан на HAProxy и поддерживает все его команды.
Основные принципы
В конфигурационном файле есть четыре основных раздела: global, defaults, frontend и backend.
Можно определить несколько frontend или backend. Если определено nuster cache|nosql off или не определено nuster cache|nosql on|off, nuster становится обычным HAProxy. Невозможно определить listen в nuster.
Для получения более подробной информации обратитесь к документации HAProxy или онлайн-документации HAProxy. Кэш по умолчанию использует ключ method.scheme.host.uri
для NoSQL и GET.scheme.host.uri
— для CACHE.
Пример:
GET http://www.example.com/q?name=X&type=Y
HTTP-заголовок:
GET /q?name=X&type=Y HTTP/1.1
Host: www.example.com
ASDF: Z
Cookie: logged_in=yes; user=nuster;
Генерируется следующее:
По умолчанию создаётся ключ GET\0http\0www.example.com\0/q?name=X&type=Y\0
, а key method.scheme.host.path.header_ASDF.cookie_user.param_type
генерирует GET\0http\0www.example.com\0/q\0Z\0nuster\0Y\0
.
\0 — это NULL-символ.
Одинаковые ключи запросов будут возвращать кэш клиенту напрямую.
Устанавливает время жизни кэша, после истечения которого кэш будет удалён. Можно использовать d, h, m и s. По умолчанию 0 секунд. Если не хотите, чтобы срок действия истёк, установите значение 0.
При использовании auto ttl автоматически использует значение s-maxage или max-age заголовка cache-control.
Другие инструкции cache-control не обрабатываются.
Максимальное значение ttl составляет 2147483647.
Можно установить ключевое слово extend для автоматического продления срока действия кэша.
Автоматически продлевает срок действия кэша.
extend on|off|n1,n2,n3,n4
по умолчанию: off.
n1, n2, n3, n4: целые числа меньше 100, сумма n1 + n2 + n3 также меньше 100. Они определяют четыре временных интервала:
время: 0 ttl ttl * (1 + n4%)
доступ: | A1 | A2 | A3 | A4 | |
|---------------------------|---------|---------|---------|---------|
процент: |<- (100 - n1 - n2 - n3)% ->|<- n1% ->|<- n2% ->|<- n3% ->|<- n4% ->|
Кэш будет продлён, если выполняются следующие условия:
on фактически равен 33,33,33,33.
Если одновременно есть одинаковые запросы, ждать ли завершения кэширования. wait on означает ожидание до тех пор, пока другие запросы не завершат кэширование, wait TIME указывает на то, что после ожидания в течение TIME секунд, если кэширование ещё не завершено, перенаправлять на серверную часть.
По умолчанию ожидание не выполняется, и все запросы перенаправляются на серверную часть, первый запрос генерирует кэш (wait off).
Обратите внимание, что только после завершения некоторых инициализаций первого запроса другие запросы будут ожидать.
В режиме nosql ожидание не происходит, все запросы обрабатываются последовательно, и содержимое последнего запроса сохраняется.
Максимальное значение составляет 2147483647.
Определяет, следует ли использовать устаревший кэш при обновлении и следует ли использовать его при сбое серверной части из-за тайм-аута.
Когда use-stale включён, используется устаревший кэш во время обновления.
Когда use-stale выключен, если wait выключен, то все запросы будут перенаправлены на серверную часть; в противном случае они будут ждать.
use-stale TIME позволяет продолжать использовать кэш в течение времени TIME секунд после сбоя серверной части из-за тайм-аута.
Максимальное значение составляет 2147483647.
После неактивности в течение TIME секунд кэш удаляется. По умолчанию выключено.
Обратите внимание, что кэш не обязательно будет удалён после неактивности в течение периода TIME. Если процесс очистки запускается до того, как новый запрос обращается к кэшу, кэш будет очищен. Если новый запрос поступает до запуска процесса очистки, время последнего доступа кэша обновляется, и кэш не будет очищен. Не используется время доступа файла кэша на жёстком диске, и время последнего доступа кеша устанавливается при перезапуске nuster после перезагрузки.
Максимальное значение: 2147483647.
По умолчанию кэшируются только ответы со статусом 200. Если необходимо кэшировать другие статусы, их можно добавить, all будет кэшировать любой код состояния.
cache-rule only200
cache-rule 200and404 code 200,404
cache-rule all code all
Сохраняет ли данные в памяти, по умолчанию включено.
См. раздел «Хранилище».
Сохраняются ли данные на диск, как они сохраняются, по умолчанию отключено.
Необходимо установить memory on для использования disk sync.
См. раздел «Хранилище».
Определяет, обрабатывается ли условие etag. Если нет ETag, он добавляется.
По умолчанию отключён.
Определяет, обрабатывается ли условие last-modified. Если отсутствует Last-Modified, оно добавляется.
По умолчанию отключён.
Определяют условия ACL.
ACL выполняются отдельно на этапе запроса и на этапе ответа.
Кэширование выполняется, когда выполняются следующие условия:
Следует обратить особое внимание на использование отрицательного ACL или некоторых методов выборки образцов.
Например:
Кэшировать запросы, начинающиеся с /img/.
nuster rule img if { path_beg /img/ }
На этапе запроса ACL либо истинно, либо ложно, поскольку невозможно получить path на этапе ответа, поэтому он всегда ложен.
Кэшируйте ответы с заголовком http Content-Type, равным image/jpeg.
nuster rule jpeg if { res.hdr(Content-Type) image/jpeg }
Поскольку невозможно получить res.hdr на этапе запроса, он всегда ложен, а на этапе ответа он может быть истинным или ложным.
Если определено следующее правило, оно не удастся:
nuster rule img if { path_beg /img/ } { res.hdr(Content-Type) image/jpeg }
Потому что невозможно получить path на этапе ответа, поэтому всегда ложно, а на этапе запроса невозможно получить res.hdr, поэтому всегда ложно, так что этот ACL никогда не будет соответствовать.
Его нужно определить следующим образом:
http-request set-var(txn.pathImg) path
acl pathImg var(txn.pathImg) -m beg /img/
acl resHdrCT res.hdr(Content-Type) image/jpeg
nuster rule r3 if pathImg resHdrCT
Или nuster.path (v5):
nuster rule r3 if { nuster.path -m beg /img } { res.hdr(Content-Type) image/jpeg } **HTTP-запрос set-var(txn.path) path**
ACL NoCache var(txn.path) -m beg /api/ Nuster rule r1 if !NoCache
Подробности см. в разделе «Получение образцов» (Sample fetches).
Кэш
Nuster может использоваться как HTTP-кэш, подобный Varnish или Nginx, для кэширования динамических и статических HTTP-ресурсов. Помимо функций HAProxy SSL, HTTP, HTTP2, перезаписи, перенаправления и добавления/изменения заголовков, он также предоставляет следующие функции:
global
nuster cache on data-size 200m
frontend fe
bind *:8080
default_backend be
backend be
nuster cache on
nuster rule r1 if { path /a1 }
nuster rule r2 key method.scheme.host.path.delimiter.query.cookie_userId if { path /a2 }
nuster rule r3 ttl 10 if { path /a3 }
nuster rule r4 disk on if { path /a4 }
server s1 127.0.0.1:8081
Nuster последовательно проверяет правила, сначала генерирует ключ, а затем ищет его. Если ключ найден, то возвращает кэш, иначе проверяет ACL. Если ACL проходит, то сохраняет ответ в кэше.
NoSQL
Nuster также может использоваться в качестве RESTful NoSQL-кэша, где HTTP POST/GET/DELETE используется для добавления/получения/удаления Key/Value.
Основные операции
Set:
curl -v -X POST -d value1 http://127.0.0.1:8080/key1
curl -v -X POST --data-binary @icon.jpg http://127.0.0.1:8080/imgs/icon.jpg
Get:
curl -v http://127.0.0.1:8080/key1
Delete:
curl -v -X DELETE http://127.0.0.1:8080/key1
Ответ
Проверьте код состояния:
Заголовки
Поддерживаемые заголовки в запросе:
Имя | Значение | Описание |
---|---|---|
content-type | любое | Будет возвращено как есть в GET-запросе |
cache-control | s-maxage или max-age | Используется для установки ttl, когда правило.ttl равно auto |
Разделение пользовательских данных
Добавление заголовка, cookie и других параметров в ключ позволяет хранить данные разных пользователей по одному пути.
nuster rule r1 key method.scheme.host.uri.header_userId if { path /mypoint }
nuster rule r2 key method.scheme.host.uri.cookie_sessionId if { path /mydata }
Set:
curl -v -X POST -d "333" -H "userId: 1000" http://127.0.0.1:8080/mypoint
curl -v -X POST -d "555" -H "userId: 1001" http://127.0.0.1:8080/mypoint
curl -v -X POST -d "userA data" --cookie "sessionId=ijsf023xe" http://127.0.0.1:8080/mydata
curl -v -X POST -d "userB data" --cookie "sessionId=rosre329x" http://127.0.0.1:8080/mydata
Get:
curl -v http://127.0.0.1:8080/mypoint
< 404 Not Found
curl -v -H "userId: 1000" http://127.0.0.1:8080/mypoint
< 200 OK
333
curl -v --cookie "sessionId=ijsf023xe" http://127.0.0.1:8080/mydata
< 200 OK
userA data
Клиент
Поддерживает любой клиент, поддерживающий HTTP, например, curl, postman, python requests, go net/http и др.
Управление
Можно определить endpoint с помощью uri и отправить HTTP-запрос для управления.
Определение и включение:
nuster manager on uri /internal/nuster purge-method PURGEX
Методы
Метод | Endpoint | Описание |
---|---|---|
GET | /internal/nuster | Получение статистики |
POST | /internal/nuster | Включение/отключение правил, обновление ttl |
DELETE | /internal/nuster | Расширенная очистка |
PURGEX | /any/real/path | Базовая очистка |
Статистика
Статистическую информацию можно получить через GET на определённом endpoint.
Использование:
curl http://127.0.0.1/nuster
Вывод:
**NUSTER**
nuster.cache: on
nuster.nosql: on
nuster.manager: on
**MANAGER**
manager.uri: /nuster
manager.purge_method: PURGE
**DICT**
dict.cache.size: 1048576
dict.cache.length: 131072
dict.cache.used: 0
dict.cache.cleanup_idx: 0
dict.cache.sync_idx: 0
dict.nosql.size: 1048576
dict.nosql.length: 131072
dict.nosql.used: 0
dict.nosql.cleanup_idx: 0
dict.nosql.sync_idx: 0
**STORE MEMORY**
store.memory.cache.size: 2098200576
store.memory.cache.used: 1048960
store.memory.cache.count: 0
store.memory.nosql.size: 11534336
store.memory.nosql.used: 1048960
store.memory.nosql.count: 0
**STORE DISK**
store.disk.cache.dir: /tmp/nuster/cache
store.disk.cache.loaded: yes
``` **Если известен весь query, то можно удалять по одному:**
curl -XPURGE http://127.0.0.1/imgs/test.jpg?w=120&h=120
curl -XPURGE http://127.0.0.1/imgs/test.jpg?w=180&h=180
В большинстве случаев не известен весь query.
Если часть query не важна, её можно удалить из ключа:
Определение nuster rule imgs key method.scheme.host.path if { path_beg /imgs }
, тогда будет создан только один кэш, и нет необходимости удалять query для очистки кэша.
curl -XPURGE http://127.0.0.1/imgs/test.jpg
В большинстве случаев query необходим.
Удаление через имя правила:
curl -X PURGE -H "name: imgs" http://127.0.0.1/nuster/cache
Однако если правило определено как nuster rule static if { path_beg /imgs/ /css/ }
, то нельзя удалить только imgs.
Поэтому можно использовать путь для удаления.
Заголовки:
Заголовок | Значение | Описание |
---|---|---|
path | PATH | Кэши с ${PATH} будут удалены |
host | HOST | И хост — это ${HOST} |
nuster-host | HOST | У nuster-host более высокий приоритет над host |
mode | cache, nosql | Очистить кэш или данные nosql |
Примеры:
# Удалить все пути /imgs/test.jpg в кэше
curl -X DELETE -H "path: /imgs/test.jpg" http://127.0.0.1/nuster
# Удалить все пути /imgs/test.jpg и хост 127.0.0.1:8080 в кэше
curl -X DELETE -H "path: /imgs/test.jpg" -H "nuster-host: 127.0.0.1:8080" http://127.0.0.1/nuster
Также можно удалить через регулярное выражение, все соответствующие регулярному выражению кэши будут удалены.
Заголовки:
Заголовок | Значение | Описание |
---|---|---|
regex | REGEX | Кэши, путь которых соответствует ${REGEX}, будут удалены |
host | HOST | И хост — это ${HOST} |
nuster-host | HOST | У nuster-host более высокий приоритет над host |
mode | cache, nosql | Очистить кэш или данные nosql |
Примеры:
# Удалить все /imgs начинающиеся .jpg в конце кэша
curl -X DELETE -H "regex: ^/imgs/.jpg$" http://127.0.0.1/nuster
# Удалить все кэши, которые начинаются с /imgs и заканчиваются на .jpg, а также имеют хост 127.0.0.1:8080
curl -X DELETE -H "regex: ^/imgs/.jpg$" -H "127.0.0.1:8080" http://127.0.0.1/nuster
Примечание об очистке PURGE:
name
, path & host
, path
, regex & host
, regex
, host
.curl -X DELETE -H "name: rule1" -H "path: /imgs/a.jpg"
: очистить по имени.curl -X DELETE -H "name: rule1" -H "name: rule2"
: очистить правилом rule1
.regex
не является глобом.^/imgs/.jpg$
, а не /imgs/*.jpg
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )