当前位置: 首页 > 知识库问答 >
问题:

Apache代理后嵌入Tomcat的spring boot

储俊英
2023-03-14

我们有一个spring boot(spring MVC)应用程序,在Apache SSL代理背后的专用appserver上嵌入了Tomcat。

代理服务器上的SSL端口为4433,转发到AppServer上的端口8080。

因此转发到代理服务器的URL如下所示:

https://proxyserver:4433/appname   >>forward>>   http://appserver:8080/

在没有代理的情况下运行时,发生的第一件事是
spring安全重定向请求,如:

http://appserver:8080/   >>redirect>>   http://appserver:8080/login

若要显示登录表单,请使用扩展WebSecurityConfigurerAdapter

  ...
  httpSecurity.formLogin().loginPage("/login") ...
  ...

它在没有代理的情况下工作很好,但是有了代理,重定向需要更改,
所以spring应该改为重定向到相应的代理URL,比如:

http://appserver:8080/   >>redirect>>   https://proxyserver:4433/appname/login

但还没有成功。

我正在尝试应用以下解决方案:59.8在前端代理服务器后使用Tomcat

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

X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https

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

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”部分。在appserver上,应用程序的根是“/”。当通过代理时,应该如何指示spring将“/appname”包含在所有发送回客户端的URL中?

共有2个答案

姚洲
2023-03-14

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

server.tomcat.internal-proxies=172\\.17\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}

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

您可以在RemoteIPValve中看到正在发生的事情,如果您设置

logging.level.org.apache.catalina.valves.RemoteIpValve=DEBUG

或者在其中设置断点。

长孙宜
2023-03-14

前几天我也遇到了同样的问题。在对spring boot 1.3进行了一些调试后,我找到了以下解决方案

1.必须在Apache代理上设置头:

<VirtualHost *:443>
    ServerName www.myapp.org
    ProxyPass / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPreserveHost On
    ... (SSL directives omitted for readability)
</VirtualHost>

2.你得告诉你的spring boot app使用这些头。所以在您的application.properties(或任何其他spring·布茨理解属性的地方)中放入以下一行:

server.use-forward-headers=true

如果正确执行了这两项操作,应用程序发送的每个重定向将不会转到http://127.0.0.1:8080/[path],而是自动转到https://www.myapp.com/[path]

更新%1。关于这个主题的文档在这里。您应该阅读它,至少了解server.tomcat.internal-proxies属性,该属性定义了可信任的代理服务器的IP地址范围。

 类似资料:
  • 我正在寻找一个能够在Apache SSL代理后面运行Spring应用程序的解决方案。我尝试了很多配置都没有成功。所有的Spring响应都转到http,导致一个Not Found错误。 以下是apache配置: 以下是Spring选项: 我正在使用Spring启动2.5.6在阿帕奇雄猫/ 9.0.54。操作系统 Apache 是一个 2.4.25 版本,运行在 Debian 9.13 上。 问题似乎

  • 我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?

  • 我试图在独立servlet容器(关键tc服务器)上部署spring-boot应用程序,但遇到了spring-boot管理页面的问题。当我使用命令运行应用程序时,我有正确的boot spring-boot admin UI页面,但是当我在tcServer上部署war时,在根路径上,我看到spring-boot admin页面中没有任何应用程序:我如何启用admin页面: jvm 1[2017.08.

  • 这是个无用的主意吗?

  • 我一直四处寻找,但无法为以下情况找到明确的解决方案: 我们有一个web应用程序(Grails+Spring Security),它在Apache后面的tomcat中运行。应用程序的一部分需要在https上运行,因此使用Spring Security Channel Security,只要您导航到应用程序的一部分是安全的,Spring就会将您重定向到https,状态代码为302。 现在问题出现在将a

  • 我在谷歌上冲浪,没有找到任何具体的答案或例子,所以再次尝试我的运气在这里(经常是幸运的)。 问题所在 > 我在apache反向代理后面运行了一个spring boot RESTful服务。此RESTful服务只运行HTTP。假设它运行在本地IP172.S端口8080上。 我还配置了一个apache反向代理。假设它运行在本地IP172.a和公共IP55.a上。该代理响应两个端口80,但所有HTTP通