У меня несколько веб-приложений, работающих на собственном http-сервере, например приложение ruby / rails на порту 8080 и приложение python / cherrypy на 8081.
Можно ли сделать их прозрачно доступными через один адрес порта? Возможно, добавив третий http-сервер, который преобразует все запросы (например, http: // локальный / приложение1 & http: // локальный / приложение2). Моя предпочтительная платформа - Linux
То, что вы ищете, называется «обратным прокси». Есть много веб-серверов, которые имеют эту возможность, включая 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 используется в качестве «маршрутизатора / прокси» для вашего рубинового трафика. Таким образом, вам не нужны новые серверы / IP-адреса. Имейте в виду, что вы ЧЕМ Зависимость от Apache для направления трафика в ваше приложение.