Назад | Перейти на главную страницу

nginx / memcached для кешированного веб-прокси

Я пытаюсь настроить nginx как слой кеширования поверх HTTP-прокси - вместе с memcached для фактического кеширования. Цель здесь в том, чтобы у нас было внутреннее приложение, которое будет часто исходящий HTTP-запросы, и мы хотим использовать nginx + memcached в качестве веб-прокси, чтобы ускорить ответы на эти исходящие клиентские запросы. (Тем более, что многие запросы могут быть избыточными).

Там много хорошей документации и информации по настройке nginx вместе с memcached, но я столкнулся с проблемой, потому что похоже, что мой конкретный вариант использования не слишком распространен. Большинство руководств, примеров и т. Д. Предполагают, что читатель запуск веб-сайта, и хочет использовать nginx + memcached для повышения производительности веб-сайта.

Но мой вариант использования другой. Я просто хочу использовать nginx в качестве прокси-сервера для веб-кеширования и использовать memcached в качестве фактического уровня хранения для кеширования. Опять же, я не заинтересован в повышении производительности для входящий запросы на сайт - я хочу ускорить исходящий HTTP-запросы от внутреннего приложения.

Итак, хотя, похоже, в Интернете есть много руководств, в которых объясняется, как настроить nginx как прокси веб-кеша, а также множество онлайн-руководств, в которых объясняется, как настроить nginx + memcached в качестве высокопроизводительного кэширующего веб-сервера, похоже, не так уж много способов объяснить, как настроить nginx в качестве прокси-сервера веб-кеша, который использует memcached для выполнения собственно кеширование.

Хорошо, поэтому я попытался прочитать между строк и разобраться сам. У меня есть nginx и memcached, установленные локально в окне разработчика. Я также использую "Улучшенный модуль Nginx Memcached", а не модуль nginx + memcached, который поставляется с nginx из коробки, потому что, очевидно, готовая версия не кеширует заголовки HTTP (что, казалось бы, делает его непригодным для использования на практике, если я что-то здесь не упускаю).

Так что соответствующая часть моего nginx.conf файл:

upstream some-upstream-proxy {
    server proxy.giant-corporation.com:82;
}

upstream memcached_upstream {
    server 127.0.0.1:11211;
    keepalive 20;
}

server {
    listen       80 default_server;
    server_name my-cache-proxy;

   location @fallback {
        proxy_pass http://some-upstream-proxy;
        proxy_cache my_cache;
        proxy_redirect default;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        set $enhanced_memcached_key "$request_uri";
        set $enhanced_memcached_key_namespace "$host";
        set $enhanced_memcached_use_add 1;
        set $enhanced_memcached_expire $http_memcached_expire;
        enhanced_memcached_hash_keys_with_md5 on;
        enhanced_memcached_pass memcached_upstream;

        error_page 404 = @fallback;
    }
}

Итак, я понимаю, что это должно делать следующее:

  1. К nginx отправляется HTTP-запрос.
  2. Nginx ищет URI в memcached. Если он находит URI, он возвращает кэшированные данные ответа.
  3. Если это не найти URI, он возвращается к @fallback и использует вышестоящий прокси-сервер HTTP для выполнения HTTP-запроса.
  4. Затем он кэширует этот запрос в memcached и возвращает ответ клиенту.

Так что мой nginx.conf файл кажется в основном делаю то, что хочу, кроме последнего шага. Похоже, что он добавляет запись для URI, но фактическое кэшированное значение составляет 0 байтов.

Например, если я запускаю nginx и memcached с указанным выше nginx.conf файл, а затем я говорю:

 curl http://www.google.com/ --proxy http://localhost:80

... Я получаю актуальные данные ответа от Google. Затем, если я проверю статистику memcached, я вижу:

STAT cmd_get 21
STAT cmd_set 1

И после каждого запроса я вижу cmd_get растет. Но если я сделаю реальный дамп memcached, я вижу:

$ memcached-tool localhost:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 1 - 1 total items
add __ns__www.google.com 0 1479132450 1
0

Итак, я вижу, что nginx определенно общается с memcached, и успешно вставил запрошенный мной URI. Но похоже, что на самом деле он не кэширует ответ, который получает от прокси-сервера http. Он просто имеет 0-байтовую запись для www.google.com.

Итак ... какой шаг мне здесь не хватает? Как я могу изменить свой nginx.conf файл делать что хочу?