Varnish + Nginx + 多个 IP 地址

Varnish + Nginx + 多个 IP 地址

这是我第一次尝试在专用服务器上运行 Varnish,该服务器托管 2 个域和 2 个独立的 IP 地址。我的简化设置如下:

Nginx 配置

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

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

清漆vcl

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

在 varnish conf 中我定义了

VARNISH_LISTEN_PORT=80

Varnish 和 Nginx(以及 php-fpm)运行正常,但当我尝试访问我的网站时,它显示欢迎访问 nginx 页面。标头中没有 x-varnish。似乎出于某种原因,varnish 没有监听端口 80。我怀疑这与 vcl 文件有关,该文件正在监听 127.0.0.1 主机。我正在运行两个 wordpress 网站。我应该在哪里寻找以使 Varnish 正常工作?

欢呼吧,阿德南

编辑:

Nginx 似乎正确位于 8080 中,但 Varnish 未监听正确的 IP 地址。使用 Jens 多个 varnish 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          

默认.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;
}

答案1

如果您将 Nginx 配置为监听两个 IP 地址,则您也应该在 Varnish 中使用这些 IP 地址。最好的方法是为 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 地址来生成缓存对象的哈希 ID 可能很重要。将特定的 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 将使用此网站进行响应。

答案2

这有点猜测,但我认为您在 nginx 中仍然定义了一些默认虚拟主机,并且定义为监听端口 80,因此 Varnish 无法绑定到该端口。

因此,检查您的 nginx 配置,并删除默认虚拟主机。

如果这不能解决问题,请将完整的 nginx 和 Varnish 配置放在问题中,并将 的输出放在问题中netstat -lnp

相关内容