REMOTE_ADDR не отправляется в Django с использованием nginx & tornado - PullRequest
10 голосов
/ 27 октября 2009

Итак, я получил простую настройку с nginx для статического носителя и балансировки нагрузки и торнадо в качестве веб-сервера для django (работает 4 сервера). Моя проблема заключается в том, что remote_addr не передается в django, поэтому я получаю KeyError:

article.ip = request.META['REMOTE_ADDR']

Удаленный адрес отправляется через X-Real-IP (HTTP_X_REAL_IP) благодаря nginx.conf:

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect false;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://frontends;
    }

Поскольку HTTP добавляется к ключу META, я не могу просто сделать proxy_set_header remote_addr $ remote_addr. Что я мог сделать, так это прочитать X-Real-IP, если не найден ключ удаленного адреса, но мне любопытно, есть ли более разумное решение.

Спасибо!

Ответы [ 6 ]

15 голосов
/ 11 марта 2010

Вот как я решил проблему. Используя это промежуточное ПО:

class SetRemoteAddrMiddleware(object):
    def process_request(self, request):
        if not request.META.has_key('REMOTE_ADDR'):
            try:
                request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP']
            except:
                request.META['REMOTE_ADDR'] = '1.1.1.1' # This will place a valid IP in REMOTE_ADDR but this shouldn't happen

Надеюсь, это поможет!

13 голосов
/ 25 ноября 2013

Попробуйте это:

location / {
    proxy_pass http://frontends;
    proxy_pass_header Server;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header REMOTE_ADDR $remote_addr;
}

Просто добавьте proxy_set_header REMOTE_ADDR и все должно работать хорошо.

Пробовал с:

  • Джанго 1.5.4
  • Nginx 1.4.3
  • Торнадо 2.2.1
5 голосов
/ 23 февраля 2011

Добавить "fastcgi_param REMOTE_ADDR $ remote_addr;" в файл nginx.conf:

    location / {
    # host and port to fastcgi server
    fastcgi_pass 127.0.0.1:8801;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;
    ...
    # Add this line!
    fastcgi_param REMOTE_ADDR $remote_addr;
    ...
}

Источник: как использовать виртуальные серверы nginx + fcgi для django?

5 голосов
/ 30 октября 2009

У меня похожая настройка. После размещения nginx перед apache я заметил, что IP в логах apache всегда был 127.0.0.1. Установка "libapache2-mod-rpaf", похоже, исправила это. Понятия не имею, связана ли ваша проблема.

2 голосов
/ 11 мая 2012

Для меня, используя следующие работали:

server {
    listen 80;
    server_name foo.bar.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Это работает с django 1.4 (в частности, localalshop).

1 голос
/ 03 ноября 2009

Нет, невозможно передать на remote_addr. Поэтому единственное известное мне решение - это использовать X-Real-IP или X-Forwarded-For и убедиться, что бэкэнд обрабатывает их правильно.

Редактировать: это относится к fastcgi_pass, а не к обычному nginx proxy_pass

...