Varnish, ocultar o número da porta

3

Minha configuração é a seguinte:

SO: CentOS 6.2 em execução em uma máquina virtual OpenVZ.

Servidor da Web: Nginx ouvindo na porta 8080

Proxy reverso: Varnish escutando na porta 80

O problema é que o Varnish redireciona meus pedidos para a porta 8080 e isso aparece na barra de endereços como http://mysite.com:8080/directory/ , fazendo com que os links relativos no site incluam o número da porta (8080) na solicitação e ignorem o Varnish.

O site é alimentado por WordPress.

Como faço para permitir que o Varnish use o Nginx como backend na porta 8080 sem anexar o número da porta ao endereço?

Editar: o verniz é configurado da seguinte forma:

Eu disse ao daemon Varnish para escutar a porta 80 por padrão.

VARNISH_VCL_CONF=/etc/varnish/default.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=1
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1G
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120

O arquivo VCL que o Varnish chama (através de uma inclusão em default.vcl ) consiste em:

backend playwithbits {
     .host = "127.0.0.1";
     .port = "8080";
}
acl purge {
     "127.0.0.1";
}
sub vcl_recv {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          set req.backend = playwithbits;
          set req.http.Host = regsub(req.http.Host, ":[0-9]+", ""); 
          if (req.request == "PURGE") {
               if (!client.ip ~ purge) {
                    error 405 "Not allowed.";
               }
               return(lookup);
          }
          if (req.url ~ "^/$") {
               unset req.http.cookie;
          }
     }
}
sub vcl_hit {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          if (req.request == "PURGE") {
               set obj.ttl = 0s;
                    error 200 "Purged.";
          }
     }
}
sub vcl_miss {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          if (req.request == "PURGE") {
               error 404 "Not in cache.";
          } 
          if (!(req.url ~ "wp-(login|admin)")) {
               unset req.http.cookie;
          }
          if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
               unset req.http.cookie;
               set req.url = regsub(req.url, "\?.$", "");
          }
          if (req.url ~ "^/$") {
               unset req.http.cookie;
          }
     }
}
sub vcl_fetch {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          if (req.url ~ "^/$") {
               unset beresp.http.set-cookie;
          }
          if (!(req.url ~ "wp-(login|admin)")) {
               unset beresp.http.set-cookie;
          }
     }
}
    
por George Reith 14.06.2012 / 22:38

4 respostas

1

Então, eu consegui resolver esse problema, peço desculpas a qualquer um que tenha tentado encontrar a resposta, já que não foi exatamente o problema que eu diagnostiquei.

Antes de aplicar o verniz, eu disse ao wordpress que o URL do meu site era playwithbits.com:8080 , para que ele exibisse corretamente o conteúdo, por isso estava anexando o número da porta a todas as minhas URLs.

Esqueci completamente dessa configuração e, depois que removi o número da porta, meu site começou a funcionar normalmente.

    
por 15.06.2012 / 17:00
0

O próprio verniz nunca envia 301 respostas por si só (a menos que você faça alguma mágica importante da VCL), então se você receber um redirecionamento, ele terá que vir do seu back-end.

    
por 16.06.2012 / 22:44
0

Eu vejo que você resolveu seu problema específico. Em alguns casos, como em alguns programas CGI, a porta ainda aparece na URL.

Para evitar isso, você pode executar o seu servidor Web (nginx) em 127.0.0.1 : 80 e o Varnish em 1.2.3.4 : 80 (IP externo).

    
por 28.06.2012 / 01:41
-1

Se o seu site estiver enviando 301 ou 302 respostas em algum lugar, deve enviar um URI completo com http, host e port. Quando o nginx está fazendo proxy, isso pode ser corrigido com a opção proxy_redirect. O mesmo mecanismo deve existir no verniz. Se não, cabe a você reescrever o cabeçalho Location:.

Você poderia fornecer um calefator para a resposta que envia o cliente para a porta 8080? Esses cabeçalhos ou link direto estão em algum lugar de um site?

    
por 14.06.2012 / 23:11