背景
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。
no comment untill now