闺蜜圈的后台服务使用 gunicorn 运行,对外接口通过 nginx 进行反代。但是反代有个问题,那就是 gunicorn 获取到的服务器的 ip 地址都是 127.0.0.1。
作为一个强迫症能忍受这个?那自然不行啊。
在 nginx 配置文件中增加 proxy_set_header
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
修改 gunicorn 启动参数,修改日志格式为:
--access-logformat='%({X-Real-IP}i)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
重启 nginx 以及 gunicorn 服务,就可以记录真实 ip 地址了:
参数说明:
h is the remote address l is - (not used) u is - (not used, reserved) t is the time stamp r is the status line s is the status of the request b is length of response f is referrer a is user agent You can also customize it with the following extra variables that are not used by default: T - request time (in seconds) D - request time (in microseconds) p - the process id {Header}i - request header (custom) {Response}o - response header (custom)
参考链接:https://stackoverflow.com/questions/25737589/gunicorn-doesnt-log-real-ip-from-nginx
24 comments
我也被这个问题困扰很久了,但是一直没能解决,因为我部署的后端应用和nginx都是用docker部署的,传到后端的地址就成了docker bridge的gateway地址
nginx proxy_pass_header 的x-real-ip 在 docker 中应该也能拿到
好像debian是可以的,我群晖和unraid似乎不行,如果可以还请请教一下如何操作(不过通过CloudflareTunnel的流量确实是可以获取真实IP,似乎是用了其他标头)
你 docker 里面跑的什么程序?是要通过代码获取?还是直接写到日志里?
jellyfin之类的,后台日志可以看到客户端的IP,还有一个就是群晖的防火墙,由于前置了nginx(为了加ssl)导致访问被归到局域网了,所以防火墙就相当于失效了
防火墙得放在nginx的前面啊,后面就没啥用啦。
没用过这个东东呢,直接设置nginx的访问策略或者在前面设置防火墙也行吧
http3也可以这样获取真实IP吗?
和协议版本有关系吗?没看过 http3 改了啥
这个不清楚,只是听说http3不支持proxy_protocol协议了。
想用但不敢用。
可不可以这样呢 在Nginx配置中添加:proxy_set_header X-Real-IP $remote_addr; 然后重启Nginx和Gunicorn。这样Gunicorn就可以获取到真实的客户端IP地址了
获取到没用,默认日志格式并不会记录自定义 header
可以使用 accesslog 和 access_log_format 参数来实现自定义日志格式呀
额,我文章里就是这么写的啊~~
嗯 😂
emmmm,看不懂哩,不过好腻害滴样子 !![kiss](https://danteng.me/wp-content/plugins/kama-wp-smile/packs/qip/kiss.gif)
复制粘贴而已~~
还有个问题是,套上CDN后,也会获取不到真实的ip,需要改造这个文件。
嗯嗯 是哒 也需要单独处理
技术文。不明觉历。
这个看起来没有治本啊
治不了啊 因为转发之后地址就变成127了
以前也整过这些。
毕竟用的太多了