Apache-2.2

Apache:proxypass docker容器到子域

  • October 27, 2019

子域sub.example.com託管在 AWS EC2、基於 centos 的 Amazon linux 2 作業系統上。它執行 php7 lampp 堆棧。網路根是/var/www/html.

我們無權訪問域,example.com它與另一台伺服器上的客戶端一起使用,他添加了我們的子域 CNAME。AWS 伺服器僅託管子域。

Docker 執行localhost:8080/cms,它有 php5 lampp 堆棧,因為 cms 是使用僅適用於 php5 的 cakephp 2 建構的,我們後端的其餘部分使用 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為主域而不是子域

我想做的就是做一個proxypass,所以不是一個去

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,在來這里之前我再次嘗試了所有組合。

在你的外部 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,則需要解析為環回或本地 IP .example.com 指向公共 IP / 可以從公共網際網路訪問。

如果可能的話,我會建議使用 localhost - 如果 ProxyPreserveHost 必須打開,則顯式設置 Host-Header,只是不需要在與環回不同的地址上公開埠。

對於您的要點:

  1. ProxyPass / sub.example.com:8080/cms重定向到example.com,而不是sub.example.com=> ProxyPass 根本不重定向,它代理/轉發。可能您從容器中的應用程序或網路伺服器獲得了重定向,因為請求http://sub.example.com/cms/作為對容器 apache 的請求http://sub.example.com:8080/cmscms/- 或者它根本沒有命中容器(我不確定 ProxyPass 在沒有指定協議的情況下是否有效)
  2. 如果沒有在某處配置或者是來自主機名等的解析器,則 Apache 本身不會將任何域理解為主域。但這應該不是問題(但您可能不想將 www.sub.example.com 包含為伺服器名稱,如果除了 sub.example.com 的 CNAME 之外,沒有解析為您的伺服器主機名/IP 的 CNAME,它應該不會造成傷害,但可能會產生令人困惑的輸出/連結,並且可能在某些時候使配置變得困難該虛擬主機的域不是有效域)
  3. 文件根目錄在這裡應該無關緊要。(最好有一個可訪問/可用於 apache 的文件根目錄,因為您不希望依賴可訪問文件的某些事情可能會失敗,如果不是)。

引用自:https://serverfault.com/questions/989531