2016-10-04 5 views
3

У меня есть контейнер nginx, работающий как служба в Docker Swarm внутри созданной пользователем сети наложения. Оба созданы с:«Настоящий» IP-адрес клиента в Docker Swarm 1.12 при доступе к службе

docker network create --driver overlay proxy 
docker service create --name proxy --network proxy -p 80:80 nginx 

При доступе Nginx сайт через браузер, в Nginx доступа журнала удаленного адреса записывается как 10.255 ... отформатированный адрес, что я полагаю, что балансир адрес Swarm нагрузки. Вопрос заключается в том, как узнать/зарегистрировать адрес конечного клиента, обращающегося к сайту, а не адрес балансировки нагрузки.

ответ

2

Хорошо поймать !, Большинство людей, анализирующих nginx access.log и клиентский ip, являются важной его частью.

В качестве докерной версии 1.12.1 проблема существует. nginx будет записывать swarm overlay ip. Но клиент ip logs отлично как автономный контейнер. Как работа вокруг, вы можете иметь reverse proxy, указывающий на услугу роя. Я знаю, что это против High availablity и Self Healing концепции рой, но, похоже, сейчас единственная работа вокруг.

образец конфигурации: (предположим, роя служба прослушивает 8081 на локальном хосте)

server { 
    listen 80 default_server; 
    location/{ 
    proxy_set_header  Host $host; 
    proxy_set_header  X-Real-IP $remote_addr; 
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header  X-Forwarded-Proto $scheme; 
    proxy_pass   http://localhost:8181; 
    proxy_read_timeout 90; 
    } 
} 

Более подробную информацию можно найти на this github issue.

Другой вариант:

Вы можете использовать сети в режиме хоста.

docker service create \ 
--name nginx \ 
--network <your overlay network> \ 
--publish mode=host,target=80,published=80 \ 
--publish mode=host,target=443,published=443 \ 
--replicas 1 \ 
nginx 
+0

Я хотел отметить, что использование этого в производственной среде представляет собой риск безопасности, особенно если ваше приложение использует эти значения для проверки клиента. Заголовки X-Real-IP и X-Forwarded могут быть легко подделаны, и на них нельзя положиться. – tkeeler

+0

@tkeeler с haproxy вы можете отключить переменные в HTTP-запросе и заданное реальное значение в ответе – c4f4t0r

+0

@ c4f4t0r - Только если вы ограничите все HTTP-запросы haproxy. В противном случае кто-то может сделать запрос непосредственно на сервер в обход вашего haproxy rewrite. – tkeeler

1

Так как я работал вокруг этого сейчас является использование опции mode=host для публикации порта и прижав прокси-контейнер для одного узла следующим образом:

docker service create \ 
--name proxy \ 
--network proxy \ 
--publish mode=host,target=80,published=80 \ 
--publish mode=host,target=443,published=443 \ 
--constraint 'node.hostname == myproxynode' \ 
--replicas 1 \ 
letsnginx 
+0

Параметр 'mode = host' был добавлен в Docker 1.13, и теперь я тоже это делаю. – eskp

+0

В любом случае 'mode = host' не является хорошим выбором для LB и HA ... –