Субдомен sub.example.com
размещается на AWS EC2, ОС Amazon linux 2 на основе centos. Он запускает стек lampp php7. webroot это /var/www/html
.
У нас нет доступа к домену, example.com
, это с клиентом на другом сервере, он добавил наш поддомен CNAME. На сервере AWS размещается только поддомен.
Докер работает на localhost:8080/cms
, у него есть стек lampp php5, потому что 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
Но это не работает, я перепробовал много конфигураций прокси на основном сервере, апач внутри докера не трогал.
<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-адрес, тогда как на локальном сервере ему необходимо разрешить петлевой или локальный IP-адрес, если вы хотите использовать sub.example.com для прохода прокси и sub .example.com указывает на общедоступный IP-адрес / должен быть доступен из общедоступного Интернета.
Если возможно, я бы порекомендовал использовать localhost - и явно установить Host-Header, если ProxyPreserveHost должен быть включен, просто чтобы не нужно было открывать порт по адресу, отличному от loopback.
И для ваших маркеров:
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 без указания протокола)