【发布时间】: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