Varnish + Nginx + vários endereços IP

1

Esta é a minha primeira chance de fazer o Varnish funcionar no meu servidor dedicado, que hospeda dois domínios com dois endereços IP separados. Minha configuração simplificada é a seguinte:

Nginx conf

server {
    listen ip-address-1:8080;
}

server {
    listen ip-address-2:8080;
}

Varnish vcl

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

E no conf do verniz eu defini

VARNISH_LISTEN_PORT=80

Varnish e Nginx (e php-fpm) estão funcionando corretamente, mas quando eu tento ir ao meu site, ele mostra a página de boas-vindas ao nginx. Os cabeçalhos não têm o x-verniz nele. Parece que, por algum motivo, o verniz não está escutando a porta 80. Estou suspeitando que isso tenha a ver com o arquivo vcl onde ele está ouvindo o host 127.0.0.1. Eu estou executando dois sites wordpress. Onde devo procurar para obter o verniz funcionando corretamente?

Felicidades, Adnan

EDITAR:

O Nginx parece estar em 8080 corretamente, mas o Varnish não está ouvindo o endereço IP correto. Usando endereços IP múltiplos de verniz Jens netstat -lnp yields:

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 46.105.40.241:8080          0.0.0.0:*                   LISTEN      21610/nginx         
tcp        0      0 5.135.166.39:8080           0.0.0.0:*                   LISTEN      21610/nginx         
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      21610/nginx         
tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LISTEN      2544/named          
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      1195/vsftpd         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1184/sshd           
tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      2544/named          
tcp        0      0 46.105.40.241:443           0.0.0.0:*                   LISTEN      21610/nginx         
tcp        0      0 5.135.166.39:443            0.0.0.0:*                   LISTEN      21610/nginx         
tcp        0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      21350/varnishd      
tcp        0      0 :::80                       :::*                        LISTEN      21351/varnishd      
tcp        0      0 ::1:53                      :::*                        LISTEN      2544/named          
tcp        0      0 :::22                       :::*                        LISTEN      1184/sshd           
tcp        0      0 ::1:953                     :::*                        LISTEN      2544/named          
udp        0      0 127.0.0.1:53                0.0.0.0:*                               2544/named          
udp        0      0 ::1:53                      :::*                                    2544/named          

default.vcl

backend ikhebeenbril {
    .host = "5.135.166.39";
    .port = "8080";
}

backend sunculture {
    .host = "46.105.40.241";
    .port = "8080";
}
sub vcl_recv {

    if (server.ip == "5.135.166.39") {
        set req.backend = ikhebeenbril; 
    } else {
        set req.backend = sunculture;
    }
...
}

sub vcl_hash {
    hash_data(server.ip);
    if (req.http.host) {
        hash_data(req.http.host);
    }
    hash_data(req.url);
    if (req.http.Accept-Encoding) {
        hash_data(req.http.Accept-Encoding);
    }
    return (hash);
}

blocos do servidor nginx

server {
        listen 5.135.166.39:80;
        listen 5.135.166.39:443 default ssl spdy;
        server_name www.ikhebeenbril.nl;
}

server {
        listen 46.105.40.241:80;
        listen 46.105.40.241:443 default ssl spdy;
        server_name www.thesunculture.com;
}
    
por adnan 09.06.2014 / 06:05

2 respostas

1

Se você configurar seu Nginx para ouvir em dois endereços IP, também deverá usar esses endereços IP no Verniz. A melhor maneira de fazer isso é usar dois registros de backend diferentes para o verniz.

backend server1 {
    .host = "IP-ADDRESS-1";
    .port = "8080";
}
backend server2 {
    .host = "IP-ADDRESS-2";
    .port = "8080";
}

Por favor, substitua IP-ADDRESS-1 e IP-ADDRESS-2 pelos endereços IP corretos.

Para atribuir o back-end a solicitações recebidas, você pode usar o exemplo a seguir ou modificá-lo de acordo com seus requisitos:

sub vcl_recv {
    if (server.ip == "IP-ADDRESS-1") {
        set req.backend = server1; 
    } else {
        set req.backend = server2;
    }
    ...
}

Pode ser importante usar os endereços IP para gerar o ID de hash do objeto de cache. Adicione um método vcl_hash específico à sua configuração do Varnish:

sub vcl_hash {
    hash_data(server.ip);
    if (req.http.host) {
        hash_data(req.http.host);
    }
    hash_data(req.url);
    if (req.http.Accept-Encoding) {
        hash_data(req.http.Accept-Encoding);
    }
    return (hash);
}

Por favor, tenha o cuidado de apontar os backends de Varnish para seus sites configurados. No exemplo dado, você configurou o Nginx para escutar na porta 8080, mas endereçou o Varnish para a porta 80. Se você não removeu a configuração do site padrão do Nginx, o Nginx responderá com este site.

    
por 09.06.2014 / 13:55
0

Isso é um pouco de adivinhação, mas acho que você tem algum host virtual padrão ainda definido no nginx, e que está definido para escutar na porta 80 e, portanto, o Varnish não consegue se ligar a essa porta.

Portanto, verifique sua configuração do nginx e remova o host virtual padrão.

Se isso não resolver o problema, coloque as configurações completas de nginx e Varnish na pergunta e a saída de netstat -lnp .

    
por 09.06.2014 / 06:30