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

Nix*_*arn 10 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;
    }
Run Code Online (Sandbox Code Playgroud)

由于HTTP预先附加到META密钥,因此我不能只执行proxy_set_header remote_addr $ remote_addr.如果没有找到远程地址键,我能做的就是读取X-Real-IP,但我很好奇是否有更智能的解决方案.

谢谢!

Nix*_*arn 16

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

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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 唯一的问题是,如果您以静默方式删除错误,您将在以后发现错误配置的Web服务器(可能丢失信息或用户无法登录).我的建议是失败或至少记录错误. (2认同)
  • 几乎总是,你不想在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认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

只需添加proxy_set_header REMOTE_ADDR,它应该工作得很好.

试过:

  • Django 1.5.4
  • Nginx 1.4.3
  • 龙卷风2.2.1


asc*_*axi 5

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


Jua*_*ion 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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