我知道我在问题中添加了太多信息,但请多多包涵。
我们的网站在域上运行,例如- domain1.com 有 ip 说例如- 192.168.1.25。现在,我们有另一台通过 IP 运行的服务器,例如192.168.1.26 具有 plesk 面板 12.5.30。请注意,我们没有将我们的域 - domain1.com 指向 192.168.1.26,因为我们希望保留
它是私有(private)的,直到我们设置好一切并准备开始作为生产工作。我们已经在 plesk 面板中使用 domain1.com 设置了我们的域,并创建了 staging.domain1.com 作为子域。
我们修改了本地机器上的 hosts 文件,将 staging.domain1.com 指向 192.168.1.26,这样我们就可以从新服务器访问我们的网站,而主域 - domain1.com 仍在 192.168.1.25 上运行并且我们能够访问作为 domain1.com
基本上,我们正在通过 192.168.1.26 IP 设置暂存环境。我们确实让 CentOS 6 在新的暂存域上运行,并且我们启用了防火墙规则以在 plesk 面板中的某些 IP 上运行网站。
我们想在新服务器上配置 Varnish 并且我们安装了它。 [我们已经在 plesk 论坛上投票支持 varnish 请求。] 在 plesk 上,我们确实有 apache 在端口 7080 上运行,而 nginx 在端口 80 上运行。
> netstat -ntlp | grep -w 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 29795/nginx
tcp 0 0 :::80 :::* LISTEN 29795/nginx
> netstat -ntlp | grep -w 7080
tcp 0 0 0.0.0.0:7080 0.0.0.0:* LISTEN 10161/httpd
我们将 A 记录设置为 192.168.1.26 - staging.domain1.com 到我们的 DNS,并且我们在暂存域上获得了正确的 IP。我们设置/etc/varnish/default.vcl 文件如下:
backend default {
.host = "192.168.1.26";
.port = "80";
}
backend admin {
.host = "192.168.1.26";
.port = "80";
.first_byte_timeout = 18000s;
.between_bytes_timeout = 18000s;
}
sub vcl_recv {
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + cl$
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE" &&
req.request != "PURGE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.http.cookie ~ "adminhtml=") {
set req.backend = admin;
}
}
这是/etc/sysconfig/varnish 文件:
VARNISH_LISTEN_PORT=6081
VARNISH_ADMIN_LISTEN_PORT=6082
VARNISH_VCL_CONF=/etc/varnish/default.vcl
我们启动了 varnish 服务 -/etc/init.d/varnish start 并检查了端口 6081:
> netstat -ntlp | grep -w 6081
tcp 0 0 0.0.0.0:6081 0.0.0.0:* LISTEN 23745/varnishd
tcp 0 0 :::6081 :::* LISTEN 23745/varnishd
但是当我们通过访问 staging.domain1.com:6081 检查我们的站点时,我们得到了响应,但浏览器中显示的 URL 指向 domain1.com。因此,我们将默认和管理员中的 .host 更改为域名 - staging.domain1.com 如下所示,然后重新启动 varnish 服务,但它没有这样做。
backend default {
.host = "staging.domain1.com";
.port = "80";
}
backend admin {
.host = "staging.domain1.com";
.port = "80";
.first_byte_timeout = 18000s;
.between_bytes_timeout = 18000s;
}
我不明白添加真实(子)域名后它没有重新启动的原因。另一件事:站点从端口 80 即 nginx 提供服务。理想情况下,varnish 应该在端口 80 上运行,我们尝试这样做,但不知何故失败了。我们按照 - https://www.theshell.guru/change-nginx-port-plesk-12-centos-6-6/ 的指南设法在端口 8080 上运行 nginx。 .基本上,我们在/usr/local/psa/admin/conf/templates 下添加了自定义目录,并将以下文件复制到那里并更新到端口 8080。
然后我们改变了, Varnish 监听端口到 80 而不是端口 6081 但是当我们启动 Varnish 时,它直接显示失败并且我们的域 - staging.domain1.com 无法加载所以我们恢复了上面的所有内容,即
我假设我应该有以下情况:
在第一种情况下,我们无法确认 varnish 是否正确配置[如果我们设置 IP 而不是真实主机名],在第二种情况下,我们无法启动 varnish 服务,尽管它应该是理想的情况。
基本上,我不明白这里有什么问题。
最佳答案
首先,不要将 Varnish 与 Plesk 或任何控制面板一起使用。这永远不会带来好的结果。在基本的 Linux 服务器上使用它,这样您就可以更好地了解正在发生的事情。
其次,你快到了 :) varnish VCL 中的后端 IP 必须保持为 IP。将域而不是 IP 放在那里是错误的。 Varnish 会自动将您的 HTTP 请求中的 Host header 转换到底层后端服务器上。
因此,如果您打开一个 URL 为 http://staging-domain:6081/ 的页面,那么会发生什么:
您最初的问题很可能是您的应用/网站发起的重定向。
简单地说,您正在尝试访问 http://staging-domain:6081/并且您的应用重定向到 http://domain/因为它在其设置/配置中硬编码了“域”。很常见的事情。
所以解决方案是:
您可能还必须将真实端口转换为 Nginx 并在 Nginx 配置中禁用重定向端口:
port_in_redirect off;
如果一切都失败了,请使用专业的安装服务:)
关于centos - 子域的 plesk 上的 Varnish ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851690/