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

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

我找到了解决方案:

在我的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。

解决方法

我希望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,我希望该连接器地址也能正常工作

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-