Назад | Перейти на главную страницу

случайно занятый порт 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

Проблема в том, что иногда (что бывает довольно редко, случайным и невоспроизводимым) один из котов не запускается, потому что его 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

Таким образом, он продолжит процесс запуска и запустит все свои веб-приложения, но, к сожалению, они никогда не смогут получить какой-либо HTTP-запрос.

Соответствующая конфигурация:

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

Что может быть причиной? 8015 больше нечего слушать.

Я надеюсь, что вы используете уникальный номер порта в порту ajp для каждого из 9 экземпляров tomcat. Я имею в виду это:

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

Я имею в виду, что abcd отличается для каждого из 9 экземпляров tomcat. это также может быть связано с тем, что порт использует какая-то другая программа. Скорее всего, вы используете базу данных в своем приложении, которая может содержать порт. Я имею ввиду клиентскую сторону БД. Вы можете увидеть, какая программа удерживает порт, через netstat или ss. Выполните следующие действия от имени привилегированного пользователя, чтобы узнать, какая программа удерживает порт:

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

На выходе вы увидите pid (идентификатор процесса). Затем сделайте следующее

ps -ef| grep <pid from above>

То же самое можно сделать и с командой ss, которая, по их словам, более эффективна. Google или справочные страницы, чтобы узнать, как получить то же самое с ss. Использовать ss очень просто.