nginx / memcached para proxy da web em cache

1

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:

  1. Uma solicitação HTTP é feita para o nginx.
  2. O Nginx procura o URI no memcached. Se encontrar o URI, ele retornará os dados de resposta em cache.
  3. Se não encontrar o URI, ele volta para @fallback e usa o proxy HTTP upstream para fazer uma solicitação HTTP.
  4. Em seguida, armazena essa solicitação em 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?

    
por Siler 08.12.2016 / 16:59

0 respostas