centos - 子域的 plesk 上的 Varnish

标签 centos varnish plesk

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

我们的网站在域上运行,例如- 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。
  • nginx.php
  • nginxDomainForwarding.php
  • nginxDomainForwardingIpDefault.php
  • nginxDomainVhost.php
  • nginxDomainVhostIpDefault.php
  • nginxWebmail.php

  • 然后我们改变了, Varnish 监听端口到 80 而不是端口 6081 但是当我们启动 Varnish 时,它直接显示失败并且我们的域 - staging.domain1.com 无法加载所以我们恢复了上面的所有内容,即
  • 端口 6081 上的 Varnish [VCL 后端位于 80]
  • Apache 7080
  • nginx 80

  • 我假设我应该有以下情况:
  • Varnish - 端口 80 [default.vcl 文件应该 greb 来自 8080 端口的内容]
  • Nginx - 端口 8080
  • Apache - 端口 7080。

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

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

    最佳答案

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

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

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

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

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

    所以解决方案是:
  • 将 Varnish 监听 IP 更改为 80
  • 将 Nginx/无论您的后端 Web 服务器更改为不同的端口,即 8080
  • 将 varnish VCL 后端定义调整为 Web 服务器的 IP 和端口,即 192.168.1.26 和 8080
  • 调整您的网络应用程序设置,尤其是基本 URL

  • 您可能还必须将真实端口转换为 Nginx 并在 Nginx 配置中禁用重定向端口:
    port_in_redirect off;
    

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

    关于centos - 子域的 plesk 上的 Varnish ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851690/

    相关文章:

    regex - 避免使用Varnish对来自不同URI的可用项进行双重缓存

    django - 为缓存 django 站点设置 Varnish 的正确方法

    windows-server-2003 - Windows 的 Plesk 替代品

    mysql - 如何解决Mariadb与mysql冲突安装mySQL-python依赖

    postgresql - 无法远程连接到 Postgres Docker 容器

    Varnish 在刷新期间服务旧对象

    php - 如何使用 Plesk 在我的网络服务器上禁用 https?

    linux - 使用 xinetd 进行端口转发

    php - 如何安装旧版本的PHPUNIT?

    centos - Postfix 与 SendGrid 集成,但此后停止发送电子邮件