Nginx反向代理下,Flask获取用户真实ip

网站有时候需要获取用户的ip,以防爬虫或者其他用途,Flask获取用户ip的方法是:

from flask import request ip = request.remote_addr

这种方法在调试的时候可以用,但是通过Nginx反向代理之后,这种方法获取的ip就会全部为127.0.0.1,因此实际中,这种方法不可用。

在前几篇笔记中(centos下通过gunicorn+nginx+supervisor部署Flask项目),介绍了Flask+Nginx+gunicorn+supervisor部署网站的过程。

最近网站实现新功能,需要用到用户的真实ip,一开始就是用最上面的方法获取,发现获取的ip全是127.0.0.1,然后才想起经过了Nginx的反向代理,获取的ip都是本地ip。

在网上搜了好久“Flask获取nginx反向代理ip”都没有找到满意的结果,最后搜索“proxy_set_header”才知道原来,nginx会向后端发送一个headers,里面就有所需要的真实ip。

因为 nginx 配置文件设置了

proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

因此通过

from flask import request ip=request.headers[X-Forwarded-For]

就可以获取真实 ip