地址:/
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_ipreturn ''
参考资料:
使用 Linux deploy 搭建属于自己的Nginx+PHP-Web服务器,FRP内网穿透,可获取用户真实IP /skyxc233/article/details/105666136
FRP内网穿透 + Nginx代理 + 获取真实IP /qq_36624899/article/details/113247823
FRP内网穿透 + Nginx代理 + 获取真实IP
/?p=1132
nginx反向代理后应用程序如何获取客户端真实IP?
/it_0101/article/details/78390700