我有最基本的 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。