Назад | Перейти на главную страницу

Как получить перенаправление портов для двух серверов, работающих на одном сервере?

У меня запущено облако 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-адрес с обеих сторон - возможно, они будут разными, но мне это никогда не удавалось. Вышесказанное в значительной степени является тем, что у меня есть на некоторых из моих серверов.