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://nai.dog/
* 个性:https://oba.by/
* 本文标题: 《Gunicorn nginx 反代获取真实 ip 地址》
* 本文链接:https://www.nai.dog/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,需要改造这个文件。

发表回复

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