我们在连接到运行在AmazonEC2集群中的Java应用程序时遇到了问题。我们明确地允许“JMX端口”(它通常是RMI注册表端口)和服务器端口(它完成了大部分工作)对所讨论的实例的安全组。Jconsole连接但似乎挂起并且从未显示任何信息。
java -server -jar foo.jar other parameters here > java.log 2>&1
jconsole
,它可以连接并显示信息。因此JRE将其导出到本地。tcpdump
确保通信不会到达其他端口。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客户机中的注册表端口。
我们在连接到运行在AmazonEC2集群中的Java应用程序时遇到了问题。
原来,问题是两个缺失设置的组合。第一种情况迫使JRE选择ipv4而不是IPv6。这是必要的(我想),因为我们试图通过v4地址连接到它:
-Djava.net.preferIPv4Stack=true
真正的阻止因素是JMX的工作方式是首先联系RMI端口,该端口响应主机名和JMX客户机要连接的端口。在没有其他设置的情况下,它将使用box的本地IP,这是一个10.x.x.x
虚拟地址,远程客户端无法路由到该地址。我们需要添加以下设置,即服务器的外部主机名或IP--在本例中,它是服务器的弹性主机名。
-Djava.rmi.server.hostname=ec2-107-X-X-X.compute-1.amazonaws.com
# 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
上面wget
命令中神秘的169.254.169.254
IP提供了EC2实例可以请求的有关自身的信息。我感到失望的是,这没有包括标签,只有在一个经过身份验证的调用中才可用。
我最初使用外部ipv4地址,但看起来JDK在启动时试图建立到服务器端口的连接。如果它使用外部IP,那么这会减慢应用程序的启动时间,直到超时为止。public-hostname在本地解析为10-net地址,在外部解析为public-ipv4。因此,应用程序现在启动得很快,JMX客户机仍然可以工作。呜呼!
希望这能帮到别人。今天花了我3个小时。
这个问题又出现了。看起来Java JMX代码正在对盒子的主机名进行一些主机名查找,并使用它们来尝试连接和验证JMX连接。
这个问题似乎是一个要求,即盒子的本地主机名应该解析为盒子的本地IP。例如,如果您的/etc/sysconfig/network
具有hostname=server1.foobar.com
,那么如果您在server1.foobar.com
上进行DNS查找,您应该可以找到10-net虚拟地址。我们正在生成自己的/etc/hosts
文件,但该文件中缺少本地主机的主机名。这导致我们的应用程序要么在启动时暂停,要么根本不启动。
最后
简化JMX创建的一种方法是使用我的SimpleJMX包。
问题内容: 连接到在Amazon EC2集群中运行的Java应用程序时遇到问题。我们绝对允许“ JMX端口”(通常是RMI注册表端口) 和 服务器端口(完成大部分工作)都进入所讨论实例的安全组。Jconsole连接但似乎挂起并且从不显示任何信息。 我们正在使用以下内容运行我们的java: 我们尝试过: Telnet 连接 到端口,但不显示任何信息。 我们可以在ssh上使用remote-X11在实例
问题内容: 任何人都可以指出以下步骤/资源: 如何在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