Перенаправить трафик на основе 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.

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