【问题标题】:docker-compose: varnish+apache2 return a 503 error `Backend fetch failed`docker-compose: varnish+apache2 返回 503 错误`Backend fetch failed`
【发布时间】:2019-12-09 04:08:57
【问题描述】:

我正在尝试基于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

当我在http://localhost:8080/ 进行测试时,web 服务运行良好。

怎么了?

【问题讨论】:

    标签: docker docker-compose varnish


    【解决方案1】:

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

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

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

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

    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
    

    重要的是,您的清漆配置如下所示:

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

    【讨论】:

    • 感谢您的准确回答,您的代码运行良好。但是,我想通过端口映射8080:80 保持我的“网络”服务器运行,以便能够测试/调试以直接访问我的应用程序(无需清漆)。当我在清漆配置文件中设置.port = "8080"; 时,我得到与以前相同的错误。我该如何继续?
    • @ben.IT 容器不与主机发布的端口通信。要在 varnish 和正在侦听容器内端口 80 的 Web 服务器容器之间进行通信,请在 varnish 配置中使用端口 80。
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2019-08-16
    • 2020-06-03
    • 2013-04-12
    • 2013-12-03
    • 1970-01-01
    • 2016-06-19
    • 2015-03-27
    相关资源
    最近更新 更多