当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《REMOTE_ADDR没有使用nginx和龙卷风发送到Django》经验,为你挑选了4个好方法。

所以我得到了一个简单的设置,使用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,但我很好奇是否有更智能的解决方案.

谢谢!



1> Nixarn..:

这就是我解决问题的方法.通过使用此中间件:

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

希望有所帮助!


唯一的问题是,如果您以静默方式删除错误,您将在以后发现错误配置的Web服务器(可能丢失信息或用户无法登录).我的建议是失败或至少记录错误.
几乎总是,你不想在CPython 2.x中使用`try/except:`无异常类型,因为它还会捕获SystemExit,KeyboardInterrupt和GeneratorExit - 这些都是你最好独自留下的各种错误,或者很少见案件,分开抓住.特别是在这种情况下,应该捕获KeyError.但是你可以进一步简化所有这些代码:`request.META.setdefault('REMOTE_ADDR',request.META.get('HTTP_X_REAL_IP','1.1.1.1'))`

2> 小智..:

试试这个:

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

龙卷风2.2.1



3> asciitaxi..:

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



4> Juande Carri..:

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

来源:如何为django nginx虚拟服务器+ fcgi?

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有