Gunicorn nginx 反代获取真实 ip 地址
内容提要
本文讨论了如何在使用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参数来自定义日志格式,使用特定的变量记录请求信息。