java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

时间:2024-03-24 11:14:13

刚刚通过qq帮同事处理了一个客户线程问题,都这么晚了,还在现场部署应用,真实够拼的,客户不能连接外网,不能下载文件,只能通过手机拍照错误日志排查问题;

问题现象就是tomcat起不来,上来给我发了好几张错误日志照片,类似下面这样:

java.net.BindException: Cannot assign requested address 你所不知道的另一个原因


凭经验,一看就是某些原因导致tomcat启动失败,执行关闭操作报的一堆警告,所以让他去找tomcat启动后第一处异常,拍照如下:

java.net.BindException: Cannot assign requested address 你所不知道的另一个原因


java.net.BindException: Cannot assign requested address 你所不知道的另一个原因


这个异常报错是

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

    java.net.BindException: Cannot assign requested address

一看怀疑是18005 端口被占用了无法绑定;这个好说,执行命令netstat -antp|grep 18005 看哪个进程占用了18005端口直接干掉它,启动就完事了,但是谭明飞告诉我,技术支持说没有占用18005端口的进程;

于是百度谷歌了一通,总结起来有两种可能 :


1. 短时间内大量的socket连接建立并结束,导致很多TIME_WAIT端口没来及释放,端口被占用光了。解决方案,要么重用socket连接,要么开启sockets的快速回收:sysctl -w net.ipv4.tcp_tw_recycle=1;

2.本机host配置有误, 出现这个问题的用户,都是将localhost映射成了一个不存在的ip地址,更改成127.0.0.1后就ok了;


情况1不可能,技术支持正在部署应用,还没有启动成功,怎么会有大量socket连接,为了以防万一,专门使用下面的命令:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

统计了一下tcpip的状态,发现全都是ESTABLISHED状态,连接才有76个,如下图:


java.net.BindException: Cannot assign requested address 你所不知道的另一个原因


又检查/etc/hosts配置文件,发现配置正确;


根据打印日志的第一行

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

服务器是在访问localhost:18005 , 判断可能和第二条有些关联,但是未必是hosts配置错误导致的问题,于是让技术支持ping一下localhost看看ip地址是不是127.0.0.1,结果发现ping命令卡住,无法ping通:

java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

第一反应就是客户禁止ping了,于是执行以下命令,解除禁止:

 echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

执行后发现仍然ping不通;同时技术支持发现不但localhost地址ping不通,本机地址也一样ping不通:

java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

但是从别的服务器上ping这台机器,和从这台机器ping别的机器是能通的;

后来让技术支持执行下ifconfig命令看下本机的ip地址:

java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

发现竟然没有lo 回路地址,难道问题在这?马上百度了一下lo回路地址,发现它有一个配置文件:

/etc/sysconfig/network-scripts/ifcfg-lo


java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

提示文件不存在,于是按照正常机器样本重建这个文件后,问题解决;