我们无法连接到在亚马逊EC2集群中运行的Java应用程序。我们确实已经允许了“JMX端口”(通常是RMI注册表端口) 和 服务器端口(执行大部分工作)通过安全组访问相关实例。Jconsole可以连接但似乎会卡住,从未显示任何信息。
我们正在以以下方式运行java:
java -server -jar foo.jar other parameters here > java.log 2>&1
我们已经尝试过:
- 通过telnet连接端口connect,但没有显示任何信息。
- 我们可以在实例本身上使用远程X11 over SSH运行
jconsole
,它连接并显示信息。 因此,JRE 确实在本地导出它。 - 打开安全组中的所有端口。 呼呼。
- 使用
tcpdump
确保流量未发送到其他端口。 - 在本地进行模拟。 我们始终可以使用相同的应用程序参数连接到我们的本地JRE或在我们网络中运行的JRE。
java -version
输出:
OpenJDK Runtime Environment (IcedTea6 1.11.5) (amazon-53.1.11.5.47.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
此外,我们正在使用我的Simple JMX包,该包允许我们设置RMI注册表和服务器端口,这些端口通常是由RMI注册表随机选择的。您也可以使用类似以下JMX URI的方法强制执行此操作:
service:jmx:rmi://localhost:" + serverPort + "/jndi/rmi://:" + registryPort + "/jmxrmi"
现在我们使用同一个端口号作为服务器和注册表的端口号。过去,我们曾经使用X
作为注册表的端口号,X+1
作为服务器的端口号,以便于设置安全组规则。您可以在jconsole
或其他JMX客户端中连接到注册表端口号。
netstat -lp
命令,我发现 Java 打开了两个额外的端口。我之前不知道需要一个额外的端口,我猜测之前测试时所有端口都对我打开了... 我真是太蠢了。难道没有非编程方式(例如系统属性)来定义第二个端口吗?如果没有,那我想我会尝试使用你的 SimpleJmx 包! - Rui Gonçalves