Apache代理后面如何嵌入Tomcat的Spring引导?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (293)

我们有一个带有嵌入式Tomcat的spring-boot / spring-mvc应用程序,位于Apache SSL代理之后的专用应用程序服务器上。

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

所以代理服务器的URL转发如下所示:

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

在没有代理的情况下运行时,首先发生的事情是

spring-security重定向请求,如:

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

以显示登录表单,通过扩展WebSecurityConfigurerAdapter

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

它在没有代理的情况下工作正常,但WITH代理重定向需要更改,所以Spring应该重定向到相应的代理URL,如:

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

但还没有成功。

我正在尝试应用此解决方案:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-use-tomcat-behind-a-proxy-server(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”部分。在应用程序服务器上,应用程序根植于“/”。在通过代理时,应该如何指示spring将“/ appname”包含在发送回客户端的所有URL中?

提问于
用户回答回答于

在对SpringBoot 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.必须告诉SpringBoot应用程序使用这些标题。因此,在应用程序中放置下面一行。属性(或SpringBoot理解属性的任何其他地方):

server.use-forward-headers=true

如果你正确地做了这两件事,你的应用程序发送的每个重定向都不会转到http://127.0.0.1:8080/[path],而是自动转到https://www.myapp.com/[path]

用户回答回答于

你的代理看起来很好,后端应用也一样,但似乎没有看到RemoteIpValve修改后的请求。它的默认行为RemoteIpValve包括代理IP地址的模式匹配(作为安全检查),它仅修改它认为来自有效代理的请求。该模式的默认值在春季引导到一个众所周知的一套类似的内部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

或者在里面设置一个断点。

扫码关注云+社区

领取腾讯云代金券