gpt4 book ai didi

spring - Tomcat 9 Connector如何监听127.0.0.1反向代理到Win。具有私有(private) ServerName 的 Apache 2.4

转载 作者:行者123 更新时间:2023-11-28 22:48:14 26 4
gpt4 key购买 nike

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

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

部署的 Tomcat Web 应用程序是一个带有 Spring Security 登录页面的 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 安全登录页面会是罪魁祸首

我的 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 服务器.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" />

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

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

最佳答案

我找到了解决方案:

在我的 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 正在回复“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 的真实代理名称(不是本地主机)。

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

Tomcat 连接器文档:

*代理名称

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

代理支持

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

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

很多在线博客 - 提到如何让 tomcat 连接器仅在 127.0.0.1 上监听 - 没有解释必须在 proxyPort 之外设置 proxyName,如果你有像 spring mvc 这样构建 url 的 webapp - 你正在使用 apache mod 代理将本地主机的请求 url 发送到 Tomcat。

关于spring - Tomcat 9 Connector如何监听127.0.0.1反向代理到Win。具有私有(private) ServerName 的 Apache 2.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50003835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com