1、背景
最近听室友说,他网站有监控访客的ip,并通过钉钉通知的服务。于是我在想,我为什么不给漫画网站加这个服务呢,说整就整,首先得获取到真实ip。
2、问题
网站是部署在内网服务器上的,通过frp内网穿透到外网。因此无论是nginx还是django的访问日志里都是127.0.0.1的内网ip,因此首先得解决这个问题。
3、步骤
1、安装realip
参考nginx
frpc.ini
配置proxy_protocol_version = v2
后,nginx始终报400 的错误,未解决,因此换一种方式获取真实ip
2、nginx配置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
3、django代码
这个时候真实ip在HTTP_X_FORWARDED_FOR
里,参考[2]中的代码,修改成如下:
def get_ip_address(request):
ip = request.META.get('HTTP_X_REAL_IP', '')
if not ip and ip != '127.0.0.1':
ip = request.META.get('HTTP_X_FORWARDED_FOR', '')
if not ip:
ip = request.META.get('REMOTE_ADDR', '')
for i in ip.split(','):
client_ip = i.strip()
if client_ip != '127.0.0.1':
return client_ip
return ''
参考资料:
-
使用 Linux deploy 搭建属于自己的Nginx+PHP-Web服务器,FRP内网穿透,可获取用户真实IP https://blog.csdn.net/skyxc233/article/details/105666136
-
FRP内网穿透 + Nginx代理 + 获取真实IP https://blog.csdn.net/qq_36624899/article/details/113247823
-
FRP内网穿透 + Nginx代理 + 获取真实IP
https://blog.poryoung.cn/?p=1132 -
nginx反向代理后应用程序如何获取客户端真实IP?
https://blog.csdn.net/it_0101/article/details/78390700