我有一个在 EC2 中的 Tomcat 上运行的 Java 应用程序,我想通过代理访问不同的 EC2 端点。让我们调用源 https://source.com
和目标 https://destination.com
和代理 https://proxy.com
我的症状如下:
- 从我的源服务器访问端点有效:
wget destination.com
返回一个输出,包括连接到代理,然后以 200 ok 连接到destination.com
。
- 当我尝试通过源上的 API 使用 postman 进行调用时,出现以下错误:
org.springframework.web.client.ResourceAccessException:“http://destination.com”的 GET 请求上的 I/O 错误:连接到 destination.com:80
...
连接超时;嵌套异常是 org.apache.http.conn.ConnectTimeoutException
我做过的事情:
- 验证 http 和 https 代理是否已导出
- 我将这两个导出为环境变量:
http_proxy=http://destination.com:80 https_proxy=http://destination.com:80
验证 java_opts 是否也包含代理信息:
运行
ps -ef | grep app_name
返回以下内容:-Dhttp.proxyHost=destination.com -Dhttp.proxyPort=80 -Dhttps.proxyHost=destination.com -Dhttps.proxyPort=80
即使导出了这些信息并在 java_opts(在 setenv.sh
中设置),似乎 API 没有使用代理到达目的地,因为从服务器,我可以使用wget/curl 通过代理到达端点。是否还有其他我错过的原因/位置导致 API 不使用代理?
我的 java 版本在这里:java -version
Java 版本“1.8.0_91”
Java(TM) SE 运行时环境(build 1.8.0_91-b14)
Java HotSpot(TM) 64 位服务器 VM(构建 25.91-b14,混合模式)
提前致谢。
最佳答案
您没有使用 Java API。 http[s].proxyHost
用于 HttpURLConnection
和 friend 。您似乎正在使用 Apache HTTP 客户端,它显然不支持它们。
关于Java:-Dhttps.proxyHost 未被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44091715/