如何在使用 Nginx 作为反向代理的 Tomcat 访问日志 Spring 引导应用程序上记录真实客户端 IP?

How to log the real client IP on embedded Tomcat access log on Spring Boot application with Nginx as reverse proxy?

我在启用了 Tomcat 访问日志的 Spring Boot 1.3.3 应用程序前面安装了 Nginx,但是日志记录总是写入代理 IP 地址 (127.0.0.1) 而不是真实 IP 地址客户端 IP.

  1. X-Real-IPheader是用来获取真实客户端IP的吗?
  2. 这个header是被tomcat用来写入访问日志的IP地址吗?

我有这样的配置:

application.properties

server.use-forward-headers=true
server.tomcat.internal-proxies=127\.0\.0\.1
server.tomcat.accesslog.enabled=true

Nginx 配置:

location / {
    proxy_pass http://127.0.0.1:8091;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Port 443;
    proxy_set_header Host $host;
}

真正的客户端 IP 在 $proxy_add_x_forwarded_for 变量中可用,即 X-Forwarded-For header。它将有 "," 分隔的条目。第一个值是真实的客户端 IP。

要在 Tomcat 的访问日志中记录真实的客户端 IP,请将 AccessLog Valve 中的模式值修改为:

%{X-Forwarded-For}i %l %u %t "%r" %s %b