У меня запущено облако Amazon, в котором размещены два экземпляра tomcat (порты 8080 и 8081), причем каждый tomcat запускает веб-приложение (foo и bar) для разных клиентов.
Однако у меня возникла проблема с правильной работой перенаправления порта.
Я хочу, чтобы пользователи заходили на мой сайт по адресу www.foo.com
быть автоматически перенаправленным на www.foo.com:8080/foo_app
и пользователи, которые заходят на мой сайт по адресу www.bar.com
быть автоматически перенаправленным на www.bar.com:8180/bar_app
.
Но я также хочу, чтобы номера портов НЕ были частью URL-адреса. Это жизненно важно, поскольку большинство пользователей находятся в средах, где они не могут перейти к www.foo.com:8080
или www.bar.com:8180
и может общаться только через порт 80.
Итак, любой, кто набирает www.bar.com/bar_app
должен быть перенаправлен на www.bar.com:8081/bar_app
но URL по-прежнему должен быть www.bar.com/bar_app
Я пытался добиться этого следующим образом:
Я использовал следующую команду, чтобы сопоставить любое соединение порта 80 с портом 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Это отлично подходит для пользователей foo, но пользователи bar также перенаправляются. Можно ли сделать это сопоставление iptable применимым только для определенных "серверов"?
Я также добавил записи в /etc/apache2/httpd.conf
чтобы разрешить отображение с моего сервера на фактическое веб-приложение
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://123.123.123.123:8080/foo_app
ProxyPassReverse / http://176.34.212.135:8080/foo_app
ServerName www.foo.com
ServerAlias www.foo.com
</VirtualHost>
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://123.123.123.123:8180/bar_app
ProxyPassReverse / http://176.34.212.135:8180/bar_app
ServerName www.bar.com
ServerAlias www.bar.com
</VirtualHost>
Я был бы очень признателен за помощь от любого, кто может посоветовать, какой подход использовать.
Спасибо
Конфигурация iptables не нужна. На самом деле, вероятно, именно поэтому ваша проблема. Apache сделает прокси. Apache получает запросы на порт 80 для любого доменного имени и передает запросы на правильный сервер Tomcat через порт 8080 или 8180, как и вы.
То, что у вас есть, в целом нормально. Убедитесь, что у вас включены моды (прокси, proxy_http).
a2enmod proxy
a2enmod proxy_http
Перезагрузите Apache.
Они могут быть уже включены - он сообщит вам, были ли они включены.
Вот что я предлагаю для ваших записей VHost:
<VirtualHost *:80>
ServerName www.foo.com
ProxyPreserveHost On
ProxyPass /foo_app http://123.123.123.123:8080/foo_app
ProxyPassReverse /foo_app http://176.34.212.135:8080/foo_app
RewriteEngine on
RewriteRule ^/$ http://www.foo.com/foor_app
</VirtualHost>
<VirtualHost *:80>
ServerName www.bar.com
ProxyPreserveHost On
ProxyPass /bar_app http://123.123.123.123:8180/bar_app
ProxyPassReverse /bar_app http://176.34.212.135:8180/bar_app
RewriteEngine on
RewriteRule ^/$ http://www.bar.com/bar_app
</VirtualHost>
С ProxyPass у меня всегда сбалансирован URL-адрес с обеих сторон - возможно, они будут разными, но мне это никогда не удавалось. Вышесказанное в значительной степени является тем, что у меня есть на некоторых из моих серверов.