local IP address
Fedor Dikarev
fe на hamilton.rinet.ru
Чт Фев 28 20:11:32 UTC 2019
В общем я подумал еще раз, и понял что или не понимаю исходную задачу,
или не понимаю пути ее решения.
Но вдруг это поможет:
у нас тоже есть задача, что разные сервисы должны слушаться на разных
адресах: один адрес для public-сервисов, второй для ограниченного круга
лиц, третий для другого круга и т.д.
Решаем это так: в конфиге nginx-а для каждого сервера пишем listen ip:80
для каждого уровня доступа свой ip адрес, дальше server_name нужный для
сервиса. А сервисы уже в docker-е, и в nginx-е просто proxy_pass на
expose-нутый порт. И все работает. (понятно что эти конфиги пишем не
руками, но как идея. хотя могу и программой поделиться, если задача
такая же)
28.02.19 23:00, Fedor Dikarev пишет:
> А это точно тестируемый конфиг приведен? Может там еще что-то есть?
>
> Тут получается что nginx проксирует сам на себя, и я даже не поленился
> это попробовать и получил ожидаемое:
>> # cat localhost.conf server {
>> listen 80;
>>
>> access_log /var/log/nginx/local-access.log;
>> location / { return 200 "$server_addr\n"; }
>> location /one {
>> proxy_set_header X-Server-IP $server_addr;
>> proxy_pass $scheme://$server_addr;
>> }
>> }
>
>> # grep -c /one /var/log/nginx/local-access.log ; curl
>> http://192.168.255.5/one ; grep -c /one /var/log/nginx/local-access.log
>> 909
>> <html>
>> <head><title>502 Bad Gateway</title></head>
>> <body>
>> <center><h1>502 Bad Gateway</h1></center>
>> <hr><center>nginx/1.15.8</center>
>> </body>
>> </html>
>> 1813
>
>> grep -c /one /var/log/nginx/local-access.log ; curl
>> http://192.168.255.5/one ; grep -c /one /var/log/nginx/local-access.log
>> 1813
>> <html>
>> <head><title>502 Bad Gateway</title></head>
>> <body>
>> <center><h1>502 Bad Gateway</h1></center>
>> <hr><center>nginx/1.15.8</center>
>> </body>
>> </html>
>> 2820
>
>
> 28.02.19 21:35, Igor Savenko пишет:
>> Хм. Интересно получается.
>> Интерфейсы на хосте (поскольку это, видимо, KVM guest, то все они,
>> наверное, выставлены в один бридж, но это не имеет отношения к делу):
>> [root на blissstagingserver1 imunify360-webshield]# ip -o -4 ad | grep eth
>> 2: eth0 inet 10.0.0.143/26 <http://10.0.0.143/26> brd 10.0.0.191
>> scope global eth0\ valid_lft forever preferred_lft forever
>> 3: eth1 inet 10.0.0.146/26 <http://10.0.0.146/26> brd 10.0.0.191
>> scope global eth1\ valid_lft forever preferred_lft forever
>> 4: eth2 inet 10.0.0.147/26 <http://10.0.0.147/26> brd 10.0.0.191
>> scope global eth2\ valid_lft forever preferred_lft forever
>>
>> server {
>> listen *:80;
>> location / {
>> proxy_set_header X-Server-IP $server_addr;
>> proxy_pass $scheme://$server_addr;
>> }
>> }
>>
>> Бекэндом выступает питоновский http.server, который просто выводит в
>> консоль заголовки Host и X-Server-IP
>>
>> $ curl -L -v http://10.0.0.146
>> * Rebuilt URL to: http://10.0.0.146/
>> * Trying 10.0.0.146...
>> * TCP_NODELAY set
>> * Connected to 10.0.0.146 (10.0.0.146) port 80 (#0)
>> > GET / HTTP/1.1
>> > Host: 10.0.0.146
>> > User-Agent: curl/7.52.1
>> > Accept: */*
>> >
>> < HTTP/1.1 200 OK
>>
>> На это питоновский сервер пишет
>> Host: 10.0.0.146, IP: 10.0.0.143
>>
>> То есть $server_addr -- 10.0.0.143, a не 146, как ожидалось...
>>
>> То есть в $server_add
>>
>> чт, 28 февр. 2019 г. в 18:37, Fedor Dikarev <fe на hamilton.rinet.ru
>> <mailto:fe на hamilton.rinet.ru>>:
>>
>>
>> 28.02.2019 19:20, Igor Savenko пишет:
>> > Доброе время суток!
>> > Подскажите, есть ли вообще способ определить, на какой именно
>> адрес был
>> > послан запрос (хост имеет несколько интерфейсов с разными
>> адресами или
>> > несколько secondary адресов на одном интерфейсе), чтобы
>> спроксировать
>> > этот запрос на корректный адрес upstream. который тоже слушает на
>> localhost.
>> > Схема проста:
>> > server {
>> > listen *:80;
>> > server_name _;
>> > location / {
>> > proxy_pass http://$server_addr;
>> > }
>> > }
>> >
>> > При этом у хоста 2 адреса на интерфейсах, скажем, 1.2.3.4 и
>> 5.6.7.8.
>> > Хотелось бы, чтобы при запросе на 5.6.7.8 в $server_addrбыл не
>> 1.2.3.4
>> > (как первый и дефолтный адрес, а 5.6.7.8). Если можно это решить
>> > программно (в каком-нибудь модуле, то подскажите, пожалуйста.
>> Спасибо!
>>
>> Про правильный server_addr не понял, а сейчас что не так?
>> > # ifconfig lo0
>> > lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
>> > options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
>> > inet6 ::1 prefixlen 128
>> > inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
>> > inet 127.0.0.1 netmask 0xff000000
>> > inet 192.168.255.1 netmask 0xffffffff
>> > inet 192.168.255.2 netmask 0xffffffff
>> > inet 192.168.255.3 netmask 0xffffffff
>> > inet 192.168.255.4 netmask 0xffffffff
>> > inet 192.168.255.5 netmask 0xffffffff
>> > nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
>> > groups: lo
>>
>> > # cat localhost.conf
>> > server {
>> > listen 80;
>> >
>> > location / { return 200 "$server_addr\n"; }
>> > }
>>
>> > # for h in 2 3 4; do curl 192.168.255.$h; done
>> > 192.168.255.2
>> > 192.168.255.3
>> > 192.168.255.4
>>
>>
>> >
>> > _______________________________________________
>> > nginx-ru mailing list
>> > nginx-ru на nginx.org <mailto:nginx-ru на nginx.org>
>> > http://mailman.nginx.org/mailman/listinfo/nginx-ru
>> >
>> _______________________________________________
>> nginx-ru mailing list
>> nginx-ru на nginx.org <mailto:nginx-ru на nginx.org>
>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>>
>>
>> _______________________________________________
>> nginx-ru mailing list
>> nginx-ru на nginx.org
>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>>
>
--
Fedor Dikarev
Подробная информация о списке рассылки nginx-ru