背景

weblogic admin server端口号7001,在启动的时候,能启动成功,但是无法访问,错误日志里有Address already in use的错误信息,这个错误信息的意思是7001端口号被占用。

你需要了解的

网卡

服务器可能有多张网卡,并且有一张默认的网卡,叫做回环网卡,名称默认一般是lo,ip地址为127.0.0.1,这个网卡不是一个硬件设备而是由软件实现,所有发送到该网卡的数据能够立即被接收,提高本地应用程序通信效率,所以如果你在一台服务器上既部署了你的应用程序也部署了数据库,那么用localhost或者127.0.0.1作为连接地址是最快的。

回环网卡一般信息如下:

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3253320873 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3253320873 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:9318865833977 (8.4 TiB)  TX bytes:9318865833977 (8.4 TiB)

所有运行在操作系统上的程序如果要接收网络数据,那么必须执行地址绑定操作,绑定操作有两个参数,一个是网卡,一个是端口号,你绑定的网卡不同会导致不同的结果,如果你绑定了回环网卡lo那么别人通过你的ip地址是访问不了你的应用程序的,你只能本地用localhost访问,你本地也无法用ip地址访问,这就是为什么很多人说,明明我本地访问是可以的,为什么其他人就不行,是绑定的网卡不对。

最好的方式就是绑定所有的网卡,这样能保证所有的网卡都能接收到数据,在绑定的时候可以指定监听地址(listen-address)为0.0.0.0就可以绑定所有网卡,0.0.0.0不是一个地址而是协议里面规定这个地址就是绑定所有网卡。

netstat

netstat是Linux里面一个很有用的网络工具,通过netstat可以查看当前的网络连接状态,其中你必须要背的一个命令是netstat -npl,这个命令可以显示当前系统上所有有在监听的端口信息,配合grep可以找到监听指定端口进程号。

一般过程是这样的:

  • 通过 netstat找到占用端口的进程
$ netstat -npl|grep 7001
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 ::ffff:10.1.11.22:7001      :::*                        LISTEN      10136/java          
tcp        0      0 ::ffff:127.0.0.1:7001       :::*                        LISTEN      10136/java          
tcp        0      0 fe80::250:56ff:fe84:17:7001 :::*                        LISTEN      10136/java          
tcp        0      0 ::1:7001                    :::*                        LISTEN      10136/java
  • 10136就是进程号,拿到进程号后通过ps命令获取进程信息:
[oracle@wc ~]$ ps -ef|grep 10136
oracle   10136  9825  4 Jan10 ?        08:19:11 /u01/java/jrockit-jdk1.6.0_201/bin/java -jrockit -Xms4096m -Xmx4096m -Dweblogic.Name=AdminServer -Djava.security.policy=/u01/app/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -da -Dplatform.home=/u01/app/Oracle/Middleware/wlserver_10.3
.......

找到进程后你可以用kill命令杀掉进程或者通过其他方式解决。

排查过程

通过netstat命令发现weblogic只绑定了其中一张虚拟网卡,并没有绑定到用于内网通信的网卡(抱歉,这里忘记截图了),什么意思呢,这台服务器有两张网卡,一张是用于内网通信的网卡,一张是操作系统自动创建的虚拟网卡,正常web logic启动会绑定所有的网卡(你可以看上面那个7001的结果),但从结果上看weblogic只绑定了虚拟网卡并没有绑定内网的网卡。而且端口7001只有当前进程使用并没有其他进程使用。

关闭weblogic后未发现绑定7001端口的进程,但一启动立马又报端口被占用。

之前其他项目也碰到同样的问题,莫名其妙报了端口占用,但就是找到不到占用的进程,reboot后才解决,这次就是要找到根本原因。

通过netstat -a可以查看当前操作系统所有网络连接信息

左边是发起方的地址和端口,右边是接收方的地址和端口,因为服务器上有其他server,其他server跟admin有通信因此能看到这些发往7001的数据,但是其中有一个链接有点奇怪,就是发起方的端口也是7001,tcp连接是双向的,都需要一个端口,连接的接收方(也就是服务)端口是应用程序指定的,比如80,22,443等,连接的发起方都是操作系统随机分配的,截图里左边就是发起方,右边就是接收方,理论上发起方的端口号不会指定7001,但这里发起方的端口号被指定了7001,其实也是一个占用的操作。

解决

kill -15 2716关闭了指定的进程后,那个连接的状态变为了TIME_WAIT,该状态是发起方主动关闭连接等待接收方响应,但此时接收方早就挂了,因此这个状态会持续一段时间后消失。

等待这个tcp连接关闭后,重新启动admin,成功启动

遗留问题

操作系统分配7001端口产生的原因暂未清楚,但从结果上看确实是操作系统分配错了端口号,要么是weblogic的bug要么就是Linux的bug,我选择相信Linux。

Trackback

no comment untill now

Add your comment now