微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在nginx代理后面的金字塔服务器中获取客户端的真实IP

我有一个金字塔应用程序,在某些地方使用request.environ [‘REMOTE_ADDR’].

该应用程序由端口6543上的Python Paste提供,而端口80上的Nginx服务器将请求转发到Paste服务器.

Nginx配置的灵感来自Pyramid食谱:

server {

    listen   80; ## listen for ipv4
    listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name  localhost;

    access_log  /var/log/Nginx/localhost.access.log;

    location / {

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:6543;

    }

在Pyramid应用程序中,变量request.environ [‘REMOTE_ADDR’]现在始终等于127.0.0.1.
我看到了一些解决这个问题的策略,但我不知道是否有推荐的方法解决这个问题.

这是我正在考虑的事情:

>添加一个NewRequest订户,如有必要,它将替换request.environ [‘REMOTE_ADDR’]:

如果event.request.environ中的’HTTP_X_REAL_IP’:
    event.request.environ [‘REMOTE_ADDR’] = event.request.environ [‘HTTP_X_REAL_IP’]
>在点击金字塔图层之前,使用wsgi中间件修改request.environ.
>别的

您使用哪种策略来部署Pyramid应用程序?
如果我有两个Nginx代理会怎么样? (第一个服务于LAN,第二个服务器直接连接到互联网).

最佳答案:

如果您通过use = egg:PasteDeploy #prefix在Wsgi管道中使用paste.deploy.config.PrefixMiddleware,它将自动将X-Forwarded-For转换为REMOTE_ADDR.它对于反向代理的其他属性也很好,例如它会将X-Forwarded-Proto转换为wsgi.url_scheme,以确保如果用户访问https,则生成的URL也是https.

http://pythonpaste.org/deploy/class-paste.deploy.config.PrefixMiddleware.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