前言
生产环境使用阿里云的消息队列服务,在 tomcat 容器 WAR 包中使用官方提供的 SDK,但是在启动 tomcat 的时候,报错了。
报错信息
部署 tomcat 的 ECS 为双十一后购买的服务器,新的服务器在创建的时候主机名更改为 16 位字符;
生产环境之前有一批老机器,大概是 2016 年 6月份买的,上面也部署了相同配置的 tomcat,并使用同一个 MQ 队列,但是 tomcat 启动成功,这让人很是费解,在检查了配置文件和 SDK 文档比对之后,竟然在老的机器上启动成功,很伤。
报错信息如下:
其中 java.net.UnknownHostException: 的错误也让人很费解。
网上查了好多资料,后来定位到是 hostname 获取不到的原因,ECS 服务器的hostname 是配置在 /etc/hostname 中的,hostname 命令也可以正常读取主机名,在大多数 Linux 系统中(Redhat、Centos等)都是在 /etc/hosts 中获取主机名的,Detian 是从 /etc/hostname 中得到主机名的。
Java 的 inetAddress.java 调用方法 getLocalHostName() 获取主机名,属于系统调用,所以在 centos 上面,会读取 /etc/hosts 文件来获取主机名,但阿里云新购服务器恰恰没有在 /etc/hosts 中定义主机名,老的机器有这个定义。
解决
在 /etc/hosts 文件中添加 本机IP hostname,然后 tomcat 正常启动。