在具有 5 个 IP 的 cPanel 服务器上使用 Varnish

在具有 5 个 IP 的 cPanel 服务器上使用 Varnish

我有一台服务器托管同一个域的 3 个子域,每个子域都有自己的 IP。我需要在 apache 前面设置 varnish,因为我要为大量小图像提供服务,而 varnish 的效果非常好。

由于服务器尚未命名(DNS指向旧服务器),我对其进行了IP比较(我不知道这是否是我收到垃圾的原因)....

我已经从 cPanel 将 apache 设置为端口 0.0.0.0:81,并在 default.vcl 上创建后端,如下所示:

backend name1 {
        .host = "x1.y2.z3.w4";
        .port = "81";
}

backend name2 {
        .host = "x5.y6.z7.w8";
        .port = "81";
}

对所有子域名也是如此

所有例子都表明:

if (req.http.host ~ "x1.y2.z3.w4") {
        set req.backend = name1;
} else {
        set req.backend = name2;
}

我将其添加到新的接收函数子程序定义如下:

sub vcl_recv {
 if (req.http.host ~ "x1.y2.z3.w4") {
            set req.backend = name1;
    } else {
            set req.backend = name2;
    }
return(lookup);
}

结果是,只有当我专门输入 x5.y6.z7.w8 IP(上述规则的例外)时,我才能获得一些东西,而其他一切都会错误地将我重定向到默认网站 cpanel 页面,以至于它找不到任何东西。

sysconfig/varnish 文件中的守护进程选项定义是:

DAEMON_OPTS="-a 0.0.0.0:80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -u varnish -g varnish \
             -s malloc,7G \
             -p thread_pool_add_delay=1 \
             -p thread_pools=4 \
             -p thread_pool_min=200 \
             -p thread_pool_max=4000 \
             -p session_linger=50 \
"

不用说,当我通过 apache 的 81 端口访问它们时,两个 IP 都可以工作。

知道可能出错的地方吗?我对 varnish VCL 完全是新手,非常欢迎任何帮助或指点!

谢谢

答案1

找到了!

backend domain1 {
        .host = "x1.y1.z1.w1";
        .port = "81";
}

backend domain2 {
        .host = "x2.y2.z2.w2";
        .port = "81";
}

并覆盖sub vcl_recv {

和:

sub vcl_recv {
        if ((server.ip == "x1.y1.z1.w1")) {
                set req.backend = domain1;
        } else if((server.ip == "x2.y2.z2.w2") || (req.http.host ~ "domain2.site.com")) {
                set req.backend = domain2;
        } else {
                set req.backend = domain3;
        }
        if (req.request == "GET" && req.url ~ "\.(css|gif|jpg|jpeg|bmp|png|ico|img|tga|wmf)$") {
                remove req.http.cookie;
                return(lookup);
        }
}

我在比较中需要的是服务器IP多变的

请记住(我没有这样做,而且为此付费),现在您面前有代理服务器,PHP $_SERVER['REMOTE_ADDR']; 不再有效。它返回代理的地址(因此是站点地址)。您将不得不使用_SERVER["HTTP_X_FORWARDED_FOR"]或制作一个万无一失的函数来检查它们:

function getIP()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

相关内容