【问题标题】:Varnish in Docker change backend with no downtimeDocker 更改后端中的清漆,无需停机
【发布时间】:2021-10-10 04:36:58
【问题描述】:

设置:[Varnish] <-> [Nginx] <-> [PHP FPM] <-> [PostgreSQL] Varnish、Nginx 和 PHP FPM 作为 Docker 容器运行。

当我们推送新代码时,我们至少需要用新构建更新 PHP 容器。我们的 CI/CD 管道还会触发 Nginx 重启docker exec -i $CONTAINER_ID_API_NGINX nginx -s reload,因此它将获取新创建的 PHP 容器的(内部)ip。

但有时 Nginx 容器也必须重新启动,例如,如果有新的静态资产。在这种情况下,我们还需要重新启动 Varnish,这就是我们的麻烦所在,也是我们的 API 有一些停机时间的地方。

我们尝试过的事情:

 1. Starting second Nginx
 2. Starting second Varnish
 3. Killing first Nginx
 4. Killing first Varnish

问题:第二个 Varnish Container 抱怨后端有 2 个 IP,并进入重启循环,直到第一个 Nginx 容器关闭。

 1. Starting second Nginx
 2. Killing first Nginx
 3. Starting second Varnish
 4. Killing first Varnish

问题:在第二个 varnish 接受连接之前,API 请求仍会转到第一个 Varnish 实例,它会尝试将它们转发到第一个(现已终止的)Nginx 实例

问题:有没有办法让 Varnish 将其后端主机切换到新的 Nginx 容器,无论是否重启? 我们的 VCL 文件目前包含

backend default {
  .host = "api-api";
  .port = "80";
}

在理想情况下,我们会启动第二个 Nginx 实例,Varnish 仍然将 DNS 缓存到第一个 Nginx 实例,我们杀死第一个 Nginx 实例并在 Varnish 实例上触发 DNS 刷新,而无需杀死 Varnish 容器自己。

【问题讨论】:

    标签: docker dns varnish varnish-vcl


    【解决方案1】:

    清漆重新加载

    可以使用varnishreload 命令重新加载 VCL。

    此命令将加载一个新的 VCL,对其进行编译,停用之前的 VCL 并激活新添加的 VCL。

    在解析和编译新的 VCL 文件时,将发生任何后端 DNS 解析。

    varnishreload 命令运行多个varnishadm 命令。有关代码的更多信息,请参阅https://github.com/varnishcache/pkg-varnish-cache/blob/master/systemd/varnishreload

    您可以选择在容器内运行 varnishreload 以自动重新加载 VCL,这也解析后端端点的 DNS。

    varnishadm 远程调用

    您也可以远程拨打varnishadm,但这需要一些额外的措施。

    请参阅 http://varnish-cache.org/docs/6.0/reference/varnishadm.html 获取 varnishadm 文档。

    请参阅 http://varnish-cache.org/docs/6.0/reference/varnish-cli.html 以了解有关 varnishadm 所包含的 Varnish CLI 的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 2016-09-21
      • 1970-01-01
      • 2018-10-02
      • 2017-11-24
      • 2017-05-03
      • 2017-07-21
      • 2020-07-12
      相关资源
      最近更新 更多