背景
今天在做api获取ip的事情,发现无论部署在线上,request.remote_addr拿到的总是127.0.0.1,这个是为什么呢,通过观察发现,服务器上面是通过nginx来做反向代理的,所以一直都是127.0.0.1。
所以要解决这个问题,可以进行nginx的配置,让nginx获取真实的ip,并且写入headers头部。
实现
1.nginx的配置
1).打开该站点的conf配置文件
2).在location /{}中加入以下配置:
proxy_set_header Host $host:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3).重启nginx
nginx -t
service nginx reload
4).修改flask中的代码
from flask_restful import request # 我这里用的是flask_restful,所以从这边导入,如果是flask,那就变成 from flask import request
headers = request.headers
ip = headers['X-Real-Ip'] if 'X-Real-Ip' in headers else request.remote_addr
5).重启程序
supervisorctl reload ***
结语
正好遇到这个问题,所以写个日志记录下来。