1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Nuster-Proxy

Клонировать/Скачать
README-CN.md 28 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 05:20 f7882a6

Nuster

Основанный на HAProxy высокопроизводительный HTTP-сервер с кешированием и RESTful NoSQL-кеш-сервер.

Основы

Nuster — это основанный на HAProxy сервер с высокой производительностью, который может использоваться как HTTP/TCP-балансировщик нагрузки или как HTTP-кеш-сервер для динамических и статических ресурсов. Также он может работать как RESTful NoSQL кеш-сервер, используя HTTP POST/GET/DELETE для добавления, получения и удаления данных «ключ-значение».

  • HTTP/TCP балансировщик нагрузки

    • Наследует все функции HAProxy.
    • Балансировка нагрузки.
    • Поддержка HTTPS.
    • Кеширование HTTP.
    • Перезапись и перенаправление HTTP.
    • Изменение информации в HTTP.
    • HTTP/2.
    • Мониторинг.
    • Прилипание.
    • Контроль доступа.
    • Смена содержимого.
  • Кеш HTTP-сервера

    • Все функции HAProxy (HTTPS, HTTP/2, ACL и т. д.).
    • Быстрый.
    • Мощные динамические функции кеширования.
      • Основан на методе HTTP, URI, пути, запросе, заголовке, файлах cookie и т.д.
      • Основывается на запросе или ответе HTTP и т. д.
      • Основывается на переменных среды, состоянии сервера и т. д.
      • Основывается на версии SSL, SNI и т. д.
      • Основывается на скорости соединения, количестве, размере и т. д.
    • Управление кешем.
    • Очистка кеша.
    • Статистика кеша.
    • Время жизни кеша.
    • Постоянное хранение.
  • RESTful NoSQL кеш-сервер

    • Может использоваться как Memcached или Redis для хранения данных между приложениями и базами данных или между пользователями и приложениями.
    • Поддерживает заголовок, файлы cookie и другие функции, поэтому можно хранить данные разных пользователей по одному и тому же пути.
    • Имеет все функции HAProxy (HTTPS, HTTP/2, ACL и т. д.)
    • Условное кеширование.
    • Внутренний кеш «ключ-значение» (KV).
    • Пользовательский кеш.
    • Поддержка любых типов данных.
    • Совместимость со всеми языками программирования без необходимости использования специальных библиотек, требуется только поддержка HTTP.
    • Постоянное хранилище.

Производительность

Очень высокая, в однопроцессном режиме в три раза быстрее nginx, в многопроцессном — в два раза, а также в три раза быстрее Varnish.

Подробности см. в разделе «Benchmark».

Руководство по началу работы

  • Загрузка

    • Для производственной среды загрузите последнюю стабильную версию с помощью команды Download.md. В других случаях можно использовать git clone.
  • Компиляция

    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.

  • Global — определяет глобальные команды. Необходимо определить nuster cache on или nuster nosql on, иначе нельзя будет использовать cache и nosql.
  • Defaults — определяет параметры по умолчанию для frontend и backend. Можно переопределить в frontend или backend.
  • Frontend — определяет настройки, связанные с прослушиванием порта и другими аспектами, ориентированными на пользователя.
  • Backend — определяет параметры для серверов backend. Необходимо установить nuster cache on или nuster nosql on, иначе backend не будет иметь функций nosql или nosql. Необходимо также установить nuster rule.

Можно определить несколько 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;
  • схема: http;
  • хост: www.example.com;
  • URI: /q?name=X&type=Y;
  • путь: /q;
  • разделитель: ?;
  • запрос: name=X&type=Y;
  • заголовок ASDF: Z;
  • cookie пользователя: nuster;
  • параметр типа: Y;
  • тело: пусто.

По умолчанию создаётся ключ 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-символ.

Одинаковые ключи запросов будут возвращать кэш клиенту напрямую.

TTL auto|TTL

Устанавливает время жизни кэша, после истечения которого кэш будет удалён. Можно использовать d, h, m и s. По умолчанию 0 секунд. Если не хотите, чтобы срок действия истёк, установите значение 0.

При использовании auto ttl автоматически использует значение s-maxage или max-age заголовка cache-control.

Другие инструкции cache-control не обрабатываются.

Максимальное значение ttl составляет 2147483647.

Можно установить ключевое слово extend для автоматического продления срока действия кэша.

Extend 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% ->|

Кэш будет продлён, если выполняются следующие условия:

  1. A4 > A3 > A2;
  2. между ttl и ttl * (1 + n4 %) есть новый запрос.

on фактически равен 33,33,33,33.

Wait on|off|TIME [только для кэша]

Если одновременно есть одинаковые запросы, ждать ли завершения кэширования. wait on означает ожидание до тех пор, пока другие запросы не завершат кэширование, wait TIME указывает на то, что после ожидания в течение TIME секунд, если кэширование ещё не завершено, перенаправлять на серверную часть.

По умолчанию ожидание не выполняется, и все запросы перенаправляются на серверную часть, первый запрос генерирует кэш (wait off).

