使用Flask
开发的项目,但部署到线上Docker
容器中后,因为使用了Nginx
做代理,所以Flask
无法获取真实IP
地址,获取到的都是192.0.0.1
,解决方法如下:
首先是Nginx
的配置,需要在转发的请求headers中设置好真实IP:
location /path {
root html;
proxy_pass http://127.0.0.1:5000/;
proxy_set_header X-Real-IP $remote_addr;
}
然后在Flask
中通过headers获取IP,为了兼容使用nginx
不使用nginx
的情况,做了一些处理:
ip = request.remote_addr
try:
_ip = request.headers["X-Real-IP"]
if _ip is not None:
ip = _ip
except Exception as e:
print(e)
通过上述代码,就可以获取到真实IP
了。
但是如果用户使用了代理,获取的IP是代理后的IP,要想再获取上层IP
location /path {
root html;
proxy_pass http://127.0.0.1:5000/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
理,通过X-Forwarded-For
获取IP的链路,ip以逗号隔开