Сталкивался ли кто-нибудь с проблемой перезапуска nginx?

Иногда системе не удается перезапустить nginx. Самое неприятное во всем этом - это "иногда".

Сейчас на сервере установлено:
Debian GNU/Linux 7 (wheezy)
 nginx/1.2.1  (пакет nginx-extras [nginx web/proxy server (extended version)])

При ошибочном перезапуске в логах появляется следующее.
2014/05/06 07:03:04 [emerg] 3176#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2014/05/06 07:03:04 [emerg] 3176#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2014/05/06 07:03:04 [emerg] 3176#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2014/05/06 07:03:04 [emerg] 3176#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2014/05/06 07:03:04 [emerg] 3176#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2014/05/06 07:03:04 [emerg] 3176#0: still could not bind()

При анализе ситуации, выявлено, что слушать этот порт продолжает сам nginx и возникает такое ощущение что отпускать он его и не собирается. После kill все успешно стартует.

В Интернете в основном пишут что проблема может быть следующей:

1) В сервере по умолчанию добавлена настройка
listen [::]:80 default_server;
и она создает проблему связанную с IP6.

Но у нас даже характер ошибки в логах немного другой.

2) Запущенный Apache и его конфликт с nginx
У нас такой проблемы нет.
root@beta:/etc# netstat -tnlp | grep 80 
tcp        0      0 0.0.0.0:80          0.0.0.0:*               LISTEN      10307/nginx      
tcp        0      0 127.0.0.1:8080      0.0.0.0:*               LISTEN      11605/apache2


3) Просто процесс завис, можно его убить и все заново запустить.
Это конечно подходит под наш вариант, но совсем не устраивает.

Я предполагаю что проблема может быть:
- мои кривые настройки nginx
- некорректный скрипты запуска/перезапуска debian
- проблемная сборка nginx в debian

Сталкивался ли кто-нибудь с подобным проявлением nginx?
Меня очень беспокоит что эта ошибка имеет не системный характер, а мне требуется автоматически перезагружать nginx.
  • Вопрос задан
  • 3630 просмотров
Решения вопроса 1
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Теги: start-stop-daemon, говно.

Мы эту проблему решали добавлением kill -9 в конце init-скрипта nginx-а, если он сам не сдохнет за сколько то секунд.

start-stop-daemon возвращает, что всё ок, но в реальности nginx ещё не закрыл все соединения (и не убил процессы).
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
alekciy
@alekciy
Вёбных дел мастер
некорректный скрипты запуска/перезапуска debian

init скрипт бывает рапортует, что сервер был остановлен. По факту это не так. Если после этого попытаться его через init запустить еще раз, то скрипт думает, что сервис не работает и повторно его стартует упираясь в ошибку bind. На сколько я помню проблема возникает когда в runtime файл записался некорректный PID процесса. Т.е. проблема может быть решена просто переписыванием init скрипта.
Ответ написан
merryjane
@merryjane
Системный администратор
Попробуйте поставить версию по свежее из репозиториев непосредственно Nginx.
Ответ написан
посмотрите в /etc/init.d/nginx куда он кладет nginx.pid, есть ли у него права на эту локацию, и появляется ли там файлик после запуска.
Потому что при остановке процесс он берет из этого файла, если файла нет - он рапортует, что все остановлено.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы