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

标签 spring tomcat nginx spring-boot http-headers

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

  1. X-Real-IP header 是否用于获取真实客户端 IP?
  2. tomcat 是否使用此 header 在访问日志中写入 IP 地址?

我有这样的配置:

应用程序属性

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

关于spring - 如何在使用 Nginx 作为反向代理的 Spring Boot 应用程序上记录嵌入式 Tomcat 访问日志上的真实客户端 IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356612/

相关文章:

docker 注册表和 nginx - 实体太大 - client_max_body_size 无效

java - 在 Spring Boot 中更改了 Rest Service 输入参数

java - Spring:使用 @RepositoryRestController 时,非空属性引用空值或 transient 值

tomcat urlrewritefilter baseurl

nginx - Kubernetes 中带有 nginx 入口 Controller 的 Kibana

ruby-on-rails - 太多重定向 : passenger+nginx SSLRequirement

java - ApplicationContext 和 beans 检索

java - 在 Spring Boot 中启动时从文件中读取数据以在 Controller 中使用

java - Tomcat 私有(private) JVM

tomcat - 统一的http错误页面