Назад | Перейти на главную страницу

Varnish + Nginx + несколько IP-адресов

Это моя первая попытка заставить Varnish работать на моем выделенном сервере, на котором размещены 2 домена с 2 отдельными IP-адресами. Моя упрощенная установка выглядит следующим образом:

Конфигурация Nginx

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

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

Лак ВКЛ

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

И в конфиге лака я определил

VARNISH_LISTEN_PORT=80

Varnish и Nginx (и php-fpm) работают правильно, но когда я пытаюсь перейти на свой веб-сайт, появляется приветствие на странице nginx. Заголовки не содержат x-varnish. Похоже, что varnish по какой-то причине не слушает порт 80. Я подозреваю, что это связано с файлом vcl, где он слушает хост 127.0.0.1. У меня два сайта на wordpress. Где мне искать, чтобы Varnish работал правильно?

Ура, Аднан

РЕДАКТИРОВАТЬ:

Кажется, что Nginx правильно настроен на 8080, но Varnish не прослушивает правильный IP-адрес. Использование нескольких IP-адресов лака Йенса netstat -lnp дает:

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);
}

серверные блоки 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;
}

Если вы настраиваете Nginx для прослушивания двух IP-адресов, вы также должны использовать эти IP-адреса в Varnish. Лучший способ сделать это - использовать для Varnish две разные серверные записи.

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

Пожалуйста, замените IP-ADDRESS-1 и IP-ADDRESS-2 на правильные IP-адреса.

Чтобы назначить бэкэнд для входящих запросов, вы можете использовать следующий пример или изменить его в соответствии с вашими требованиями:

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

Может быть важно использовать IP-адреса для генерации хеш-идентификатора объекта кеша. Добавьте конкретный метод vcl_hash в вашу конфигурацию 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);
}

Позаботьтесь о том, чтобы серверы Varnish указывали на настроенные вами веб-сайты. В данном примере вы настроили Nginx для прослушивания порта 8080, но вы направили Varnish на порт 80. Если вы не удалили конфигурацию веб-сайта Nginx по умолчанию, Nginx ответит этим сайтом.

Это немного предположение, но я думаю, что у вас есть виртуальный хост по умолчанию, все еще определенный в nginx, и он определен для прослушивания на порту 80, и поэтому Varnish не может привязаться к этому порту.

Итак, проверьте конфигурацию nginx и удалите виртуальный хост по умолчанию.

Если это не решит проблему, укажите полные конфигурации nginx и Varnish в вопросе, а вывод netstat -lnp.