Gunicorn nginx 反代获取真实 ip 地址

闺蜜圈的后台服务使用 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

☆版权☆

* 网站名称:obaby@mars
* 网址:https://obaby.org.cn/
* 个性:https://oba.by/
* 本文标题: 《Gunicorn nginx 反代获取真实 ip 地址》
* 本文链接:https://obaby.org.cn/2024/07/17578
* 短链接:https://oba.by/?p=17578
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

24 comments

  1. Level 1
    Microsoft Edge 126 Microsoft Edge 126 Windows 11 Windows 11 cn中国–辽宁–沈阳–于洪区 电信

    我也被这个问题困扰很久了,但是一直没能解决,因为我部署的后端应用和nginx都是用docker部署的,传到后端的地址就成了docker bridge的gateway地址

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      nginx proxy_pass_header 的x-real-ip 在 docker 中应该也能拿到

      1. Level 1
        Microsoft Edge 126 Microsoft Edge 126 Windows 11 Windows 11 cn中国–辽宁–沈阳–于洪区 电信

        好像debian是可以的,我群晖和unraid似乎不行,如果可以还请请教一下如何操作(不过通过CloudflareTunnel的流量确实是可以获取真实IP,似乎是用了其他标头)

        1. 公主 Queen 
          Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

          你 docker 里面跑的什么程序?是要通过代码获取?还是直接写到日志里?

          1. Level 1
            Microsoft Edge 126 Microsoft Edge 126 Windows 11 Windows 11 cn中国–辽宁–沈阳–于洪区 电信

            jellyfin之类的,后台日志可以看到客户端的IP,还有一个就是群晖的防火墙,由于前置了nginx(为了加ssl)导致访问被归到局域网了,所以防火墙就相当于失效了

            1. 公主 Queen 
              Google Chrome 120 Google Chrome 120 Windows 10 Windows 10 cn中国–山东–临沂 联通

              防火墙得放在nginx的前面啊,后面就没啥用啦。
              没用过这个东东呢,直接设置nginx的访问策略或者在前面设置防火墙也行吧

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      和协议版本有关系吗?没看过 http3 改了啥

  2.  Level 4
    Safari 17 Safari 17 Mac OS X 10.15 Mac OS X 10.15 cn中国–贵州–贵阳 移动

    可不可以这样呢 在Nginx配置中添加:proxy_set_header X-Real-IP $remote_addr; 然后重启Nginx和Gunicorn。这样Gunicorn就可以获取到真实的客户端IP地址了

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      获取到没用,默认日志格式并不会记录自定义 header

      1.  Level 4
        Mozilla Compatible Mozilla Compatible iPhone iOS 17.5.1 iPhone iOS 17.5.1 cn中国–贵州–贵阳 移动

        可以使用 accesslog 和 access_log_format 参数来实现自定义日志格式呀

  3. Level 3
    Firefox 127 Firefox 127 Windows 10 Windows 10 cn中国–甘肃–定西 电信

    还有个问题是,套上CDN后,也会获取不到真实的ip,需要改造这个文件。

    1. 公主 Queen 
      Google Chrome 126 Google Chrome 126 Android 10 Android 10 cn中国–内蒙古–乌兰察布 移动

      治不了啊 因为转发之后地址就变成127了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注