Выходя напрямую несколько веб-приложений на порте 80 использований прокси

У меня есть несколько веб-приложений, размещенных на сервере AWS на различных портах, например.

app1: http://x.x.x.x:8080
app2: http://x.x.x.x:9000
...

Я хотел бы к прокси перед этими приложениями (апач, nginix и т.д.) так, чтобы ко всем ним можно было получить доступ с помощью порта 80. Я мог думать о двух подходах:

  • Поместите каждое приложение на различный субдомен и передайте на основе субдомена, например,

    http://app1.mydomain.com --> http://x.x.x.x:8080
    http://app2.mydomain.com --> http://x.x.x.x:9000
    

Однако в моем случае, я не управляю созданием субдоменов. Мне дали на субдомене, и я должен жить с этим. Таким образом, этот подход не работает.

  • Используйте отдельный URL для каждого приложения и затем перепишите URL, например.

    http://mysubdomain.mydomain.com/app1 --> http://x.x.x.x:8080
    http://mysubdomain.mydomain.com/app2 --> http://x.x.x.x:9000
    

Однако я сталкиваюсь с проблемой с этим подходом. Например, http://mysubdomain.mydomain.com/app1 правильно возвраты index.html от app1, но затем который index.html просит js и файлы CSS без app1 префикса, например, он просит http://mysubdomain.mydomain.com/js/main.js вместо http://mysubdomain.mydomain.com/app1/js/main.js. Как Вы видите, передающее правило больше не работает. Еще более сбивающий с толку это, если мой начальный запрос завершается с наклонной чертой (http://mysubdomain.mydomain.com/app1/), затем запросы на js и файлы CSS отформатированы правильно (http://mysubdomain.mydomain.com/app1/js/main.js). Я не понимаю это поведение!

Есть ли какой-либо другой подход, о котором можно думать? Я услышал об отображении заголовка хоста, но не мог выяснить, как оно работает. Я не могу предположить, что эта проблема не была решена!

Редактирования на основе предложения от @stoned

Мне вручили веб-приложение из http://x.x.x.x:8080. Этот URL служит файлу index.html, который вытягивает в наборе файлов JavaScript и CSS.

Вот моя попытка инвертировать прокси это приложение с помощью Apache, работающего в http://www.example.com:

# Reverse proxy requests for /app1 to http://x.x.x.x:8080
ProxyRequests off
ProxyPass /app1 http://x.x.x.x:8080
ProxyPassReverse /app1 http://x.x.x.x:8080

Это не работает, когда я ввожу http://www.example.com/app1 в моем браузере (не отмечают наклонной черты в конце).

  • index.html подается правильно
  • Однако index.html просит CSS и js со строками как это:

    <link rel="stylesheet" href="vendor/bootstrap.min.css"/> 
    <script src="vendor/angular.min.js"></script>
    
  • Это переводит в запросы как это без app1 встроенный в URL:

    http://www.example.com/vendor/bootstrap.min.css
    http://www.example.com/vendor/angular.min.js
    
  • Очевидно, обратный прокси не знает, что сделать с ними!

  • Однако, если я добавляю наклонную черту в конце URL (http://www.example.com/app1/), затем запросы переводятся правильно:

    http://www.example.com/app1/vendor/bootstrap.min.css
    http://www.example.com/app1/vendor/angular.min.js
    

Я не понимаю, как добавление наклонной черты в конце заставляет браузер вести себя по-другому! Так или иначе важный момент - то, что я не могу ожидать, что мои пользователи введут наклонную черту в конце. Какие-либо мысли о том, как решить эту проблему?

Решенный - наконец!

После набора поиска с помощью Google я нашел, что запаздывающая наклонная черта используется, чтобы указать, что требуемый ресурс является каталогом. В таких случаях ресурс "по умолчанию" из каталога возвращается (обычно index.html). Если пользователь неправильно запрашивает каталог без запаздывающей наклонной черты, mod_dir (который обычно загружается в установках Apache), добавляет запаздывающая наклонная черта и делает клиентское перенаправление, решая проблему.

В моем случае, http://www.example.com/app1 не перенаправлял к http://www.example.com/app1/ (с запаздывающей наклонной чертой), потому что /app1 не реальный каталог на апачском сервере - mod_dir, не обнаруживал это. Следовательно этот URL проксировался на http://x.x.x.x:8080, как. В то время как это правильно возвращало index.html, но последующие запросы были относительно http://www.example.com и нет http://www.example.com/app1. Для решения проблемы я добавил переписать правило перенаправить http://www.example.com/app1 кому: http://www.example.com/app1/ (с наклонной чертой). Я также изменил свои обратные правила прокси только соответствовать, если я нахожу запаздывающую наклонную черту. Посмотрите ниже:

# Fix any request for /app1 to /app1/
RewriteEngine on
RewriteRule ^/app1$  /app1/  [R]

# Reverse proxy requests for /app1/ to http://x.x.x.x:8080/
ProxyRequests off
ProxyPass /app1/ http://x.x.x.x:8080/
ProxyPassReverse /app1/ http://x.x.x.x:8080/
0
задан 8 September 2014 в 15:19
1 ответ

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

ProxyRequests off
ProxyPass /app1 http://x.x.x.x:8080
ProxyPassReverse /app1 http://x.x.x.x:8080
ProxyPass /app2 http://x.x.x.x:9000
ProxyPassReverse /app2 http://x.x.x.x:9000

(Конечно, в вашем Apache должна быть включена и загружена функция mod_proxy_http) Если ваше приложение использует файлы cookie, возможно, вам также потребуется правильно установить директивы ProxyPassReverseCookieDomain и ProxyPassReverseCookiePath. Вы можете прочитать соответствующую документацию здесь .

Также вы забыли упомянуть, какой сервер приложений вы используете, даже если я вижу, что вы используете какой-то сервер приложений java. Имейте в виду, что часто серверам приложений совсем не понравится, если вы измените контекст приложения, который вы должны держать даже на прокси-сервере, чтобы быть в безопасности.

Наконец, что касается переписывания вашего url, извините, но если вы не опубликуете вашу точную конфигурацию, я думаю, что никто не сможет вам помочь. Имейте в виду, что в любом случае косые черты действительно имеют значение для серверов web/приложений. Некоторые добавляют их автоматически, другие нет.

0
ответ дан 5 December 2019 в 13:22

Теги

Похожие вопросы