2014-10-10 6 views
6

Возникла проблема:Nginx proxy pass configuration docker

Хост-компьютер имеет несколько приложений для докеров, работающих на разных портах, например. App1 @ 3001, App2 @ 3002 ... 3100 и т.д.

Теперь я хотел бы получить доступ к приложениям в этом формате http://hostname.com/app1, http://hostname.com/app2 ..

Для этого я бегу Nginx на хосте для запросов прокси к правому порту на основе суб-Uri

location = /app1 { 
    proxy_redirect http://hostname:3001/; 
    include /etc/nginx/proxy_params; 
} 

location ^~ /app1 { 
    proxy_redirect http://hostname:3001/app1; 
    include /etc/nginx/proxy_params; 
} 

Но это не работает, когда изменения суб Ури сайта или если сайт перенаправляет. Например:

If I visit the site at hostname:3001 -> I can see the site 
If I visit the site at http://hostname.com/app1 -> I can see the site 
If the site page is at hostname:3001/static/index.html then when i access it as http://hostname.com/app1 the page changes to http://hostname.com/static/index.html -> I get 404. 

Есть ли способ сделать это? Или единственный способ сделать это - установить dns как app1.hostname.com и выполнить маршрутизацию на основе имени?

+0

Ваша проблема не связана с Докер или Nginx. Это более общая проблема обратного проксирования с измененным приложением: ваше приложение ожидает, что оно будет использоваться в '/', в то время как обратный прокси-сервер обслуживает его в '/ app1'. Я уверен, что вы можете легко найти описание проблемы и обходные пути. –

+0

Yup Я спросил это долгое время назад. Я исправил это, создав запись DNS для хоста, на котором запущен контейнер, и сопоставьте порт контейнера с портом хоста, а затем добавьте простую конфигурацию к карте nginx app1.abc.com для хостинга: порт в прокси-проходе. Он работал хорошо и легко масштабируется. – NitishMD

ответ

1

Вы можете сделать каждое приложение прослушивает отдельный порт (например, 3000 и 3001), а затем настроить Nginx следующим образом (включить его в блок с server {} определения):

location /app1 { 
    proxy_pass  http://localhost:3000; 
    proxy_set_header X-Real-IP $remote_addr; 
} 

location /app2 { 
    proxy_pass  http://localhost:3001; 
    proxy_set_header X-Real-IP $remote_addr; 
} 
2

Внутри вашего server {} блока, который вы хотите:

location /app1 { 
    rewrite ^/app1(.*) /$1 break; 
    proxy_pass http://hostname:3001/; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

location /app2 { 
    rewrite ^/app2(.*) /$1 break; 
    proxy_pass http://hostname:3002/; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

переписывания правило здесь будет передавать правильные URIs к портам