Estou tentando configurar o nginx como uma camada de cache em cima de um proxy HTTP - juntamente com o memcached para fazer o cache real. O objetivo aqui é que tenhamos um aplicativo interno que fará solicitações HTTP de saída freqüentes e queremos usar o nginx + memcached como um proxy da Web para acelerar as respostas a essas solicitações de clientes de saída. (Especialmente porque muitos pedidos podem ser redundantes).
Há muita documentação e informações interessantes sobre como configurar o nginx juntamente com o memcached, mas estou com um problema porque parece que o meu caso de uso em particular não é muito comum. A maioria dos tutoriais, exemplos, etc. supõe que o leitor está executando um site e deseja usar o nginx + memcached para aumentar o desempenho do site.
Mas meu caso de uso é diferente. Eu só quero usar o nginx como um proxy de armazenamento em cache da web e usar o memcached como a camada de armazenamento real para o armazenamento em cache. Novamente, não estou interessado em acelerar o desempenho de solicitações recebidas para um website - estou interessado em acelerar as solicitações HTTP de saída de um aplicativo interno.
Portanto, embora pareça haver muitos tutoriais on-line que explicam como configurar o nginx como um site proxy de cache , bem como muitos tutoriais on-line que explicam como configurar o nginx + memcached como um servidor de cache de alto desempenho, não parece haver muita explicação sobre como configurar o nginx como um cache da web proxy que usa o memcached para fazer o cache real.
Ok, tentei ler nas entrelinhas e descobrir por mim mesmo. Eu tenho nginx e memcached ambos instalados localmente em uma caixa dev. Também estou usando o " Módulo de Memcached Nginx aprimorado ", em vez do módulo nginx + memcached que vem com o nginx pronto para uso , porque aparentemente a versão pronta para uso não faz o cache dos cabeçalhos HTTP (o que parece torná-lo inutilizável na prática, a menos que eu esteja perdendo alguma coisa aqui).
Portanto, a parte relevante do meu arquivo 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;
}
}
Então, meu entendimento aqui é que o que isso deve fazer é o seguinte:
@fallback
e usa o proxy HTTP upstream para fazer uma solicitação HTTP. memcached
e retorna a resposta ao cliente. Então, meu arquivo nginx.conf
parece estar principalmente fazendo o que eu quero, exceto pela última etapa. Parece que está adicionando uma entrada para o URI, mas o valor real em cache parece ser 0 bytes.
Por exemplo, se eu executo o nginx e o memcached com o arquivo nginx.conf
acima, então eu digo:
curl http://www.google.com/ --proxy http://localhost:80
... recebo os dados de resposta reais do Google. Então, se eu verificar as estatísticas do memcached, eu vejo:
STAT cmd_get 21
STAT cmd_set 1
E após cada solicitação, vejo que cmd_get
está aumentando. Mas se eu fizer um despejo memcached real, eu vejo:
$ 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
Então, vejo que o nginx está definitivamente se comunicando com memcached
e inseriu com êxito o URI solicitado. Mas, na verdade, não parece estar armazenando em cache a resposta obtida do servidor proxy http. Só tem uma entrada de 0 bytes para www.google.com
.
Então ... que passo estou faltando aqui? Como posso modificar meu arquivo nginx.conf
para fazer o que eu quero?
Tags proxy nginx http memcached http-proxy