Я использую прокси реверса lighttpd для обслуживания django с gunicorn. Теперь эта конфигурация работала:
proxy.server = ("" => ( "" => (
"host" => "127.0.0.1",
"port" => 8000,
)))
Теперь я переместил gunicorn в контейнер и использование:
proxy.server = ("" => ( "" => (
"host" => "192.168.1.2",
"port" => 8000,
)))
Теперь каждый запрос имеет IP 192.168.1.1
как замечено gunicorn. Я понял бы, если обратный прокси запутывает реальный IP, но почему он работал с localhost затем?
для обоих я добираюсь
X-Forwarded-For: client-ip
X-Host: the.domain
X-Forwarded-Proto: http
где клиентский IP является общедоступным IP пространством.
запросы прибывают из
хост:
nc: connect to 127.0.0.1 8000 from localhost (127.0.0.1) 44953 [44953]
контейнер:
nc: connect to 192.168.1.2 8000 from host (192.168.1.1) 60027 [60027]
сам контейнер имеет IP 192.168.1.2
, мост хоста имеет 192.168.1.1
и маршруты в контейнере:
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
хост имеет:
192.168.1.0/24 dev bridge proto kernel scope link src 192.168.1.1
Править: X-Forwarded-For был тем же для обоих запросов. (Протестированный с nc -vlp 8000
).
Моя ставка? lighttpd добавляет заголовок X-Forwarded-For
, а в Django есть что-то жестко запрограммированное, чтобы знать, что 127.0.0.1
вряд ли будет настоящим удаленным IP-адресом, если этот заголовок присутствует.
Вы должны убедиться, что присутствует заголовок X-Forwarded-For
, а затем заставить Django использовать его в качестве удаленного адреса (похоже, способ сделать это здесь ).