REMOTE_ADDR没有使用nginx&发送到Django龙卷风

时间:2009-10-26 23:27:40

标签: django nginx tornado

所以我得到了一个简单的设置,使用nginx进行静态媒体和负载均衡以及龙卷风作为django的webserver(运行4台服务器)。我的问题是remote_addr没有传递给django所以我得到一个KeyError:

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

由于nginx.conf,远程地址将作为X-Real-IP(HTTP_X_REAL_IP)发送:

    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 个答案:

答案 0 :(得分:15)

以下是我解决问题的方法。通过使用此中间件:

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

希望有所帮助!

答案 1 :(得分:13)

试试这个:

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即可正常使用。

试过:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

答案 2 :(得分:5)

我有类似的设置。将nginx放在apache之前后,我注意到apache日志中的IP始终为127.0.0.1。安装“libapache2-mod-rpaf”似乎解决了这个问题。我不知道你的问题是否相关。

答案 3 :(得分:5)

添加“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;
    ...
}

来源:how to nginx virtual servers + fcgi for django?

答案 4 :(得分:2)

对我来说,使用以下工作:

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(特别是localshop)。

答案 5 :(得分:1)

不,传递remote_addr是not possible。因此,我所知道的唯一解决方案是使用X-Real-IP或X-Forwarded-For,并确保后端正确处理这些。

编辑:这适用于fastcgi_pass,而非常规nginx proxy_pass