我希望Tomcat 8080只能在127.0.0.1上侦听,并且反向代理到使用私有网络ServerName的Windows Apache 2.4
我不希望tomcat端口8080可以在运行Tomcat的机器外部访问 .
部署的Tomcat Web应用程序是一个带有 spring 安全登录页面的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://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" />
==============================================
当然我也可以使用Ms Windows IP过滤来阻止8080,我希望这个连接器地址也能正常工作
1 回答
我找到了解决方案:
在我的Tomcat server.xml中,我需要编辑http连接器并添加其他属性:
所以它看起来像:
这允许tomcat托管的spring mvc webapp构建类似于以下内容的url:
http://my.server.domain/acme
代替:
http://localhost/acme
=========================================
缺少属性时发生的问题:proxyName =“my.server.domain”---是:
托管在Tomcat上的spring mvc webapp正在构建用于处理请求的URL - 它正在询问Tomcat:"What is your server name?" - Tomcat正在回复"localhost"(Tomcat从Apache代理接收请求的值) . 所以当它构建网址时, Spring 天正在使用"localhost":http://localhost/acme
前端Apache代理从Tomcat响应中接收这些URL(来自spring mvc webapp响应) - 并且Apahe代理向最终用户客户端浏览器提供了这个URL:http://localhost/acme最终用户客户端肯定没有托管该webapp他们的本地机器 - 所以浏览器给他们:HTTP错误404
=========================================
可以从apache代理配置中清楚地看到这一点:
Apache在请求中发送包含“localhost”的url到tomcat . Tomcat连接器响应必须指定应该返回给客户端的Apache的真实proxyName(而不是localhost) .
=========================================
Tomcat连接器文档:
*的proxyName
如果在代理配置中使用此连接器,请配置此属性以指定要对request.getServerName()的调用返回的服务器名称 . 请参阅代理支持更多信息 .
代理支持
当Tomcat在代理服务器后面运行时,可以使用proxyName和proxyPort属性 . 这些属性修改返回给调用request.getServerName()和request.getServerPort()方法的Web应用程序的值,这些方法通常用于构造重定向的绝对URL . 如果不配置这些属性,则返回的值将反映收到代理服务器连接的服务器名称和端口,而不是客户端指向原始请求的服务器名称和端口 . *
============================================
很多在线博客 - 提到如何让tomcat连接器只在127.0.0.1上监听 - 如果你有一个类似于构建url的spring mvc的webapp,那么就不要解释必须在proxyPort的设置中设置proxyName - 和您正在使用apache mod proxy将localhost的请求URL发送到Tomcat .