Прокси супер-кеш

Проблема: 1С используется в качестве веб-сервиса, но очень долго формирует данные. Однако сами данные практически не меняются, либо изменение происходит редко. Например, это данные о заказе. Долгий процесс получения запроса мешает отладке.

В качестве решения можно использовать прокси супер-кеш: данные кешируются вне зависимости от заголовков ответа на 3 часа (настройки: inactive, proxy_cache_valid), куки не учитываются (подходит для монопользовательского режима).

Кешируется весь ответ полностью, в качестве ключа используется схема : хост : URL.

Вариант использования в качестве прокси:

export http_proxy=http://1c-cached.dev.local:1080
# на втором хите время должно существенно сократиться
time curl --user user:pass -i http://web-service.ru/invoice/4676578e-e41c-11e8-8118-00155d049f73

Официальное описание настроек. Конфигурация прокси супер-кеша:

# Настройки кеша
proxy_cache_path /tmp/nginx   # путь
  levels=1:2                  # количество уровней
  keys_zone=my_cache:10m      # название:размер зоны, 1Мб ~ 8000 ключей (1 ключ - 1 запрос)
  max_size=10g                # размер данных кеша, при превышении удаляются наиболее старые
  inactive=180m               # время хранения запроса на диске с момента последнего обращения, независимо от Cache-Control
  use_temp_path=off;          # off - используем proxy_cache_path; on - используем proxy_temp_path, указанный в location

server {

  server_name 1c-cached.dev.local;
  listen 1080;
  error_log /var/log/nginx/1c-cached.error.log error;
  access_log /var/log/nginx/1c-cached.access.log combined;
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;

  # Какой кеш использовать? Можно на уровне location
  proxy_cache my_cache;

  location / {
    # Заголовок: HIT - из суперкеша, MISS - с сервера, EXPIRED - время кеширования истекло, взято с сервера
    add_header X-Cache-Status $upstream_cache_status;

    # Начинаем игнорировать заголовки:
    # Expires - точно нужно игнорировать, иначе не будет кешироваться, на счет остальных - не уверен
    proxy_ignore_headers Expires Cache-Control Set-Cookie;

    # Для супер-кеша нужен сам факт заголовка, даже если "max-age=1", данные будут браться с диска в течение inactive
    # Добавляем свой Cache-Control, данные все равно будут браться из суперкеша
    add_header Cache-Control "max-age=1";

    # форсируем кеширование, хотя эта опция нужна не для всех случаев
    proxy_cache_valid any 180m;

    # Если источник "отвалился", будем отдавать с диска
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    # но будем обновляться в фоне, (c версии Nginx 1.11.10)
    # proxy_cache_background_update on;

    # Прокси - источник данных
    resolver 10.0.0.10;
    proxy_pass http://$http_host$uri$is_args$args;
  }
}