
Я пытаюсь настроить два поддомена, для a
и b
в domain.com
. Я использую два файла .conf, которые выглядят примерно одинаково с соответствующими изменениями в ServerName и ProxyPass:
<VirtualHost *:80>
ServerName a.domain.com #This was added as a try for a fix.
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/a
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
ProxyPass / https://a.domain.com:8444/
ProxyPassReverse / https://a.domain.com:8444/
ProxyPass /a/ https://a.domain.com:8444/
ProxyPassReverse /a/ https://a.domain.com:8444/
ProxyPass /b/ https://b.domain.com:8445/
ProxyPassReverse /b/ https://b.domain.com:8445/
</VirtualHost>
Это делается в моей тестовой среде, воспроизводящей нечто похожее на то, что сейчас находится в производстве. В /etc/hosts я добавил a.domain.com
и b.domain.com
к 127.0.0.1. DNS в производстве имеет записи для того, что a.domain.com
и b.domain.com
есть, что является тем же IP (я также сделал это на машине, с которой я это тестирую).
Также обратите внимание, что я не обслуживаю контент из их корневых каталогов. Я добавил это, пытаясь исправить проблему, указанную в заголовке. Хотя в обоих каталогах есть простой html.
В чем же на самом деле проблема?
Просто, при попытке a.domain.com
, результатом является веб-приложение из localhost:8444
, как и ожидалось. При попытке b.domain.com
, результатом также является localhost:8444
, вместо localhost:8445
. Оба a.conf
и b.conf
включены, и если я отключу a.conf
, то я правильно получаю localhost:8445
. Если я также попробую как a.domain.com/b
, перенаправление разрешается обратно на a.domain.com
.
Я прочитал несколько вопросов и руководств, и большинство из них либо имеют что-то работающее, как в моей конфигурации, либо добавляют NameVirtualHost, который, как я понимаю, не нужен для моей версии Apache. Я также добавил ServerName в порт 80, так как думал, что, возможно, запрос b
сопоставлялся с , a.conf
поскольку у них одинаковый IP, но это тоже не сработало.
Что я здесь упускаю? Может, я что-то с mod_proxy игнорирую? Если возможно, я бы хотел сохранить один файл на веб-приложение. Спасибо!
Это сделано на Ubuntu 18.04.2, Apache 2.4 (mod_proxy и mod_ssl), Tomcat 9. Если вам понадобится дополнительная информация, я постараюсь предоставить ее.
ОБНОВЛЯТЬ
Пробовал и с этой конфигурацией. Тот же нежелательный результат.
<VirtualHost *:80>
ServerAlias a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
ОБНОВЛЯТЬ
Хорошо, я только что обнаружил нечто очень раздражающее. Если я ввожу в браузере или a.domain.com
, b.domain.com
они оба преобразуются в a.domain.com
. Это проблема, которую я описал изначально. НО если попробовать https://a.domain.com
или https://b.domain.com
, оба преобразуются в правильный сервер: a
в 8444
и b
в 8445
.
Поскольку это очень расстраивает, я возьму перерыв и проанализирую ситуацию через некоторое время.
ОБНОВЛЯТЬ
После долгого перерыва я попробовал еще несколько случайных настроек, чтобы посмотреть, что произойдет, и снова ничего не работало так, как ожидалось, за исключением случаев использования HTTPS. Я установил Postman, чтобы посмотреть, что отправляется в запросе, и обнаружил, что в Postman и HTTP, и HTTPS правильно используют Host. Еще лучше/хуже: фактический ответ показывает разные страницы приветствия для a.domain.com
и b.domain.com
, что означает, что мои конфигурации работают правильно, когда я использую Postman.
Я думаю, что все эти мытарства могут быть просто проблемой кэша, но мой тестовый браузер (Firefox dev ed) настроен так, чтобы не кэшировать ничего. Я проверю ответы с помощью curl и с помощью других моих браузеров.
решение1
Преступник:Кэш.
В какой-то момент конфигурация моего браузера изменилась (возможно, обновление?), и у меня было более 3 ГБ кэша, включая тестовые сайты, которые я пытался настроить как поддомены. Ужас.
После очистки кэша появилось предупреждение о моем самоподписанном сертификате при переходе по моим URL, как и ожидалось. После принятия рисков я был перенаправлен на нужные сайты. Это при использовании b.domain.com
без добавления протокола.
Чтобы убедиться, что это работает, я протестировал все мои остальные 7 браузеров (надо убедиться) и curl с протоколом и без него, и результаты также были желаемыми.
В конце концов, конфигурация была в порядке. Я выложу ее здесь, если понадобится.Сервер Apache, проксирующий определенные экземпляры Tomcat через поддомен, с использованием proxy_mod, который также немедленно перенаправляет с порта 80 на порт 433.
<VirtualHost *:80>
ServerName a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
SSLEngine On
SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
SSLVerifyClient none
#Proxies
ProxyRequests Off
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
#Redirections
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
Пожалуйста, примите во внимание, что настройки для SSL Proxy и SSL предназначены для самоподписанных сертификатов. Пожалуйста, прочтите соответствующую документацию для каждого, если вы реализуете это для продуктивных сред. Также обратите внимание, что это файл конфигурации для a.domain.com
. Эквивалент для b.domain.com
точно такой же, с соответствующими ServerName, ServerAlias, перенаправлениями, Location и портом localhost.