提问者:小点点

Tomcat 9连接器如何监听127.0.0.1反向代理到Win. Apache 2.4和私有ServerName


我希望Tomcat 8080只在127.0.0.1上监听,并反向代理到使用专用网络ServerName的Windows Apache 2.4

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

部署的Tomcat Web应用是一个带有Spring Security登录页面的SpringMVCWeb应用

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

如何为tomcat设置IP地址?

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/FrontingTomcat与ApacheHTTP服务器

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

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

我希望流程是:

用户客户端-

apache和tomcat与jdk8位于同一台Windows 7服务器机器上

我没有在任何日志中看到任何有用或错误

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

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

请注意,它没有使客户端浏览器尝试转到8080,所以这很好

客户端肯定没有在他们被定向到的URLHTTPlocalhost/acme托管他们自己的网络应用程序,因此客户端浏览器显示:HTTP错误404。找不到请求的资源。

我不认为SpringMVC安全登录页面是罪魁祸首

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

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

我使用重写要求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" />  

以下是我在下面的配置文件,它们会导致不受欢迎的浏览器重定向:

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
# 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>

我设置我的路径:服务器证书,私钥,CA中介证书

<!-- 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" />   

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

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


共1个答案

匿名用户

我找到了解决方案:

在我的Tomcat server. xml中,我需要编辑超文本传输协议连接器并添加附加属性:

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="my. server.domain"---是:

托管在Tomcat上的Spring mvc webapp正在构建url来处理请求——它问Tomcat:“你的服务器名是什么?”-Tomcat回答“localhost”(Tomcat从Apache代理接收请求的值)。所以Spring在构建网址时使用了“localhost”,类似于:http://localhost/acme

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

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

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

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

Apache正在向tomcat发送请求中包含localhost的url。Tomcat连接器响应必须为Apache指定应返回给客户端的真实proxyName(而不是localhost)。

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

Tomcat连接器文档:

*代理名称

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

代理支持

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

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

很多在线博客——提到如何让tomcat连接器只在127.0.0.1上监听——没有解释代理名称必须在proxyPort之外设置,如果你有一个像Spring mvc这样的网络应用程序正在构建url——并且你正在使用apache mod代理向Tomcat发送localhost的请求url。