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

OSCHINA-MIRROR/nuster-nuster

Клонировать/Скачать
README-CN.md 50 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 24.11.2024 17:32 994efa8

nuster

Wiki | English | 中文 | 日本語

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

Информация в китайской версии может быть неактуальной. Пожалуйста, обратитесь к английской версии README.md.

Содержание

Введение

nuster — это высокопроизводительный HTTP-кэширующий сервер и RESTful NoSQL-кэширующий сервер, основанный на HAProxy, который полностью совместим с HAProxy и использует функции ACL HAProxy для предоставления очень точных правил кэширования.

Особенности

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

nuster можно использовать в качестве балансировщика нагрузки HTTP/TCP.

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

HTTP-кеширующий сервер

nuster также можно использовать как HTTP-кеширующий сервер наподобие Varnish или Nginx для кэширования динамических или статических HTTP-ресурсов.

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

RESTful NoSQL-кеширующий сервер

nuster также может использоваться в качестве RESTful NoSQL-кеширующего сервера, используя HTTP POST/GET/DELETE для добавления/получения/удаления Key/Value.

Его можно разместить между приложением и базой данных в качестве внутреннего KV-кэша, как Memcached или Redis, или между пользователем и приложением в качестве ориентированного на пользователя NoSQL. Поддерживает заголовки, файлы cookie и т.д., поэтому разные пользовательские данные могут храниться в одном и том же пути.

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

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

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

Подробнее см. бенчмарк.

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

Загрузка

