![Varnish + Nginx + 多个 IP 地址](https://linux22.com/image/634583/Varnish%20%2B%20Nginx%20%2B%20%E5%A4%9A%E4%B8%AA%20IP%20%E5%9C%B0%E5%9D%80.png)
这是我第一次尝试在专用服务器上运行 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
。