Как получить реальный IP-адрес клиента на сервере пирамиды за прокси-сервером nginx

У меня есть приложение Pyramid, которое в некоторых местах использует request.environ ['REMOTE_ADDR'] .

Приложение обслуживается Python Paste на порту 6543, а сервер nginx, прослушивающий порт 80, пересылает запросы на сервер Paste.

Конфигурация nginx вдохновлена ​​кулинарной книгой Pyramid:

server {

    listen   80; ## listen for ipv4
    listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name  localhost;

    access_log  /var/log/nginx/localhost.access.log;

    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://127.0.0.1:6543;

    }

В приложении Pyramid переменная request.environ ['REMOTE_ADDR'] теперь всегда равна 127.0.0.1. Я вижу несколько стратегий решения этой проблемы, но не знаю, есть ли рекомендуемый способ решения этой проблемы.

Вот что я рассматриваю:

  • добавить подписчика NewRequest, который при необходимости заменяет request.environ ['REMOTE_ADDR']:

    если 'HTTP_X_REAL_IP' в event.request.environ: event.request.environ ['REMOTE_ADDR'] = event.request.environ ['HTTP_X_REAL_IP']

  • используйте промежуточное программное обеспечение wsgi для изменения request.environ перед попаданием в слой пирамиды.

  • что-то еще

Какую стратегию вы используете для развертывания приложений Pyramid? Что будет, если у меня будет два прокси nginx? (первый обслуживает локальную сеть, а второй - машину, напрямую подключенную к Интернету).

5
задан tshepang 13 February 2013 в 18:34
поделиться