【问题标题】:Docker apache container redirect to another containerDocker apache容器重定向到另一个容器
【发布时间】:2021-12-14 12:18:01
【问题描述】:

我有两个 apache 容器连接到同一个桥接网络。第一个 apache 172.20.10.2 和端口 8080(内部 80)第二个 apache 172.20.10.6 和端口 9999(内部 80)。

第一个 apache 在端口 80 上配置了两个虚拟主机。 第一个 vhost 在那个 apache 上支持 mydomain.com 并且一切正常。 第二个虚拟主机支持 subdomain.mydomain.com 并重定向到第二个 apache 服务器。 此重定向不起作用,并且在日志中我收到了该错误:

"GET /favicon.ico HTTP/1.1" 502 360
[proxy:error] [pid 43:tid 3028272160] (111)Connection refused: AH00957: http: attempt to connect to 172.20.10.6:9999 (172.20.10.6) failed
[proxy_http:error] [pid 43:tid 3028272160] [client Client_IP:PORT] AH01114: HTTP: failed to make connection to backend: 172.20.10.6
"GET / HTTP/1.1" 503 299
[proxy:error] [pid 8:tid 3011486752] [client Client_IP:PORT] AH00898: DNS lookup failure for: 172.20.10.6:9999favicon.ico returned by /favicon.ico, referer: http://subdomain.mydomain.com/
"GET /favicon.ico HTTP/1.1" 502 360

docker-compose.yml

version: "3.8"

volumes:
  httpd_all:
  httpd_all_2:

networks:
  frontend_web:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.10.0/29

services:

  httpd:

    container_name: httpd
    image: httpd:latest
    hostname:
      srv_www01
    ports:
      - 8080:80/tcp
      - 8043:443/tcp
    volumes:
      - httpd_all:/usr/local/apache2/
    networks:
      frontend_web:
        ipv4_address: 172.20.10.2
    restart: unless-stopped

  httpd_2:

    container_name: httpd_2
    image: httpd:latest
    hostname:
      srv_www02
    ports:
      - 9999:80/tcp
      - 9998:443/tcp
    volumes:
      - httpd_all_2:/usr/local/apache2/
    networks:
      frontend_web:
        ipv4_address: 172.20.10.6
    restart: unless-stopped

第一个 apache 172.20.10.2 上的虚拟主机

<VirtualHost *:80>
        ServerName mydomain.com
        ServerAlias mydomain.com
        DocumentRoot /usr/local/apache2/htdocs
        Alias /jasno "/usr/local/apache2/htdocs"

</VirtualHost>

<VirtualHost *:80>
        ServerName subdomain.mydomain.com
        ServerAlias www.subdomain.mydomain.com

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyVia Full

        <Proxy *>
                Require all granted
        </Proxy>

        ProxyPass "/" "http://172.20.10.6:9999"
        ProxyPassReverse "/" "http://172.20.10.4:9999"

</VirtualHost>

【问题讨论】:

    标签: docker apache proxy


    【解决方案1】:

    容器之间的连接忽略ports:。如果第二个容器内的进程侦听端口 80 和 443,则容器之间的连接将永远只使用这些端口,即使 ports: 使它们作为主机外部的其他东西可见。由于端口 80 是默认的 HTTP 端口,因此您可以将其完全排除在配置之外:

    ProxyPass "/" "http://172.20.10.6"
    

    您可以进一步简化此设置。正如 Docker 文档中的 Networking in Compose 中所述,Docker 提供了一个内部 DNS 系统,并且每个容器都可以使用其 Compose 服务名称从同一 Compose 文件中的其他容器访问。您可以在 Apache 设置中使用该主机名,而不是手动指定 IP 地址

    ProxyPass "/" "http://httpd_2"
    

    完成此操作后,您可以大大简化 Compose 设置。让 Docker 自己选择 IP 地址而不是手动分配它们几乎总是安全的。 Compose 还可以分配容器名称,它会为您创建一个名为default 的网络,而hostname: 设置通常没有明显的效果。您应该能够将其缩减为:

    version: "3.8"
    
    volumes:
      httpd_all:
      httpd_all_2:
    
    services:
      httpd:
        image: httpd:latest
        ports:
          - 8080:80/tcp
          - 8043:443/tcp
        volumes:
          - httpd_all:/usr/local/apache2/
        restart: unless-stopped
    
      httpd_2:
        image: httpd:latest
        # ports:              only if the service needs to be
        #   - 9999:80/tcp     accessed from outside Docker; not used
        #   - 9998:443/tcp    for connections between containers
        volumes:
          - httpd_all_2:/usr/local/apache2/
        restart: unless-stopped
    

    【讨论】:

    • 感谢您的帮助。它有效。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2019-02-24
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多