Перенаправить трафик на основе URL-адреса на другой IP-адрес, сохраняя информацию о порте и URL
У нас есть QA-версия, UAT-версия и DEV-версия веб-приложения. Пользователи должны получить доступ к ним через http://uat.company.com:41002/webapp
, http://qa.company.com:41002/webapp
, а также http://dev.company.com:41002/webapp
, Существует также другое веб-приложение на порту 41001, а также на порту 8080, к которому они должны получить доступ.
Эти URL-адреса должны быть доступны для внешней компании, и у нас есть только один публичный IP-адрес, к которому они могут быть доступны. Как таковые записи DNS требуют, чтобы все 3 адреса указывали на один IP. На этом одном IP-адресе сервер находится под управлением nginx. в фоновом режиме мне нужно для каждого URL-адреса, чтобы указать на другой сервер
http://uat.company.com --> 123.123.123.1
http://qa.company.com --> 123.123.123.2
http://dev.company.com --> 123.123.123.3
Боюсь, я не знаю правильной терминологии, однако оставшаяся часть URI и порт также должны быть перенесены на IP-адрес. Т.е. если кто-то посещает
http://uat.company.com:41002/webapp/somepage`
это будет выглядеть так, как будто это страница, которую они посетили, но на самом деле они будут смотреть на
http://123.123.123.1:41002/webapp/somepage
или если они посетили
http://qa.company.com:8080/static/home.html
они действительно будут смотреть на
http://123.123.123.2:8080/static/home.html
но их браузер все равно сказал бы http://qa.company.com:8080/static/home.html
я пытался
server {
server_name uat.company.com;
listen 41001;
listen 41002;
listen 8080;
location / {
proxy_pass http://123.123.123.1:$server_port$uri;
proxy_set_header Host $host;
}
}
однако это дает мне плохую страницу шлюза 502 с журналом: 2015/01/28 16:04:49 [crit] 30571#0: *1 connect() to 123.123.123.1:41002 failed (13: Permission denied) while connecting to upstream, client: 172.23.128.245, server: uat.company.com, request: "GET /webapp/ HTTP/1.1", upstream: "http://123.123.123.1:41002/webapp/", host: "uat.company.com:41002"
Я надеюсь, что это более понятно.
ПредложениеUpdate от Xaviers о том, что SELinux мог мешать, я отключил его и продолжаю. Использование вышеприведенной конфигурации nginx теперь похоже на подключение ко второму серверу: однако порт все еще не передан. я звоню
uat.company.com:41002/webapp/
Это будет, если вызов службы напрямую, перенаправить на
uat.company.com:41002/webapp/spring/config/main
Однако через прокси происходит то, что он возвращается или заканчивается
uat.company.com/webapp/spring/config/main
и, следовательно, не удается загрузить страницу...
2 ответа
Я установил, какие проблемы были с моей настройкой.
1) SELinux не давал мне подключиться вверх по течению. Теперь я отключил это и рассмотрим настройку позже
2) proxy_pass делал свою работу, как и ожидалось, однако аргументы мне были нужны http://123.123.123.1:$server_port/$uri$is_args$args;
3) proxy_set_header Host $host
правильно установите имя хоста обратно на то, что я хотел, однако он съел номер порта. Правильный формат для моих нужд proxy_set_header Host $host:$server_port
Для этого могут быть более точные решения, и у меня пока нет полноценного рабочего решения, так как я сократил его, чтобы оно заработало, однако рабочий раздел моей конфигурации:
server {
listen 41002;
server_name uat.comapny.com;
location /webapp {
proxy_pass http://123.123.123.1:41002/$uri$is_args$args;
proxy_set_header Host $host:$server_port;
}
}
Я опубликую более общую версию, как только уточню. Большое спасибо всем, кто помог.
Вы хотите сохранить порт, тогда вы должны поместить его в proxy_pass
,
server {
server_name bob.something.com;
listen 41001;
listen 41002;
listen 8080;
location / {
proxy_pass http://123.123.123.1:$server_port$uri;
proxy_set_header Host $host;
}
}
Вы должны понимать, что это будет запрос прокси через nginx.