Обратите внимание, что только после завершения некоторых инициализаций первого запроса другие запросы будут ожидать.

В режиме nosql ожидание не происходит, все запросы обрабатываются последовательно, и содержимое последнего запроса сохраняется.

Максимальное значение составляет 2147483647.

Use-stale on|off|TIME [только для кэша]

Определяет, следует ли использовать устаревший кэш при обновлении и следует ли использовать его при сбое серверной части из-за тайм-аута.

Когда use-stale включён, используется устаревший кэш во время обновления.

Когда use-stale выключен, если wait выключен, то все запросы будут перенаправлены на серверную часть; в противном случае они будут ждать.

use-stale TIME позволяет продолжать использовать кэш в течение времени TIME секунд после сбоя серверной части из-за тайм-аута.

Максимальное значение составляет 2147483647.

Inactive off|TIME

После неактивности в течение TIME секунд кэш удаляется. По умолчанию выключено.

Обратите внимание, что кэш не обязательно будет удалён после неактивности в течение периода TIME. Если процесс очистки запускается до того, как новый запрос обращается к кэшу, кэш будет очищен. Если новый запрос поступает до запуска процесса очистки, время последнего доступа кэша обновляется, и кэш не будет очищен. Не используется время доступа файла кэша на жёстком диске, и время последнего доступа кеша устанавливается при перезапуске nuster после перезагрузки.

Максимальное значение: 2147483647.

Code CODE1,CODE2...

По умолчанию кэшируются только ответы со статусом 200. Если необходимо кэшировать другие статусы, их можно добавить, all будет кэшировать любой код состояния.

cache-rule only200
cache-rule 200and404 code 200,404
cache-rule all code all

Memory on|off

Сохраняет ли данные в памяти, по умолчанию включено.

См. раздел «Хранилище».

Disk on|off|sync

Сохраняются ли данные на диск, как они сохраняются, по умолчанию отключено.

Необходимо установить memory on для использования disk sync.

См. раздел «Хранилище».

Etag on|off

Определяет, обрабатывается ли условие etag. Если нет ETag, он добавляется.

По умолчанию отключён.

Last-modified on|off

Определяет, обрабатывается ли условие last-modified. Если отсутствует Last-Modified, оно добавляется.

По умолчанию отключён.

If|unless condition

Определяют условия ACL.

ACL выполняются отдельно на этапе запроса и на этапе ответа.

Кэширование выполняется, когда выполняются следующие условия:

  1. На этапе запроса ACL истинно.
  2. На этапе запроса ACL ложно, но на этапе ответа ACL истинно.

Следует обратить особое внимание на использование отрицательного ACL или некоторых методов выборки образцов.

Например:

  1. Кэшировать запросы, начинающиеся с /img/.

    nuster rule img if { path_beg /img/ }

На этапе запроса ACL либо истинно, либо ложно, поскольку невозможно получить path на этапе ответа, поэтому он всегда ложен.

  1. Кэшируйте ответы с заголовком http Content-Type, равным image/jpeg.

    nuster rule jpeg if { res.hdr(Content-Type) image/jpeg }

Поскольку невозможно получить res.hdr на этапе запроса, он всегда ложен, а на этапе ответа он может быть истинным или ложным.

  1. Кэширование запросов, начинающихся с /img/, и ответов с заголовком Content-Type, равным image/jpeg.

Если определено следующее правило, оно не удастся:

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

Ответ

Проверьте код состояния:

  • 200 OK:
    • POST/GET: успех;
    • DELETE: всегда.
  • 400 Bad request:
    • пустое значение;
    • неправильное ACL, правила и т. д.
  • 404 Not Found:
    • POST: тест правила не пройден;
    • GET: не найдено.
  • 405 Method Not Allowed: другие методы.
  • 500 Internal Server Error: произошла неизвестная ошибка.
  • 507 Insufficient Storage: превышен размер данных.

Заголовки

Поддерживаемые заголовки в запросе:

Имя Значение Описание
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:

  1. Включить контроль доступа.
  2. Если есть несколько заголовков, обрабатывать в порядке name, path & host, path, regex & host, regex, host.
    curl -X DELETE -H "name: rule1" -H "path: /imgs/a.jpg": очистить по имени.
  3. Если есть повторяющиеся заголовки, обработать первый.
    curl -X DELETE -H "name: rule1" -H "name: rule2": очистить правилом rule1.
  4. regex не является глобом.
    Например, файлы .jpg под /imgs — это ^/imgs/.jpg$, а не /imgs/*.jpg.
  5. Только после завершения загрузки диска можно очистить кэш-файлы через прокси-имя или имя правила, хост, путь или регулярное выражение. Можно проверить URL статистики, чтобы узнать, завершена ли загрузка.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-Nuster-Proxy.git
git@api.gitlife.ru:oschina-mirror/mirrors-Nuster-Proxy.git
oschina-mirror
mirrors-Nuster-Proxy
mirrors-Nuster-Proxy
master