# 6. Кеш

> Ограничения кеша и настройка в секциях cache и прокси

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

HAProxy предоставляет кеш, предназначенный для небольших объектов (favicon, css и т. п.). Это минималистичный кеш в оперативной памяти, не требующий сложного обслуживания.

Кеш использует общую для всех потоков область памяти, разделённую на блоки по 1kB.

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

В качестве ключа кеш использует хеш заголовка host и URI.

Состояние кеша можно просмотреть командой сокета Unix «show cache»; дополнительные сведения приведены в [разделе 9.3](/ru/docs/haproxy/filters/#section-9-3) «Команды сокета Unix» руководства по управлению.

Когда объект выдаётся из кеша, имя сервера в журнале заменяется на «`<CACHE>`».

## 6.1. Ограничения {#section-6-1}

Кеш не сохраняет и не выдаёт объекты в следующих случаях:

- Если код ответа отличается от 200.

- Если ответ содержит заголовок Vary, а параметр process-vary отключён либо значение Vary содержит заголовок, который пока не поддерживается (сейчас поддерживаются только accept-encoding, referer и origin).

- Если Content-Length + размер заголовков превышает «max-object-size».

- Если ответ нельзя кешировать.

- Если у ответа нет явно заданного срока действия (директивы s-maxage или max-age в Cache-Control либо заголовка Expires) или валидатора (заголовков ETag или Last-Modified).

- Если параметр process-vary включён и уже существует max-secondary-entries записей с тем же первичным ключом, что и у текущего ответа.

- Если параметр process-vary включён, ответ зависит от клиентского заголовка accept-encoding и использует неизвестную кодировку (не указанную в <https://www.iana.org/assignments/http-parameters/http-parameters.xhtml>).

- Если метод запроса отличается от GET.

- Если версия HTTP в запросе ниже 1.1.

- Если запрос содержит заголовок Authorization.

## 6.2. Настройка {#section-6-2}

Для настройки кеша необходимо определить секцию cache и использовать её в прокси с соответствующими действиями http-request и http-response.

### 6.2.1. Секция cache {#section-6-2-1}

<a id="entry-6-2-1-cache"></a>

**`cache <name>`**

```haproxy
cache <name>
```

Объявляет секцию кеша и выделяет общую память кеша с именем `<name>`. Размер кеша обязателен (см. директиву «total-max-size» ниже).

<a id="entry-6-2-1-max-age"></a>

**`max-age <seconds>`**

```haproxy
max-age <seconds>
```

Задаёт максимальный срок действия. Срок действия равен меньшему из этого значения и значения директивы s-maxage или max-age (в таком порядке приоритета) в заголовке ответа Cache-Control. Значение по умолчанию — 60 секунд, то есть по умолчанию объект нельзя кешировать дольше 60 секунд.

<a id="entry-6-2-1-max-object-size"></a>

**`max-object-size <bytes>`**

```haproxy
max-object-size <bytes>
```

Задаёт максимальный размер кешируемого объекта. Он не должен превышать половину «total-max-size». Если не задан, равен 256-й доле размера кеша. Объекты размером больше «max-object-size» не кешируются.

<a id="entry-6-2-1-max-secondary-entries"></a>

**`max-secondary-entries <number>`**

```haproxy
max-secondary-entries <number>
```

Задаёт максимальное число одновременно существующих вторичных записей с одинаковым первичным ключом в кеше. Для этого должна быть включена поддержка vary. Значение по умолчанию — 10; следует указывать строго положительное целое число.

<a id="entry-6-2-1-process-vary"></a>

**`process-vary <on/off>`**

```haproxy
process-vary <on/off>
```

Включает или отключает обработку заголовка Vary. Если она отключена, ответы с таким заголовком никогда не кешируются. Если включена, для части заголовков всех входящих запросов требуется предварительно вычислять хеш (что может потребовать дополнительных ресурсов CPU); он используется для формирования вторичного ключа запроса (см. RFC 7234#4.1). Сейчас вторичный ключ формируется из содержимого заголовков 'accept-encoding', 'referer' и 'origin'. Обратите внимание: согласно RFC заголовки 'origin' и 'referer' имеют по одному значению, поэтому запрос с несколькими вхождениями любого из них следует считать некорректным. Для таких запросов вторичный ключ не формируется и ответ никогда не выдаётся из кеша, чтобы сервер мог сам решить, как обработать ситуацию. Значение по умолчанию — off (отключено).

<a id="entry-6-2-1-total-max-size"></a>

**`total-max-size <megabytes>`**

```haproxy
total-max-size <megabytes>
```

Задаёт размер кеша в оперативной памяти в мегабайтах. Эта память разделяется на блоки по 1kB, используемые записями кеша. Максимальное значение — 4095.

### 6.2.2. Секция прокси {#section-6-2-2}

Секция прокси, использующая кеш, должна включать действие «cache-use» в набор правил «http-request» для поиска запрошенного объекта в кеше и действие «cache-store» в набор правил «http-response» для сохранения или обновления полученного объекта. Оба действия могут дополнительно содержать условия. Например, можно пропускать «cache-use» для определённого подкаталога, содержимое которого заведомо не кешируется, либо пропускать «cache-store» для типов содержимого, кеширование которых заведомо бесполезно. Учтите, что ключ индексации кеша вычисляется при выполнении «cache-use»: если это действие пропущено, на этапе обработки ответа попытка обновления кеша в любом случае не выполняется.

Пример:

```text
backend bck1
  mode http

  http-request cache-use foobar
  http-response cache-store foobar
  server srv1 127.0.0.1:80

cache foobar
  total-max-size 4
  max-age 240
```

---

Обратные ссылки:

- [9. Фильтры](/ru/docs/haproxy/filters/)
