【问题标题】:varnish on plesk for subdomain子域的 plesk 上的清漆
【发布时间】:2017-06-10 15:20:27
【问题描述】:

我知道我在问题中添加了太多信息,但请多多包涵。

我们的网站在域上运行,例如- domain1.com 有 ip 说例如- 192.168.1.25。现在,我们有另一台通过 IP 运行的服务器,例如192.168.1.26 具有 plesk 面板 12.5.30。请注意,我们没有将我们的域 - domain1.com 指向 192.168.1.26,因为我们希望保留 它是私有的,直到我们设置好一切并准备开始作为生产工作。我们已经在 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 上运行网站。

我们想在新服务器上配置清漆并且我们安装了它。 [我们已经在 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

我们将一条记录设置为 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。

  • nginx.php
  • nginxDomainForwarding.php
  • nginxDomainForwardingIpDefault.php
  • nginxDomainVhost.php
  • nginxDomainVhostIpDefault.php
  • nginxWebmail.php

然后我们更改了,varnish 监听端口为 80 而不是端口 6081,但是当我们启动 varnish 时,它直接显示失败并且我们的域 - staging.domain1.com 无法加载,所以我们恢复了上面的所有内容,即

  • varnish 端口 6081[VCL 后端位于 80]
  • 阿帕奇 7080
  • nginx 80

我认为我应该有以下情况:

  • 清漆 - 端口 80 [default.vcl 文件应该 greb 来自 8080 端口的内容]
  • Nginx - 端口 8080
  • Apache - 端口 7080。

在第一种情况下,我们无法确认 varnish 是否正确配置[如果我们设置 IP 而不是真实主机名],在第二种情况下,我们无法启动 varnish 服务,尽管它应该是理想情况。

基本上,我不明白这里有什么问题。

【问题讨论】:

    标签: centos varnish plesk


    【解决方案1】:

    首先,不要将 Varnish 与 Plesk 或任何控制面板一起使用。这永远不会带来好的结果。在基本的 Linux 服务器上使用它,以便您更好地了解正在发生的事情。

    第二,你快到了 :) varnish VCL 中的后端 IP 必须保持为 IP。将域而不是 IP 放在那里是错误的。 Varnish 会自动将您的 HTTP 请求中的 Host 标头转换到底层后端服务器上。 所以如果你打开一个 URL 为http://staging-domain:6081/ 的页面,那么会发生什么:

    • 带有 Host:staging-domain 的 HTTP 请求到达 Varnish
    • 然后 Varnish 会将其传递给具有相同值的 Apache/Nginx。

    您最初的问题很可能是由您的应用/网站发起的重定向。

    简单地说,您正在尝试访问http://staging-domain:6081/,并且您的应用重定向到http://domain/,因为它在其设置/配置中硬编码了“域”。很常见的事情。

    所以解决办法是:

    • 将清漆监听 IP 更改为 80
    • 将 Nginx / 无论您的后端 Web 服务器更改为不同的端口,即 8080
    • 将 varnish VCL 后端定义调整为 Web 服务器的 IP 和端口,即 192.168.1.26 和 8080
    • 调整您的网络应用设置,尤其是基本 URL

    您可能还需要将真实端口转换为 Nginx 并在 Nginx 配置中禁用重定向端口:

    port_in_redirect off;
    

    如果都失败了,请使用专业的安装服务:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多