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