当前位置: 首页 > 面试题库 >

如何使用JMX连接到在EC2上运行的Java实例

贺功
2023-03-14
问题内容

连接到在Amazon EC2集群中运行的Java应用程序时遇到问题。我们绝对允许“ JMX端口”(通常是RMI注册表端口)
服务器端口(完成大部分工作)都进入所讨论实例的安全组。Jconsole连接但似乎挂起并且从不显示任何信息。

我们正在使用以下内容运行我们的java:

java -server -jar foo.jar other parameters here > java.log 2>&1

我们尝试过:

  • Telnet 连接 到端口,但不显示任何信息。
  • 我们可以jconsole在ssh上使用remote-X11在实例本身上运行,它可以连接并显示信息。因此,JRE 正在 将其导出到本地。
  • 打开安全组中的所有端口。e
  • 使用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)

顺便说一句,我们使用的是我的简单的JMX包,它允许我们设置 两个
RMI注册表和服务器端口,一般是通过RMI注册表半随机选择的。您也可以使用以下JMX URI来强制执行此操作:

service:jmx:rmi://localhost:" + serverPort + "/jndi/rmi://:" + registryPort + "/jmxrmi"

这些天,我们为服务器和注册表使用相同的端口。过去,我们使用X注册表端口和X+1服务器端口来简化安全组规则。您可以连接到jconsole正在使用的JMX客户端中的注册表端口。


问题答案:

连接到在Amazon EC2集群中运行的Java应用程序时遇到问题。

事实证明,问题是两个缺少设置的组合。第一个强制JRE选择ipv4而 不是 v6。这是必要的(我想),因为我们正尝试通过v4地址连接到它:

-Djava.net.preferIPv4Stack=true

真正的阻止因素是,JMX通过首先联系RMI端口来工作,该端口以 主机名
和端口作为响应,以供JMX客户端连接。如果没有其他设置,它将使用该框的本地IP,这是10.X.X.X远程客户端无法路由到的虚拟地址。我们需要添加以下设置,它是服务器的
外部 主机名或IP-在这种情况下,它是服务器的弹性主机名。

-Djava.rmi.server.hostname=ec2-107-X-X-X.compute-1.amazonaws.com

如果要尝试自动执行EC2实例(以及为什么不这样做),诀窍在于如何在运行时查找此地址。为此,您需要在我们的应用程序启动脚本中添加以下内容:

# get our _external_ hostname
RMI_HOST=`wget -q -O - http://169.254.169.254/latest/meta-data/public-hostname`
...
java -server \
    -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=$RMI_HOST \
    -jar foo.jar other parameters here > java.log 2>&1

上面命令中的神秘169.254.169.254IP wget提供了EC2实例可以请求有关其自身的信息。我很失望,其中
包含仅在经过身份验证的呼叫中可用的标签

我最初使用的是extern
ipv4地址,但看起来好像JDK在启动时尝试与服务器端口建立连接。如果它使用外部IP,则这将减慢我们的应用程序启动时间,直到超时为止。public-
hostname在本地解析为10网络地址,在外部解析为public-ipv4。因此,该应用程序现在可以快速启动,并且JMX客户端仍然可以运行。呜呜!

希望这对其他人有帮助。今天花了我3个小时。

要强制您的JMX服务器在指定端口上启动服务器 RMI注册表,以便您可以在EC2安全组中阻止它们,请参阅以下答案:

如何关闭在特定端口上运行的rmiregistry?

编辑:

我们只是再次出现了这个问题。似乎Java JMX代码正在对主机名进行一些主机名查找,并使用它们尝试连接并验证JMX连接。

该问题似乎是要求框的本地主机名应解析为框的本地IP。举例来说,如果你/etc/sysconfig/networkHOSTNAME=server1.foobar.com那么如果你做一个DNS查找server1.foobar.com,你应该得到的10-NET的虚拟地址。我们正在生成自己的/etc/hosts文件,并且文件中缺少本地主机的主机名。这导致我们的应用程序在启动时暂停或根本不启动。

最后

简化JMX创建的一种方法是使用我的SimpleJMX包。



 类似资料:
  • 我们在连接到运行在AmazonEC2集群中的Java应用程序时遇到了问题。我们明确地允许“JMX端口”(它通常是RMI注册表端口)和服务器端口(它完成了大部分工作)对所讨论的实例的安全组。Jconsole连接但似乎挂起并且从未显示任何信息。 Telnets连接到端口,但不显示任何信息。 我们可以通过ssh使用remote-X11在实例本身上运行,它可以连接并显示信息。因此JRE将其导出到本地。 打

  • 问题内容: 任何人都可以指出以下步骤/资源: 如何在Amazon EC2上部署Java EE应用 实例重新启动后(可能使用amazon-ebs)维护对应用服务器的元数据的更改(部署新应用程序) 问题答案: 如果您还没有运行过它,请先检查一下:http : //docs.aws.amazon.com/gettingstarted/latest/awsgsg- intro/intro.html, 它可

  • 我试图在AmazonEC2上运行php5,使用多个分离的php fpm服务器,通过nginx上的上游块进行负载平衡。我正在用两个t1进行测试。微实例,但当我尝试加载php文件时,浏览器上出现502错误网关。(静态html文件工作正常,但无法使php文件正常工作。) 这是我的nginx错误日志。 2012/07/11 12:28:21[错误]18626#0:*1 recv()在从上游读取响应头时失败

  • 我想在java中连接到Amazon EC2上的PostgreSQL数据库。我可以使用Mac上名为Postico的postgres客户端连接到它。我指定下一个信息: > 主机(ec2 xx xx xx xx.xx-xx-x.compute.amazonaws.com) 用户 密码 数据库名称 SSH主机 用户 密码-空白 私钥-. pem文件 我找不到任何关于如何在Java中连接它的例子。我找到了一

  • 这是个新手问题。求求你,忍耐我。 我试图按照官方教程使用AWS SDK for JAVA创建一个实例。当谈到密钥对部分时,我会感到困惑: 通过这样做,我如何使用aws cli连接到我使用SDK创建的实例,我指的是如何定位。pem文件(如果它确实存在的话)。在使用代码创建ec2实例并通过aws cli管理它方面,我的逻辑是正确的吗?还是应该以相同的方式?!

  • 我正在一个盒子上运行redis 2.8.7。从其他框(两者都是aws ec2)我正在发出这个命令 redis-cli -h ,但我得到这个错误 无法连接到Redis:6379:连接被拒绝 框1上的端口6379为框2打开。此外,没有redis的id/pwd