24 августа 2012 г.

Этот загадочный skype или кошачьи страдания на 80 порту

Прошла пора летних отпусков и время возвращаться к блогу.
Перед отпуском меня старый компьютер порадовал "вылетевшим" диском/контроллером и пришлось срочно переходить на новый (Asus он такой Asus, но об этом напишу как-то в другой раз).

Обновил все, что нужно, устанавливаю Java, Apache Tomcat (наше ПО Loan Workbench это т.н. трехзвенка, где на серверной стороне Servlet Container, а клиента мы "разворачиваем" через Java Web Start).

В общем, все как обычно запускаю и ... зависаю. Файл lw.jnlp скачивается (это descriptor Java Web Start - что запускать, зависимости и т.д.), а далее мне Java пишет, что этого файла на сервере нет. Других ошибок ни на сервере, ни на клиенте (даже в Java Console заглянул) - нет. Ну, думаю, глючная Java 7, ставлю Java 6 и ... то же самое.




Потом я долго думал, искал в интернете, спрашивал коллег и Google - никто не знает, что за напасть (для справки с Tomcat'ом я не новичок умею его "готовить" и "развожу кошек" уже лет 5).
Короче говоря, дошел я до того (не спрашивайте как), что дай думаю поменяю порт Tomcat'у (по ленности своей ставлю его обычно на HTTP порт - 80 - так меньше в браузере набирать - вместо http://localhost приходится писать http://localhost:8080). Меняю порт на 8080 (это порт по-умолчанию Tomcat'а) и о чудо! - все начинает работать как и должно.

Немного зависаю, так как ситуация с одной стороны стандартная, а с другой - нет. Если Tomcat не может занять порт он честно об том пишет в логах - так мол и так "ну не шмогла я" (bind exception - порт занят). В моем же случае Tomcat порт занимает, но какая-то зараза перехватывает запросы.

Как посмотреть какие порты заняты на компьютере знает каждый
> netstat -a

Вижу такую картину и очень удивляюсь, но уже догадываюсь, что происходит: два приложения "слушают" 80 порт - одно из них Apache Tomcat, а какое же второе !?

К слову (netstat -a, кажется, почти кросс-платформенная команда, я помню ее, кажется, еще с 90-х годов со времен FreeBSD :).

Оказывается под Windows для нее есть супер важный ключ -b, который, если вам повезет, покажет название файла приложения, которое слушает порт или установило соединение (А дословно - "Displays the executable involved in creating each connection or listening port. In some cases well-known executables host multiple independent components, and in these cases the sequence of components involved in creating the connection or listening port is displayed. In this case the executable name is in [] at the bottom, on top is the component it called, and so forth until TCP/IP was reached. Note that this option can be time-consuming and will fail unless you have sufficient permissions.")

У меня в такой ситуации 
netstat -a -b

показывает следующее - два процесса tomcat.exe (предсказуемо) и skype.exe (WTF!!??) "слушают" 80 порт. Причем Skype слушает не только HTTP порт 80, но и HTTPS порт 443...

Чтобы полностью раскрыть тему с netstat - упомяну еще два важных ключа
  • -n - если его указать, netstat не пробует resolve'ить ip адреса в DNS и писать вместо номеров портов их имена (из файла services?) и работает очень быстро (Displays addresses and port numbers in numerical form).
  • -o - иногда, netstat не может указать название файла приложения, которое "заняло" порт и пишет "Не шмогла" Can not obtain ownership information. Этот ключ выводит т.н. PID процесса, слушающего порт или открывшего соединение (Displays the owning process ID associated with each connection). По PID можно уже, например, в Windows Task Manager'e обнаружить нужный нам процесс.

Вернемся к виновнику Skype'у - он по-умолчанию с версии ... слушает 80 и 443 порты. К счастью это поведение легко отключается в настройках.

А далее непонятное - я не знаю как давно так похабно ведет себя Skype, но я за 7-8 лет его использования ни разу с такой проблемой не сталкивался, хотя при написании данной статьи наткнулся на сообщение 2007 года с теми же проблемами.

Насмешила в этой ситуации любимая жена, которая выслушав мои жалобы на этот уродский Microsoft'овский Skype, поделилась, что это его стандартная и давняя болезнь и что она всегда его вырубает перед тем как какой-то web server под Windows запустить иначе беда (причем проблема стара как мир, по ее словам).

Даже не знаю что и написать вместо заключения: ни разу до сего дня не сталкивался с подобного рода проблемами со skype'ом и портом 80. Например, я точно знаю, что ESET NODE 32 антивирус занимает 80 порт и не пишет, кто его занял в netstat'е. А Oracle Listener с точностью до наоборот занимает порт 8080 и пишет :).

А ответьте как мне, проницательный читатель, почему иногда два приложения могут слушать один и тот же порт, а иногда - нет и где об этом почитать подробнее (до этого случаю не думал, что без каких-либо специальных хитростей такое возможно)?

UPDATE 21.01.15 Если Вам понадобится узнать кто занимает какой-то порт на OSX, то это делается следующей волшебной командой
$ lsof -n -i4TCP:80 | grep LISTEN

Комментариев нет:

Отправить комментарий