【问题标题】:Docker Swarm and Nginx + VarnishDocker Swarm 和 Nginx + Varnish
【发布时间】:2021-10-20 16:41:06
【问题描述】:

我有一个包含 Nginx、PhpFpm 和 Varnish 的 docker-compose 文件。

我的 Nginx 是这样工作的: 用户连接到网站 => Nginx (443) => Varnish (80) => Nginx (8080) => Phpfpm:9000 或其他..

我的项目与 docker-compose 中的“depends_on”配置配合得很好。 但是,对于 docker swarm,depends_on 会被忽略。

我的问题开始了..

我的 Varnish 容器需要 Nginx 运行,否则它会崩溃,因为在配置文件顶部定义了主机名:

# varnish config file
backend default {
  .host = "nginx";
  .port = "8080";
  .connect_timeout = 10s;
  .first_byte_timeout = 10s;
  .between_bytes_timeout = 10s;
}

而且,我的 nginx,需要清漆才能运行,否则它也会崩溃......

# pass to varnish
location / {
    proxy_pass http://varnish;
}

upstream varnish {
    server varnish:80;
}

太棒了,varnish 崩溃是因为 nginx 没有启动,而 nginx 崩溃是因为 varnish 没有启动。

这个问题有解决办法吗?

【问题讨论】:

    标签: docker nginx docker-compose varnish swarm


    【解决方案1】:

    Varnish 容器失败的原因是 nginx 主机名无法解析为 IP 地址。

    docker-compose.yml 可以为各种容器分配静态 IP 地址。请考虑固定 IP 地址并将其中一个分配给 Varnish 后端的 .host 属性。

    这样可以避免循环依赖。即使 IP 地址还不存在,Varnish 也不会抱怨。 Varnish 仅在发生缓存未命中或缓存绕过时才连接到后端。

    【讨论】:

    • 感谢您的回复。固定 IP 地址真的是一个很好的解决方案吗? docker 会在其他系统上工作,因为网络会与我家的不同吗?
    • 主机名当然更好,但您已经知道 DNS 解析或不存在的主机名(目前)会发生什么。另一种方法是最初使用backend default none 加载Varnish,一旦一切就绪并运行,您可以通过varnishadm vcl.loadvarnishadm vcl.use 加载实际的VCL 文件
    • 谢谢,不错的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多