我有一台服务器托管同一个域的 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;
}