如何将Tomcat 9 Connector侦听127.0.0.1反向代理转为Win。具有私有ServerName {Apache}的Apache 2.4

时间:2018-04-24 14:10:09

标签: spring apache tomcat ssl proxy

我希望Tomcat 8080只能侦听127.0.0.1,并且反向代理到使用私有网络ServerName的Windows Apache 2.4

我不希望tomcat端口8080可以在Tomcat运行的机器之外访问。

部署的Tomcat Web应用程序是一个带有弹簧安全登录页面的Spring MVC Web应用程序

我尝试了这些链接,问题和apache文档的简单设置:

How to set a IP address to the tomcat?

https://cgsrv1.arrc.csiro.au/blog/2009/07/10/tomcat-listen-only-on-localhost/

https://julienprog.wordpress.com/2017/06/21/how-to-bind-apache-server-non-localhost-to-tomcat-server/

https://wiki.jasig.org/display/UPM43/Fronting+Tomcat+with+Apache+HTTP+Server

发生了什么 - 似乎反向代理或tomcat连接器正在重定向客户端 浏览器到HTTP localhost / acme - 而不是向前端代理apache服务器提供来自HTTP localhost的数据:8080 / acme

客户端浏览器应该在URL上获取/显示数据:https my.server.domain / acme

我希望这个流程是:

用户客户端 - > https apache - > http tomcat http - > https apache - >用户客户端

apache和tomcat与jdk8

在同一台Windows 7服务器上运行

我在任何日志中都没有看到任何有用的信息或错误

我认为tomcat只能在127.0.0.1上正确监听 - 但是当apache反向代理发生时, 它从tomcat获取数据 - 然后由于某种原因,它正在制作客户端的浏览器(单独的网络机器) 被引导到:

HTTP localhost / acme而不是让客户端浏览器URL保持打开状态:https my.server.domain / acme

请注意,它没有让客户端浏览器尝试转到8080以便

客户端绝对不会在URL HTTP localhost / acme上托管他们自己的webapp,因此客户端浏览器会显示: HTTP错误404.找不到请求的资源。

我不认为spring MVC安全登录页面会成为culperit

我的apache httpd.conf有这一行:ServerName my.server.domain:80

我认为我无法更改该值,因为我的SSL证书通用名称和SAN基于该专用网络名称,所以我需要它保持 使SSL连接有效。

我在下面使用Rewrite要求SSL,但我不认为这会是问题

我可以通过这样做来获得代理/反向代理和https工作,而无需我完全阻止8080的目标:

apache httpd.conf:

ProxyPass         /acme  http://my.server.domain:8080/acme
ProxyPassReverse  /acme  http://my.server.domain:8080/acme

tomcat server.xml :(注意:不要只监听127.0.0.1)

<Connector     
   port="8080" 
   protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" 
   proxyPort="80" />

<Connector  
    port="8009" 
    protocol="AJP/1.3" 
    redirectPort="8443" />  

以下是我的配置文件导致不受欢迎的浏览器重定向:

apache httpd.conf

Listen 80

ServerName my.server.domain:80

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass         /acme  http://localhost:8080/acme
ProxyPassReverse  /acme  http://localhost:8080/acme

LoadModule rewrite_module modules/mod_rewrite.so

Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-ssl.conf

apache httpd-vhosts.conf

# I have this so httpS only is supported
<VirtualHost _default_:80>  
  ServerName my.server.domain  
  RewriteEngine On
  RewriteCond %{SERVER_PORT} !443
  RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]            
</VirtualHost>

apache httpd-ssl.conf

我设置了以下路径:服务器证书,私钥,CA中间证书

tomcat server.xml

<!-- Note: proxyPort="80"  I think is correct right? (from docs) -->

<Connector  
   address="127.0.0.1"
   port="8080" 
   protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" 
   proxyPort="80" />

<Connector  
    address="127.0.0.1" 
    port="8009" 
    protocol="AJP/1.3" 
    redirectPort="8443" />   

============================================== < / p>

当然我也可以使用Ms Windows IP过滤来阻止8080,我希望这个连接器地址也能正常工作

1 个答案:

答案 0 :(得分:1)

我找到了解决方案:

在我的Tomcat server.xml中,我需要编辑http连接器并添加其他属性:

proxyName="my.server.domain"

所以它显示为:

<Connector
 port="8080"
 address="127.0.0.1"
 protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443"
 proxyPort="80"
 proxyName="my.server.domain"
 />

这允许tomcat托管的spring mvc webapp构建类似于:

的url

http://my.server.domain/acme

而不是:

http://localhost/acme

=========================================

错过该属性时发生的问题:proxyName =&#34; my.server.domain&#34; ---是:

托管在Tomcat上的spring mvc webapp正在构建用于处理请求的URL - 它正在询问Tomcat:&#34;您的服务器名称是什么?&#34; - Tomcat回复了什么&#34; localhost&#34; (Tomcat从Apache代理接收请求的值)。所以春天正在使用&#34; localhost&#34; 当它构建网址时类似于:http://localhost/acme

前面的Apache代理从Tomcat响应(来自spring mvc webapp响应)接收这些url - 而Apahe代理正在给出 最终用户客户端浏览器此网址转到:http://localhost/acme 最终用户客户端肯定没有在其本地计算机上托管该webapp - 因此浏览器正在向他们提供:HTTP错误404

=========================================

可以从apache代理配置中清楚地看到这一点:

ProxyPass         /acme  http://localhost:8080/acme
ProxyPassReverse  /acme  http://localhost:8080/acme

Apache正在发送一个包含&#34; localhost&#34;的网址。在请求中 - 给tomcat。 Tomcat连接器响应必须指定应该返回给客户端的Apache的真实proxyName(而不是localhost)。

=========================================

Tomcat连接器文档:

*的proxyName

如果在代理配置中使用此连接器,请配置此属性以指定要对request.getServerName()的调用返回的服务器名称。有关详细信息,请参阅代理支持。

代理支持

当Tomcat在代理服务器后面运行时,可以使用proxyName和proxyPort属性。这些属性修改返回给调用request.getServerName()和request.getServerPort()方法的Web应用程序的值,这些方法通常用于构造重定向的绝对URL。如果不配置这些属性,则返回的值将反映收到代理服务器连接的服务器名称和端口,而不是客户端指向原始请求的服务器名称和端口。*

============================================

许多在线博客 - 提到如何使tomcat连接器仅在127.0.0.1上监听 - 不解释必须在proxyPort的附加设置proxyName,如果你有 webapp就像构建url的spring mvc一样 - 你正在使用apache mod proxy将localhost的请求URL发送给Tomcat。