Для производственной среды загрузите последнюю стабильную версию с Download, в противном случае вы можете выполнить 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, чтобы добавить/получить/удалить Key/Value. Все остальные запросы направляются на бэкэнд be1 и будут переадресованы на серверы s1 или s2. Среди них /img/* запросы будут кэшироваться в течение 1 дня, а /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 и поддерживает все команды HAProxy.

Основные

Файл конфигурации содержит четыре основных раздела: global, defaults, frontend и backend.

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

Можно определить несколько frontend или backend. Если определено nuster cache|nosql off, или не определено nuster cache|nosql on|off, то nuster является обычным HAProxy.

Невозможно определить listen в nuster.

Пожалуйста, обратитесь к разделу /doc документации HAProxy или онлайн-документации HAProxy.

В качестве TCP-балансировщика нагрузки

frontend mysql-lb
   bind *:3306
   mode tcp
   default_backend mysql-cluster
backend mysql-cluster
   balance roundrobin
   mode tcp
   server s1 10.0.0.101:3306
   server s2 10.0.0.102:3306
   server s3 10.0.0.103:3306

В качестве HTTP/HTTPS-балансировщика нагрузки

frontend web-lb
   bind *:80
   #bind *:443 ssl crt XXX.pem
   mode http
   default_backend apps
backend apps
   balance roundrobin
   mode **HTTP как кэш-сервер**

server s1 10.0.0.101:8080 server s2 10.0.0.102:8080 server s3 10.0.0.103:8080 #server s4 10.0.0.101:8443 ssl verify none


**Как RESTful NoSQL кэш-сервер**

global nuster cache on data-size 200m frontend fe bind *:8080 default_backend be backend be nuster cache on nuster rule all server s1 127.0.0.1:8081


### **Команды**

#### **global: nuster manager**

Синтаксис:
*nuster manager on|off [uri URI] [purge-method method]*

По умолчанию: off

Контекст: global

Определяет и включает manager/stats/purge API, uri и purge method.

По умолчанию выключено. Если включено, обратите внимание на включение контроля доступа (см. раздел FAQ).

Для получения дополнительной информации см. раздел «Управление».

*uri*

Настраиваемый URI менеджера, по умолчанию — `/nuster`.

*purge-method*

HTTP метод, используемый для очистки, по умолчанию — `PURGE`.

#### **global: nuster cache|nosql**

Синтаксис:

*nuster cache on|off [data-size size] [dict-size size] [dir DIR] [dict-cleaner n] [data-cleaner n] [disk-cleaner n] [disk-loader n] [disk-saver n] [clean-temp on|off] [always-check-disk on|off]*

*nuster nosql on|off [data-size size] [dict-size size] [dir DIR] [dict-cleaner n] [data-cleaner n] [disk-cleaner n] [disk-loader n] [disk-saver n] [clean-temp on|off] [always-check-disk on|off]*

По умолчанию: нет

Контекст: глобальный

Управляет включением или отключением кэша или nosql.

Будет выделена общая память размером data-size + dict-size для хранения HTTP-заголовков, данных, ключей и т. д., а временные данные будут выделены из системной памяти.
Если памяти недостаточно, новые запросы не будут кэшироваться до тех пор, пока не освободится память.

*data-size*

Совместно с dict-size определяет размер блока памяти.

Можно использовать m, M, g и G. По умолчанию — 1 МБ, что также является минимальным значением.

*dict-size*

Определяет размер хеш-таблицы.

Можно использовать m, M, g и G. По умолчанию — 1 МБ, что также является минимальным значением.

Этот параметр определяет размер корзины хеш-таблицы, а не размер ключа, который хранится в общей памяти.

Размер dict-size (количество корзин) не равен количеству ключей. Даже если количество ключей превышает размер dict-size, новые ключи могут быть добавлены, если есть свободное место в общей памяти. Однако, если количество ключей больше размера dict-size (количества корзин), производительность может снизиться. Размер dict-size можно установить примерно равным максимальному количеству ключей, умноженному на 8. Конечно, чем больше, тем лучше.

Чтобы просмотреть статистику API:

dict.nosql.length: 131072 dict.nosql.used: 0


Если значение dict.nosql.used больше значения dict.nosql.length, рекомендуется увеличить размер dict-size.

> В будущих версиях dict-size будет удалён, и автоматическое расширение будет выполнено так же, как и в первой версии.

*dir*

Устанавливает корневой каталог для файлов кэша на жёстком диске, который необходимо настроить для включения функции кэширования на жёстком диске.

Если включён chroot, то фактический путь будет chroot+dir. Например:

chroot /data nuster cache on dir /cache


Тогда фактическое расположение кэша будет: /data/cache.

*dict-cleaner*

Проверяет не более dict-cleaner записей за один раз, и недействительные записи удаляются (по умолчанию 1000).

*data-cleaner*

Проверяет не более data-cleaner записей за раз, и недействительные данные удаляются (по умолчанию 1000).

Когда процент недействительных данных превышает 20%, внутренний механизм очистки ускоряется, поэтому не рекомендуется изменять это значение.

*disk-cleaner*

Проверяет не более disk-cleaner файлов кэша жёсткого диска за раз, и недействительные файлы удаляются (по умолчанию 100).

*disk-loader*

После запуска загружает информацию о не более чем disk-loader файлах кэша жёсткого диска в память (по умолчанию 100).

При использовании USE_THREAD отдельный поток будет выполнять загрузку, и этот параметр будет игнорироваться.

*disk-saver*

Проверяет не более disk-saver данных за раз и сохраняет данные, которые необходимо сохранить на жёсткий диск, на жёсткий диск (по умолчанию 100).

Дополнительную информацию см. в разделе «Хранилище».

*clean-temp on|off*

В каталоге, определённом параметром dir, автоматически создаётся каталог .tmp для хранения временных файлов.

Эта опция определяет, следует ли удалять каталог .tmp при запуске. По умолчанию отключено.

*always-check-disk on|off*

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

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

#### **proxy: nuster cache|nosql**

Синтаксис:

*nuster cache [on|off]*

*nusternosql [on|off]*

По умолчанию: включено

Контекст: backend

Определяет, включать ли cache/nosql в этом бэкэнде.
Если в этом разделе есть фильтр, не забудьте разместить его последним.

#### **proxy: nuster rule**

Синтаксис:

*nuster rule name [key KEY] [ttl auto|TTL] [extend EXTEND] [wait on|off|TIME] [use-stale on|off|TIME] [inactive off|TIME] [code CODE] [memory on|off] [disk on|off|sync] [etag on|off] [last-modified on|off] [if|unless condition]*

По умолчанию: нет

Контекст: бэкэнд

Определяет условия активации cache/nosql, требуется определить хотя бы одно правило.

nuster cache on

Кэшировать запрос /asdf на 30 секунд

nuster rule asdf ttl 30 if { path /asdf }

Кэшируйте, если запрос начинается с пути /img/

acl resHdrCache res.hdr(cache) yes nuster rule r1 if resHdrCache


Можно определить несколько правил, которые будут сопоставляться в порядке определения.

acl pathA path /a.html nuster cache on nuster rule all ttl 3600 nuster rule path01 ttl 60 if pathA


Правило path01 никогда не будет сопоставлено.

*name*

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

*key KEY*

Определяет ключ cache/nosql, состоящий из следующих ключевых слов, соединённых точкой:

 * method:       http метод, GET/POST...
 * scheme:       http или https
 * host:         хост в запросе
 * uri:          первый слэш до конца URL
 * path:         URL-путь **CACHE и NoSQL: принципы работы с запросами**

* **Delimiter**: '?' если запрос существует, иначе пусто.
* **Запрос**: вся строка запроса.
* **Header_NAME**: значение заголовка NAME.
* **Cookie_NAME**: значение cookie NAME.
* **Param_NAME**: значение параметра NAME в запросе.
* **Тело**: тело запроса.  

По умолчанию ключ CACHE — `method.scheme.host.uri`, а ключ NoSQL — `GET.scheme.host.uri`.

Пример:

GET http://www.example.com/q?name=X&type=Y

http header: GET /q?name=X&type=Y HTTP/1.1 Host: www.example.com ASDF: Z Cookie: logged_in=yes; user=nuster;


Генерируется следующее:

 * **method**: GET.
 * **scheme**: http.
 * **host**: www.example.com.
 * **uri**: /q?name=X&type=Y.
 * **path**: /q.
 * **delimiter**: ?.
 * **query**: name=X&type=Y.
 * **header_ASDF**: Z.
 * **cookie_user**: nuster.
 * **param_type**: Y.
 * **body**: (пусто).

По умолчанию создаётся ключ `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 секунд. Если не хотите, чтобы срок действия истёк, установите его равным нулю.

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

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

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

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

### Extend EXTEND

Автоматически продлевает срок действия кэша TTL.

#### Формат

extend on|off|n1,n2,n3,n4.

По умолчанию: off.

n1, n2, n3, n4: целые числа меньше 100, сумма n1 + n2 + n3 также меньше 100. Они определяют четыре временных интервала:

time: 0 ttl ttl * (1 + n4%) access: | A1 | A2 | A3 | A4 | | |---------------------------|---------|---------|---------|---------| percentage: |<- (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 off`, то все запросы будут перенаправлены на серверную часть; в противном случае они будут ожидать.

`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 выполняются отдельно на этапе запроса и на этапе ответа.

Если условие на этапе запроса истинно, или условие на этапе ответа истинно, а на этапе запроса ложно, то происходит кэширование.

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

Например:

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

    nuster rule img if { path_beg /img/ }

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

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

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

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

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

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

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

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

Требуется определить следующим образом:

    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 }

4. Другой пример: кэширование всех запросов, не начинающихся с `/api/`.

Ниже неверно:

    acl NoCache path_beg /api/
    nuster rule r3 if !NoCache

Так как хотя на этапе ответа `path` не существует, `NoCache` всегда ложен, а `!NoCache` истинен, все запросы кэшируются.

Нужно изменить на: **HTTP-запрос set-var (txn.path) path**

ACL NoCache var (txn.path) — m beg /api/
Nuster rule r1 if !NoCache

* *Подробности выборки образца см. в разделе «Выборка образцов»*.

Подробнее см. раздел «Конфигурация HAProxy» документа «Конфигурация» **7. Использование ACL и выборка образцов**.

# Кэш

Nuster также может использоваться в качестве HTTP-кэша, подобного Varnish или Nginx, для кэширования динамических или статических HTTP-ресурсов. Помимо SSL, HTTP, HTTP2, перезаписи, перенаправления, добавления, удаления и изменения заголовков и т. д., предоставляемых HAProxy, он также предоставляет следующие функции:

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


**Перевод данных на русский язык:**

Хранилище. Диск. NoSQL. Каталог: /tmp/nuster/nosql
Загружено хранилище. Диск. NoSQL: Да

STATS
Статистика. Кэш. Всего: 0
Статистика. Кэш. Попадание: 0
Статистика. Кэш. Извлечение: 0
Статистика. Кэш. Обход: 0
Статистика. Кэша. Прерывание: 0
Статистика. Кэш. Байты: 0
Статистика. NoSQL. Всего: 0
Статистика. NoSQL. Получить: 0
Статистика. NoSQL. Опубликовать: 0
Статистика. NoSQL. Удалить: 0

PROXY кэш app1
Правило app1. Правило. Rule1: состояние = включено, память = включено, диск = выключено, TTL = 10
Правило app1. Правило. Rule2: состояние = включено, память = включено, диск = включено, TTL = 10
Правило app1. Правило. Rule3: состояние = включено, память = включено, диск = синхронизировано, TTL = 10
Правило app1. Правило. Rule4: состояние = включено, память = выключено, диск = включено, TTL = 10
Правило app1. Правило. Rule5: состояние = включено, память = выключено, диск = выключенное, TTL = 10

PROXY NoSQL app2
Правило app2. Правило. RuleA: состояние = включено, память = включено, диск = выключено, TTL = 10
Правило app2. Правило. RuleB: состояние = включено, память = включено, диск = включено, TTL = 10
Правило app2. Правило. RuleC: состояние = включено, память = включено, диск = синхронизировано, TTL = 10
Правило app2. Правило. RuleD: состояние = включено, память = выключено, диск = включено, TTL = 10
Правило app2. Правило. RuleE: состояние = включено, память = выключено, диск = выключенное, TTL = 10
## Включение и выключение правила

Правила можно динамически включать и выключать через manager URI. Выключенные правила больше не будут обрабатываться.

Заголовки
| Заголовок | Значение | Описание
| --------- | -------- | -----------
| Состояние | Включить | Включить правило
| | Выключить | Выключить правило
| Имя | Правило ИМЯ | Правило для включения/выключения
| | Прокси ИМЯ | Все правила прокси ИМЯ
| | * | Все правила

Все правила с одинаковым именем будут включены или выключены.

Примеры
* Выключить правило r1
  `curl -X POST -H "имя: r1" -H "состояние: выключить" http://127.0.0.1/nuster`

* Выключить все правила backend app1b
  `curl -X POST -H "имя: app1b" -H "состояние: выключить" http://127.0.0.1/nuster`

* Включить все правила
  `curl -X POST -H "имя: *" -H "состояние: включить" http://127.0.0.1/nuster`
## Изменение времени жизни

Изменение TTL влияет только на последующие новые кэши, но не на существующие кэши.

Заголовки
| Заголовки | Значение | Описание
| ---------- | ------- | -----------
| TTL | Новый TTL | См. `ttl` в `nuster rule`
| Имя | Правило ИМЯ | Правило, которое нужно изменить
| | Прокси ИМЯ | Все правила прокси ИМЯ
| | * | Все правила

Примеры

curl -X POST -H "имя: r1" -H "ttl: 0" http://127.0.0.1/nuster curl -X POST -H "имя: r2" -H "ttl: 2h" http://127.0.0.1/nuster

### Одновременное установка состояния и TTL

Одновременная установка состояния и TTL.

curl -X POST -H "имя: r1" -H "ttl: 0" -H "состояние: включено" http://127.0.0.1/nuster

## Очистка

Существует два режима очистки:

* Базовая очистка: отправка метода `purge-method MYPURGE`, определённого для удаления пути
* Расширенная очистка: отправка DELETE на manager URI

### Базовая очистка: удаление одного конкретного URL

`curl -XPURGE http://127.0.0.1/imgs/test.jpg`

На основе правила генерируется ключ и удаляется этот ключ. Это применимо только к кэшам, созданным при GET запросах.

По умолчанию ключ содержит `Host`. Если кэш был создан с использованием `http://example.com/test`, а удаление выполняется на localhost, необходимо использовать заголовок `Host`:

`curl -XPURGE -H "Host: example.com" http://127.0.0.1/test`

Это применимо как к кэшу, так и к NoSQL, где режим NoSQL эквивалентен `DELETE`.

### Расширенная очистка: по имени

Можно удалить, используя заголовок `name`.

Заголовки
| Заголовок | Значение | Описание
| ------ | ----- | -----------
| имя | nuster правило ИМЯ | кэши правила ИМЯ будут удалены
| | прокси ИМЯ | кэши прокси ИМЯ
| | * | все кэши

Примеры

Удалить все кэши

curl -X DELETE -H "имя: *" http://127.0.0.1/nuster

Удалить все кэши backend applb

curl -X DELETE -H "имя: app1b" http://127.0.0.1/nuster

Удалить все кешированные данные, созданные правилом r1

curl -X DELETE -H "имя: r1" http://127.0.0.1/nuster


### Расширенная очистка: по хосту

Используя заголовок `nuster-host`, можно удалить все данные, принадлежащие этому хосту.

Заголовки
| Заголовок      | Значение        | Описание
| -----      | -----        | -----------
| Хост        | HOST         | хост ${HOST}
| nuster-host | HOST         | если существует nuster-host, то используется nuster-host
| Режим        | кэш, nosql | очистить кэш или данные nosql

Примеры

curl -X DELETE -H "nuster-host: 127.0.0.1:8080" http://127.0.0.1/nuster


### Расширенная очистка: по пути

По умолчанию часть запроса также включается в ключ, поэтому разные запросы с одним и тем же путём, но разными параметрами запроса, создают разные кэши.

Например, `nuster правило imgs, если { path_beg /imgs/ }`, затем запрос

curl http://127.0.0.1/imgs/test.jpg?w=120&h=120 curl http://127.0.0.1/imgs/test.jpg?w=180&h=180


Создаст два кэша, потому что запросы разные.

Если эти кэши должны быть удалены, можно **Если известен весь 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 равен ${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 равен ${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


*Примечание: в тексте запроса есть код на языке программирования YAML, но он не содержит информации, необходимой для перевода.* # HTTP-буферный запрос должен быть включён для кэширования POST-запроса
    option http-buffer-request

    acl pathPost путь /search

    # включить кэш для этого прокси
    nuster cache

    # кэшировать /search на 120 секунд. Работает только при POST/PUT
    nuster rule rpost ключ method.scheme.host.uri.body ttl 120 если pathPost

    сервер s1 10.0.0.10:8080
бэкенд app1b
    баланс roundrobin
    режим http

    nuster cache on

    # кэширование /a.jpg, без истечения срока действия
    acl pathA путь /a.jpg
    nuster правило r1 ttl 0 если pathA

    # кэширование /mypage, ключ содержит cookie[userId], поэтому он будет кэшироваться для каждого пользователя
    acl pathB путь /mypage
    nuster правило r2 ключ method.scheme.host.path.delimiter.query.cookie_userId ttl 60 если pathB

    # кэширование /a.html, если заголовок ответа [cache] равен yes
    http-запрос set-var(txn.pathC) путь
    acl pathC var(txn.pathC) -m str /a.html
    acl resHdrCache1 res.hdr(cache) yes
    nuster правило r3 если pathC resHdrCache1

    # кэширование /heavy на 100 секунд, если be_conn больше 10
    acl heavypage путь /heavy
    acl tooFast be_conn ge 100
    nuster правило heavy ttl 100 если heavypage tooFast

    # кэширование всего, если заголовок ответа [asdf] равен fdsa
    acl resHdrCache2 res.hdr(asdf)  fdsa
    nuster правило resCache ttl 0 если resHdrCache1

    сервер s1 10.0.0.10:8080

фронтенд web2
    привязать *:8081
    режим http
    default_backend app2
бэкэнд app2
    баланс roundrobin
    режим http

    # отключить кэш на этом прокси
    nuster cache off
    nuster правило all

    сервер s2 10.0.0.11:8080

фронтенд nosql_fe
    привязать *:9090
    default_backend nosql_be
бэкэнд nosql_be
    nuster nosql on
    nuster правило r1 ttl 3600

Вклад

  • Присоединяйтесь к разработке
  • Оставляйте отзывы
  • Сообщайте о проблемах
  • Отправляйте запросы на вытягивание
  • Распространяйте nuster

Лицензия

Авторское право (C) 2017-настоящее время, Цзян Вэньюань, < koubunen AT gmail DOT com >

Все права защищены.

Лицензия GPL, такая же, как у HAProxy

Уведомления об авторских правах HAProxy и других источников: см. соответствующие отдельные файлы.

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

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

1
https://api.gitlife.ru/oschina-mirror/nuster-nuster.git
git@api.gitlife.ru:oschina-mirror/nuster-nuster.git
oschina-mirror
nuster-nuster
nuster-nuster
master