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

2019-09-01 08:35发布

所以我就用nginx的静态媒体和负载均衡和龙卷风作为Web服务器,以便Django的简单设置(4台服务器运行)。 我的问题是REMOTE_ADDR没有得到传递给Django的,所以我得到一个KeyError异常:

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

远程地址是越来越发送通过为X-实时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-实时IP如果没有远程地址键被找到,但我很好奇,如果有一个聪明的解决方案。

谢谢!

Answer 1:

试试这个:

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


Answer 2:

以下是我解决了这个问题。 通过使用这种中间件:

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

希望帮助!



Answer 3:

我有一个类似的设置。 把nginx的Apache中的前面后,我注意到,在Apache日志中的IP总是127.0.0.1。 安装 “中的libapache2-MOD-rpaf” 似乎解决它。 我不知道,如果你的问题是相关的。



Answer 4:

添加 “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的Django的虚拟服务器+ FCGI?



Answer 5:

对我来说,使用下面的工作:

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)。



Answer 6:

不,这不可能转嫁REMOTE_ADDR。 所以,我知道唯一的解决办法是使用X-实时IP或X转发,对于并确保后端正确处理这些。

编辑:这适用于fastcgi_pass,不正规的nginx proxy_pass



文章来源: REMOTE_ADDR not getting sent to Django using nginx & tornado