Apache反向代理无法访问已暴露端口的Docker容器问题排查求助
各位大佬,我折腾了好久的Apache反向代理问题一直解决不了,求帮忙分析下!
情况是这样的:我在CentOS服务器上跑着正常的Apache/httpd服务,已经托管了几个网站,Apache监听80和443端口。SELinux已经禁用了,iptables也开放了80和8080端口允许所有接口访问。
现在需要新增一个网站,这个网站是打包成Docker Compose的LAMP应用,内部也是用Apache的。本来以为很简单,只要让外部的Apache把80端口的请求反向代理到Docker暴露的8080端口就行,预期的流程是:
[Internet] -> 外部Apache(:80) -> ProxyPass -> Docker(:8080) -> 内部Apache(:80) -> 网站内容
但不管怎么配置,就是不行!外部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本身的应用是没问题的; - 用
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应该连不上;
- 从家里的电脑直接访问服务器的8080端口也能正常打开网站,但访问80端口就不行,所以问题肯定出在本地Apache代理到8080这一步。
下面是我的配置文件:
Docker Compose配置
# 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>
有没有大佬能帮我看看哪里出问题了?
备注:内容来源于stack exchange,提问作者WackGet

