Docker 中的 Varnish 更改后端,无需停机

Varnish in Docker change backend with no downtime

设置:[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 容器抱怨后端有 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 刷新,而无需终止清漆容器本身。

varnishreload

可以使用 varnishreload 命令重新加载 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 文档。

有关 varnishadm 环绕的 Varnish CLI 的更多信息,请参阅 http://varnish-cache.org/docs/6.0/reference/varnish-cli.html