一尘不染

Tomcat 9连接器如何侦听Win的127.0.0.1反向代理。具有私有ServerName的Apache 2.4

tomcat

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

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

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

我从以下链接,问题和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/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上托管自己的Web应用程序,因此客户端浏览器将显示:HTTP错误404。找不到所请求的资源。

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

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

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

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

通过执行以下操作,我可以使proxy / reverse-proxy和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服务器.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" />

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

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


阅读 305

收藏
2020-06-16

共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 =“ my.server.domain” —时发生的问题是:

Tomcat上托管的spring mvc webapp正在构造用于处理请求的url,并询问Tomcat:“您的服务器名是什么?”
-Tomcat答复“本地主机”(Tomcat从Apache代理接收请求的值)。因此,spring在构造类似于以下内容的网址时使用了“ localhost”:
http:// localhost / acme

前端的Apache代理从Tomcat响应(从spring mvc
webapp响应)接收这些URL,而Apahe代理正在将最终用户客户端的URL转到以下网址: http:// localhost /
acme
最终用户客户端肯定可以没有在本地计算机上托管该Web应用程序-
因此浏览器向他们提供了:HTTP错误404

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

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

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

Apache将请求中包含“
localhost”的URL发送给tomcat。Tomcat连接器响应必须为Apache指定真实的proxyName(而不是localhost),该名称应返回给客户端。

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

Tomcat连接器文档:

  • proxyName

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

代理支持

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

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

如果您有像spring
mvc这样的Web应用程序正在构造url,那么很多在线博客(提到如何使tomcat连接器仅在127.0.0.1上侦听)都没有解释必须在proxyPort之外设置proxyName。您正在使用apache
mod代理将localhost的请求URL发送到Tomcat。

2020-06-16