Я пытаюсь настроить 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;
}
}
Итак, я понимаю, что это должно делать следующее:
@fallback
и использует вышестоящий прокси-сервер HTTP для выполнения HTTP-запроса. 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
файл делать что хочу?