连接到在Amazon EC2集群中运行的Java应用程序时遇到问题。我们绝对允许“ JMX端口”(通常是RMI注册表端口) 和
服务器端口(完成大部分工作)都进入所讨论实例的安全组。Jconsole连接但似乎挂起并且从不显示任何信息。
我们正在使用以下内容运行我们的java:
java -server -jar foo.jar other parameters here > java.log 2>&1
我们尝试过:
jconsole
在ssh上使用remote-X11在实例本身上运行,它可以连接并显示信息。因此,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客户端中的注册表端口。
连接到在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.254
IP wget
提供了EC2实例可以请求有关其自身的信息。我很失望,其中 不
包含仅在经过身份验证的呼叫中可用的标签。
我最初使用的是extern
ipv4地址,但看起来好像JDK在启动时尝试与服务器端口建立连接。如果它使用外部IP,则这将减慢我们的应用程序启动时间,直到超时为止。public-
hostname在本地解析为10网络地址,在外部解析为public-ipv4。因此,该应用程序现在可以快速启动,并且JMX客户端仍然可以运行。呜呜!
希望这对其他人有帮助。今天花了我3个小时。
要强制您的JMX服务器在指定端口上启动服务器 和 RMI注册表,以便您可以在EC2安全组中阻止它们,请参阅以下答案:
如何关闭在特定端口上运行的rmiregistry?
编辑:
我们只是再次出现了这个问题。似乎Java JMX代码正在对主机名进行一些主机名查找,并使用它们尝试连接并验证JMX连接。
该问题似乎是要求框的本地主机名应解析为框的本地IP。举例来说,如果你/etc/sysconfig/network
有HOSTNAME=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