Apache:通过 proxypass 将 docker 容器转发到子域

Apache:通过 proxypass 将 docker 容器转发到子域

子域名sub.example.com托管在 AWS EC2 上,Amazon Linux 2 OS 基于 centos。它运行 php7 lampp 堆栈。webroot 是/var/www/html

我们无法访问该域名,example.com它位于另一台服务器上的客户端,他添加了我们的子域名 CNAME。AWS 服务器仅托管子域名。

Docker 运行在 上localhost:8080/cms,它有 php5 lampp 堆栈,因为 cms 是使用 cakephp 2 构建的,它只适用于 php5,我们后端的其余部分使用 php7。

docker run --name cakephp --always-restart -p 8080:80 -d -v /home/ec2-user/cms:/var/www/html porchn/php5.6-apache

现在,无需任何 apache 配置,清理 lampp 安装,如果你去

localhost:8080/cms 或者server-ip:8080/cms

它会重定向到

sub.example.com:8080/cms

这是可行的,所以在我看来,apache 理解sub.example.com为主域,而不是子域

我只想做一个代理,这样就不用去

sub.example.com:8080/cms

他应该可以去

sub.example.com/cms

但那是行不通的,我在主服务器上尝试了许多代理配置,我没有触碰docker里面的apache。

<VirtualHost *:80>
 ProxyPreserveHost On 
 ProxyRequests Off
 ServerName www.sub.example.com
 ServerAlias sub.example.com
 ProxyPass / sub.example.com:8080/cms
 ProxyPassReverse / sub.example.com:8080/cms
 </VirtualHost>
  1. ProxyPass / sub.example.com:8080/cms重定向到example.com,不是sub.example.com,我不想要那样,因为我无权访问主域

  2. 我认为我不需要指定servername,因为 apache 将其理解sub.example.com为主域,在发布此问题之前,我再次尝试了所有组合,但都没有用,我也不确定 dns 配置是如何完成的。我想指定一个,servername因为这样 certbot 就可以检测到它并向其中添加 letsencrypt

  3. 我不知道是否需要指定DocumentRoot,在来这里之前我再次尝试了所有组合。

答案1

在你的外部 Apache 上尝试这个:

<VirtualHost *:80>
 ProxyPreserveHost On 
 ProxyRequests Off
 ServerName www.sub.example.com
 ServerAlias sub.example.com
 ProxyPass /cms/ http://sub.example.com:8080/cms/
 ProxyPassReverse /cms/ http://sub.example.com:8080/cms/
</VirtualHost>

首先,如果这不起作用,请将请求的重定向标头发布到http://sub.example.com/cms/

还请记住,sub.example.com 可能需要解析为外部(弹性)IP,而在本地服务器上,如果您想使用 sub.example.com 进行代理传递,并且 sub.example.com 指向公共 IP / 可以从公共互联网访问,则它需要解析为环回或本地 IP。

如果可能的话我建议使用 localhost - 并且如果 ProxyPreserveHost 必须打开则明确设置 Host-Header,这样就不需要在不同于环回的地址上公开端口。

要点如下:

  1. ProxyPass / sub.example.com:8080/cms重定向到example.com,不是sub.example.com=> ProxyPass 根本不重定向,它代理/转发。可能您从容器中的应用程序或 Web 服务器获得重定向,因为对 的请求http://sub.example.com/cms/作为对 的请求到达容器 apache http://sub.example.com:8080/cmscms/- 或者它根本没有到达容器(我不确定在没有指定协议的情况下 ProxyPass 是否有效)
  2. 如果未在某处进行配置,或者是从主机名或类似内容进行解析,则 Apache 本身不会将任何域理解为主域。但这应该不是问题(但如果没有 CNAME 可以解析为您服务器的主机名/ip,您可能不想将 www.sub.example.com 作为服务器名称包含在内,除了 sub.example.com 的 CNAME,这不会造成危害,但可能会产生令人困惑的输出/链接,并且可能在某些时候使配置变得困难,因为该虚拟主机的主域不是有效域)
  3. 文档根目录在这里并不重要。(最好有一个可供 apache 访问/使用的文档根目录,因为如果没有,您不希望依赖可访问文档的某些东西可能会失败)。

相关内容