Gunicorn nginx 反代获取真实 ip 地址

💡 原文中文,约1800字,阅读约需5分钟。
📝

内容提要

本文讨论了如何在使用Gunicorn和Nginx的后台服务中获取真实的IP地址。由于Gunicorn默认获取的IP地址为127.0.0.1,需要在Nginx配置中添加相关头信息,并修改Gunicorn的启动参数以记录真实IP。重启服务后即可生效。

🔎

延伸解读

为什么 Gunicorn 只能看到 127.0.0.1

当 Nginx 作为反向代理时,它接收客户端请求后再转发给 Gunicorn。此时 Gunicorn 的 TCP 连接来源是 Nginx 本机,因此默认记录的远程地址就是 127.0.0.1。要获取真实客户端 IP,必须让 Nginx 在转发请求时通过 HTTP 头传递原始地址,Gunicorn 再从这些头中读取。

Nginx 需要设置哪些头

文章给出的配置包括 Host、X-Real-IP 和 X-Forwarded-For。其中 X-Real-IP 直接传递客户端地址,X-Forwarded-For 则记录代理链。Gunicorn 的日志格式中使用了 %({X-Real-IP}i)s,因此必须确保 Nginx 设置了该头,否则日志中仍无法显示真实 IP。

Gunicorn 日志格式的调整要点

默认的 Gunicorn 访问日志格式使用 %(h)s 记录远程地址,在反代场景下会输出 127.0.0.1。文章通过 --access-logformat 参数将 %(h)s 替换为 %({X-Real-IP}i)s,从而读取请求头中的真实 IP。修改后需重启 Gunicorn 服务使配置生效。

可选的日志变量与注意事项

除了基本格式,Gunicorn 还支持 T(请求耗时秒)、D(微秒)、p(进程 ID)以及自定义请求/响应头等变量。但需注意,X-Real-IP 头可被客户端伪造,若服务直接暴露或未严格信任代理,仅依赖该头记录 IP 可能存在安全风险。

❓

Q&A

如何在Gunicorn和Nginx中获取真实的IP地址?

需要在Nginx配置文件中添加proxy_set_header,并修改Gunicorn的启动参数以记录真实IP,最后重启服务。

Gunicorn默认获取的IP地址是什么?

Gunicorn默认获取的IP地址为127.0.0.1。

在Nginx中如何配置以获取真实IP?

在Nginx配置文件中添加以下行: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的启动参数有什么作用?

修改Gunicorn的启动参数可以设置日志格式,以记录真实的IP地址。

重启服务后会发生什么?

重启Nginx和Gunicorn服务后,配置的更改将生效,可以开始记录真实的IP地址。

Gunicorn的日志格式如何自定义?

可以通过设置--access-logformat参数来自定义日志格式,使用特定的变量记录请求信息。

🏷️

标签

➡️

继续阅读