Apache:proxypass docker容器到子域
子域
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>
ProxyPass / sub.example.com:8080/cms
重定向到example.com
,不是sub.example.com
,我不希望這樣,因為我無權訪問主域- 我認為我不需要指定
servername
,因為 apache 理解sub.example.com
為主域,在發布此問題之前我再次嘗試了每種組合,沒有任何效果,我也不確定 dns 配置是如何完成的。我想指定一個servername
,因為這樣 certbot 將能夠檢測到它並向它添加letsencrypt- 我不知道我是否需要指定一個
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,只是不需要在與環回不同的地址上公開埠。
對於您的要點:
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 在沒有指定協議的情況下是否有效)- 如果沒有在某處配置或者是來自主機名等的解析器,則 Apache 本身不會將任何域理解為主域。但這應該不是問題(但您可能不想將 www.sub.example.com 包含為伺服器名稱,如果除了 sub.example.com 的 CNAME 之外,沒有解析為您的伺服器主機名/IP 的 CNAME,它應該不會造成傷害,但可能會產生令人困惑的輸出/連結,並且可能在某些時候使配置變得困難該虛擬主機的域不是有效域)
- 文件根目錄在這裡應該無關緊要。(最好有一個可訪問/可用於 apache 的文件根目錄,因為您不希望依賴可訪問文件的某些事情可能會失敗,如果不是)。