对于后端服务器中的Java应用程序,我们目前正在运行Apache Reverse Proxy(仅限转发),无需身份验证。这将是工作方式:
Internet< ---> Apache反向代理< ----> Java应用服务器
从互联网访问客户端的URL:example.com/java-app
通过代理访问Java应用程序工作正常,我们可以浏览应用程序并使用它,没有任何问题或错误。
我的问题:
Java应用程序在内部发出一些请求从外部网站获取一些数据,在这种情况下,是从公共PGP服务器获取密钥,但Java应用程序收到404错误。 Java应用程序使用常规GET java.net.HttpURLConnection到URL
http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on.
检查日志后,显然我们的代理服务器正在考虑将外部URL(http://pgp.uni-mainz.de)视为本地URL,因为我在日志中发现了这一点:
AH02417: Replacing host header 'pgp.uni-mainz.de' with host 'pgp.uni-mainz.de' given in the request uri
AH01626: authorization result of Require all granted: granted
AH01626: authorization result of <RequireAny>: granted
AH00128: File does not exist: /var/www/pks/lookup
在代理服务器中运行wireshark之后,我确认我的apache代理没有发送请求,因为我发现了这个
1528378541.404289000|192.x.x.x|54641|192.x.x.x|80|HTTP/1.1|GET|pgp.uni-mainz.de|http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on|Java/1.8.0_162|||||
1528378541.405104000|192.x.x.x|80|192.x.x.x|54641|HTTP/1.1|||||404|text/html; charset=iso-8859-1|290||
请注意,我可以从运行Java应用程序的后端服务器以及运行Apache代理服务器的服务器成功地卷曲/获取URL。
http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on
这是我对该网站的代理配置,正如您所看到的那样,非常简单且前进,并且对于java应用程序的访问工作正常:
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
ProxyRequests Off
ProxyVia Off
<Proxy *>
Require all granted
</Proxy>
ProxyPreserveHost On
AllowEncodedSlashes On
ProxyRequests Off
ProxyPass /synchrony http://backend-server.example.com:8091/synchrony
<Location /synchrony>
Require all granted
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://backend-server.example.com:8091%{REQUEST_URI} [P]
</Location>
ProxyPass /java-app https://backend-server.example.com:8093/java-app nocanon
ProxyPassReverse /java-app https://backend-server.example.com:8093/java-app
<Location /java-app/>
Require all granted
</Location>
Java应用程序以一些参数启动,让它知道在代理后面运行,并且这个java应用程序的其他功能正常运行,没有任何问题。这将是Java配置:
JVM_SUPPORT_RECOMMENDED_ARGS="-Dhttp.proxyHost=example.com -Dhttp.proxyPort=80 -Dhttps.proxyHost=example.com -Dhttps.proxyPort=443 -Dhttp.nonProxyHosts=\"backend-server.example.com|localhost|127.0.0.1|192.x.x.x|proxy-server.example.com|*java-app\""
我尝试修改代理配置,比如ProxyPreserveHost,但我没有成功。哪个可能是问题?
非常感谢。