Транспарентно сделать несколько веб-приложений доступными по одному адресу

У меня есть несколько веб-приложений, работающих на их собственном http-сервере, например, приложение ruby ​​/ rails на порту 8080 и приложение python / cherrypy на 8081.

Можно ли сделать их прозрачно доступными через адрес одного порта? Возможно, добавив третий http-сервер, который преобразует все запросы (например, http://localhost/app1 & http://localhost/app2). Моя платформа выбора - Linux

3 ответа

Решение

То, что вы ищете, называется "обратный прокси". Существует множество веб-серверов с такой возможностью, в том числе Apache httpd, lighttpd и nginx, а также более урезанные веб-серверы, предназначенные исключительно для обратного прокси.

Поскольку Apache, скорее всего, будет доступен для вас и / или прост в развертывании, этот фрагмент кода, который будет включен в соответствующий раздел ваших файлов конфигурации Apache, должен дать вам минимальную конфигурацию того, что вам нужно, при условии, что у вас установлен mod_proxy_http и включен:

# ... [snip] ...
<VirtualHost *:80>
# ... [snip] ...

# This line prevents mod_proxy from acting as a forward proxy
# Yes it looks silly, but it's correct for reverse proxy configurations
ProxyRequests Off

# Rails app on port 8080
ProxyPass /app1 http://localhost:8080
ProxyPassReverse /app1 http://localhost:8080

# CherryPy app on port 8081
ProxyPass /app2 http://localhost:8081
ProxyPassReverse /app2 http://localhost:8081

# ... [snip] ...
</VirtualHost>

Обновление: вот некоторые ссылки на (иногда плотную) документацию для различных серверов:

Слово Мудрому

Также учтите, что при использовании обратного прокси серверные приложения больше не будут получать запросы от IP-адреса клиента, инициирующего запрос. Вместо этого все запросы будут поступать от localhost (127.0.0.1). Таким образом, любая логика, связанная с IP клиента, перестанет работать. Если вашему приложению нужны метаданные этого запроса, вам нужно будет выполнить процедуру, зависящую от вашего обратного прокси-сервера HTTP.

В Apache mod_proxy автоматически добавляет заголовок X-Forwarded-For к запросу, значением которого является IP-адрес запроса, поступившего в Apache (или список IP-адресов, которые перенаправили запрос, если у вас есть цепочка из нескольких обратных прокси-серверов). Я полагаю, что для Nginx вам, возможно, придется дать указание серверу отправить такой заголовок (подробности см. По ссылке выше).

Если ваше внутреннее приложение заботится о заголовке Host: из исходного запроса клиента, вам необходимо изменить этот код, чтобы искать (в Apache) заголовок X-Forwarded-Host.

Это называется обратный прокси. Вы можете сделать это с Apache, а также с другими веб-серверами. Есть также выделенные прокси-серверы, которые вы также можете использовать.

Да, вы можете сделать что-то подобное в APACHE, используя mod_jk

Подробности здесь: http://www.ruby-forum.com/topic/211503

По сути, APACHE используется как "маршрутизатор / прокси" для вашего рубинового трафика. Таким образом, вам не нужны новые серверы / ips. Имейте в виду, что вы ТОЛЬКО зависим от Apache для направления трафика в ваше приложение.

Другие вопросы по тегам