我在一个盒子上有 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 非常简单。