Назад | Перейти на главную страницу

Перенаправлять трафик на основе URL-адреса на другой IP-адрес с сохранением информации о порте и URL-адресе

У нас есть версия QA, версия UAT и версия webapp для 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"

Надеюсь, это более понятно.


Обновить Из-за предположения Xaviers, что SELinux мог мешать, я отключил его и продолжаю. Использование конфигурации nginx, приведенной выше, похоже, теперь подключается ко второму серверу: порт, однако, все еще не проходит. я звоню

uat.company.com:41002/webapp/

При прямом вызове службы это приведет к перенаправлению на

uat.company.com:41002/webapp/spring/config/main

Однако через прокси-сервер происходит то, что он возвращается или заканчивается на

uat.company.com/webapp/spring/config/main

и, таким образом, не удалось загрузить страницу ...

Я установил, какие проблемы были с моей настройкой.

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.