docker-compose: varnish+apache2 return 503 错误“后端获取失败”

docker-compose: varnish+apache2 return a 503 error `Backend fetch failed`

我正在尝试 运行 一个基于 varnishphp7.1+apache2 服务的非常简单的 Docker-compose.yml 文件:

version: "3"
services:
  cache:
    image: varnish
    container_name: varnish
    volumes:
      - ./default.vcl:/etc/varnish/default.vcl
    links:
      - web:webserver
    depends_on:
      - web
    ports:
      - 80:80
  web:
    image: benit/stretch-php-7.1
    container_name: web
    ports:
      - 8080:80
    volumes:
      - ./index.php:/var/www/html/index.php

default.vcl 包含:

vcl 4.0;

backend default {
  .host = "webserver";
  .port = "8080";
}

我在 http://localhost/ 浏览时遇到以下错误:

Error 503 Backend fetch failed

Backend fetch failed
Guru Meditation:

XID: 9

Varnish cache server

web 服务在 http://localhost:8080/ 测试时工作正常。

怎么了?

您需要将 varnish 配置为在端口“80”上与 "web" 通信,而不是在端口“8080”上与 "webserver" 通信。

"web" 来自您撰写文件中的服务名称。无需设置容器名称,而且如果您转换到 swarm 模式,这确实会破坏扩展或执行滚动更新的能力。链接已被弃用,以支持 docker compose 将提供的共享网络(链接非常脆弱,如果您更新 Web 容器就会中断)。并且 depends_on 不能保证其他服务已准备好接收请求。如果您很难从启动到 Web 服务器准备好接收请求来保持 varnish,那么您需要使用任务更新入口点以等待远程端口可访问并制定如何处理的计划Web 服务器出现故障。

80端口来自容器端口。如果您只想通过清漆访问它,则无需在 docker 主机上发布端口 8080,这对许多人来说都是安全风险。容器直接与容器端口通信,而不是返回到主机并映射回容器。

生成的撰写文件可能如下所示:

version: "3"
services:
  cache:
    image: varnish
    container_name: varnish
    volumes:
      - ./default.vcl:/etc/varnish/default.vcl
    ports:
      - 80:80
  web:
    image: benit/stretch-php-7.1
    volumes:
      - ./index.php:/var/www/html/index.php

重要的是,您的 varnish 配置应如下所示:

vcl 4.0;

backend default {
  .host = "web";
  .port = "80";
}