首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Apache代理后面嵌入Tomcat的Spring Boot

在Apache代理后面嵌入Tomcat的Spring Boot
EN

Stack Overflow用户
提问于 2014-08-23 05:45:01
回答 7查看 54K关注 0票数 36

我们有一个Spring Boot (Spring MVC)应用程序,在Apache SSL代理后面的专用应用程序服务器上嵌入了Tomcat。

代理服务器上的SSL端口是4433,转发到应用程序服务器上的端口8080。

因此,指向代理服务器的URL转发方式如下:

代码语言:javascript
复制
https://proxyserver:4433/appname   >>forward>>   http://appserver:8080/

在没有代理的情况下运行时,发生的第一件事是

Spring Security重定向请求,如下所示:

代码语言:javascript
复制
http://appserver:8080/   >>redirect>>   http://appserver:8080/login

要显示登录表单,请将WebSecurityConfigurerAdapter扩展为

代码语言:javascript
复制
  ...
  httpSecurity.formLogin().loginPage("/login") ...
  ...

它在没有代理的情况下工作得很好,但是有了代理,重定向需要改变,

因此Spring应该重定向到相应的代理URL,如下所示:

代码语言:javascript
复制
http://appserver:8080/   >>redirect>>   https://proxyserver:4433/appname/login

但目前还没有成功。

我正在尝试应用这个解决方案:59.8 Use Tomcat behind a front-end proxy server

我们已经在Apache中配置了,并验证它是否发送了预期的报头:

代码语言:javascript
复制
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https

使用以下参数启动应用程序:

代码语言:javascript
复制
export ARG1='-Dserver.tomcat.protocol-header=x-forwarded-proto' 
export ARG2='-Dserver.tomcat.remote-ip-header=x-forwarded-for'
java $ARG1 $ARG2 -jar webapp.jar

但是,重定向仍然不起作用。

它将一直在本地重定向到客户端不可用的http://appserver:8080/login

为了让这个场景工作,我们还需要做什么吗?

更新

此外,我还关心代理URL中的"/appname“部分。在应用程序服务器上,应用程序的根目录为"/“。在通过代理时,应该如何指示Spring将"/appname“包含在发送回客户端的所有URL中?

EN

回答 7

Stack Overflow用户

发布于 2015-05-14 18:06:40

在某种程度上,您的代理看起来很好,后端应用也是如此,但它似乎没有看到RemoteIpValve修改的请求。RemoteIpValve的默认行为包括代理IP地址的模式匹配(作为安全检查),并且它只修改它认为来自有效代理的请求。Spring Boot中的模式缺省为一组众所周知的内部IP地址,如10.*.*.*192.168.*.*,因此如果您的代理不在其中一个上,您需要显式地配置它,例如

代码语言:javascript
复制
server.tomcat.internal-proxies=172\\.17\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}

(使用属性文件格式,这意味着您必须对反斜杠进行双重转义)。

如果您设置了以下内容,则可以查看RemoteIpValve中正在发生的情况

代码语言:javascript
复制
logging.level.org.apache.catalina.valves.RemoteIpValve=DEBUG

或者在其中设置断点。

票数 5
EN

Stack Overflow用户

发布于 2014-08-24 17:26:39

这个问题的典型解决方案是让代理处理任何需要的重写。例如,在Apache中,您可以使用rewrite_module和/或headers_module来更正头。再举一个例子,Nginx在配置上游服务器后,会自动为您处理这种情况和其他类似的情况。

回应评论:

remote_ip_header和protocol_header spring boot的配置值是什么?

让我们暂时忘记Spring Boot。嵌入式servlet容器Tomcat提供了一个称为RemoteIpValve的阀门。这个阀门是Apache remotip_module的一个端口。这个阀门的主要目的是为了“授权和日志记录的目的”而将“发起请求的用户代理程序视为发起用户代理程序”。为了使用这个阀门,需要对其进行配置。

请查找有关此阀门here的更多信息。

Spring Boot通过server.tomcat.remote_ip_header和server.tomcat.protocol_header属性方便地支持通过application.properties配置该阀。

票数 2
EN

Stack Overflow用户

发布于 2020-03-06 16:16:33

您可以配置几个与此相关的属性。application.yaml示例:

代码语言:javascript
复制
server:
  forward-headers-strategy: native
  tomcat:
    use-relative-redirects: true
    protocol-header: x-forwarded-proto
    remote-ip-header: x-forwarded-for

设置server.forward-headers-strategy: native将替换已弃用的server.use-forward-headers:true

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25455969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档