服务器重启时随机占用 AJP 端口

服务器重启时随机占用 AJP 端口

我在一个盒子上有 9 个 tomcat 实例(前面是 apache 和 mod_jk),它们以/etc/init.d/tomcatX脚本开头(其中 X 是 [1-9] 数字)。这些脚本很简单:

#!/bin/sh
### BEGIN INIT INFO
# Required-Start: mysql
### END INIT INFO

case "$1" in
'start')
        /usr/local/tomcat5/bin/startup.sh
        touch /var/lock/subsys/tomcat5
        ;;
'stop')
        /usr/local/tomcat5/bin/shutdown.sh
        rm -f /var/lock/subsys/tomcat5
        ;;
*)
        echo "Usage: $0 { start | stop }"
        ;;
esac
exit 0

这些服务在服务器重启时启动:

> chkconfig -l
...
tomcat1                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat2                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat3                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat4                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat5                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat6                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat7                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat8                   0:off  1:off  2:off  3:on   4:off  5:on   6:off
tomcat9                   0:off  1:off  2:off  3:on   4:off  5:on   6:off

问题是,有时(这种情况相当罕见、随机且不可重现)其中一个 tomcat 无法启动,因为其AJP端口已被占用:

May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init
INFO: Port busy 8015 java.net.BindException: Address already in use
May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init
SEVERE: Can't find free port 8015 8015

因此,它将继续启动过程并启动其所有 web 应用程序,但不幸的是,它们永远无法接收任何 http 请求。

相关配置为:

<Connector port="8015" protocol="AJP/1.3" ... />

可能是什么原因?没有其他任何东西在监听 8015。

答案1

我希望您在 9 个 tomcat 实例中的每一个的 ajp 端口中使用唯一的端口号。我的意思是:

<Connector port="abcd" protocol="AJP/1.3" ... />

我的意思是,9 个 tomcat 实例的 abcd 各不相同。也可能是因为其他程序正在使用该端口。最有可能的是,您在应用程序中使用了可能占用该端口的数据库。我指的是数据库的客户端。您可以通过 netstat 或 ss 查看哪个程序占用了该端口。以特权用户身份执行以下操作,查看哪个程序占用了该端口:

sudo netstat -antp| grep <port number reported in use>

在输出中,你会看到 pid(进程 ID)。然后执行以下操作

ps -ef| grep <pid from above>

ss 命令也可以完成相同的操作,据说它效率更高。使用 Google 或手册页来了解如何使用 ss 完成相同的操作。使用 ss 非常简单。

相关内容