尽管端口已暴露并开放,Apache 代理仍无法访问 Docker 容器

尽管端口已暴露并开放,Apache 代理仍无法访问 Docker 容器

我有最基本的 Apache 代理设置,但它无法工作。

在 CentOS 服务器上,我运行常规的 Apache/httpd 设置,它为一些网站提供服务。Apache 监听端口 80 和 443。

SELinux 被禁用,并且 iptables 防火墙中的所有接口都允许使用端口 80 和 8080。

我被要求建立一个附加网站,但该网站被打包为 Docker Compose LAMP 应用程序,其内部也使用 Apache。

应该很简单,对吧?我所要做的就是使用外部 Apache 将传入流量从端口 80 代理到 Docker 公开的任何端口(例如 8080):

[Internet] -> External Apache (:80) -> ProxyPass -> Docker (:8080) -> Internal Apache (:80) -> [Content]

但无论我做什么,它就是不起作用。我让外部 Apache 代理在端口 80 上监听得很好,我可以看到传入的请求。但代理请求就是无法到达 Docker 公开的服务器。

我在外部 Apache 日志中看到的错误是:

[proxy_http:error] [pid 11669] (70007)The timeout specified has expired: [client xxx:59517] AH01102: error reading status line from remote server localhost:8080

Docker Apache 内部日志中没有任何内容。

笔记:我尝试暂时停止我的外部 Apache 实例,并允许 Docker 堆栈使用 直接向服务器公开自身ports: 80:80,并且这是可以到达的- 所以我知道 Docker 堆栈可以正常工作。问题出在端口映射和/或代理上。

奇怪的是,我知道 Docker 正确地公开了端口,因为它在被探测时做出了响应:

# nc -zv localhost 8080
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 127.0.0.1:8080.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

我猜这也排除了防火墙的原因,因为如果它被防火墙阻隔,我预计 Ncat 会被拒绝。

docker-compose.yml我的文件如下所示:

# docker-compose.yml
version: '3'

services:
  php:
    image: php:7.2-apache
    ports:
      - 8080:80
    volumes:
      - ./html:/var/www/html # Contains index.php

这是外部 Apache 代理配置文件:

# apache2 running outside of Docker
# test.local-vhost.conf
LoadModule proxy_module      modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80>

    ServerName example.com

    ProxyPreserveHost On
    ProxyPass         / http://localhost:8080
    ProxyPassReverse  / http://localhost:8080

</VirtualHost>

有趣的是,当我从家用电脑浏览端口 8080 时,它工作正常。但是当我浏览端口 80 时,它却不行。所以一定是因为代理无法在同一台机器上访问端口 8080。

相关内容