"service nginx restart" vs "service nginx reload"

Igor Sysoev is at rambler-co.ru
Mon May 19 12:16:19 MSD 2008


On Mon, May 19, 2008 at 04:16:22AM +0300, Gena Makhomed wrote:

> Здравствуйте, All.
> 
> =======================================================================
> 
> один глюк неприятный заметил, практически во всех сборках nginx
> под linux - команда service nginx restart срабатывает через раз:
> 
> restart() {
>     configtest || return $?
>     stop
>     start
> }
> 
> подозреваю, что причина здесь в том, что старый nginx еще не успел
> завершиться, а новый не сможет нормально стартануть пока не завершен
> старый. как workaround помогает вставить sleep 1|2|3 между stop и start.
> но мне этот вариант не очень нравится. или это единственное,
> что можно сделать в этой ситуации? такая ошибка проявляется
> в nginx из fedora/epel, ищу как лучше всего ее пофиксить.

Во время старта nginx пытается 5 раз при'bind'иться к listen-сокетам
с интервалом в полсекунды. Так что задержка в 2.5с уже есть.
А вообще, после stop нужно проверять наличие pid-файла.

> =======================================================================
> 
> кстати, в каких случаях вместо "service nginx restart"
> можно использовать "service nginx reload" ?
> 
> reload() {
>     configtest || return $?
>     echo -n $"Reloading $prog: "
>     killproc $nginx -HUP
>     RETVAL=$?
>     echo
> }
> 
> и в каких случаях обязательно нужно делать полный restart ?
> 
> =======================================================================
> 
> вот такой код в init-скрипте
> 
> force_reload() {
>     restart
> }
> 
> говорит о том, что force_reload всегда идентично restart.
> если бы "service nginx restart" было бы всегда идентично
> "service nginx reload", то init-скрипт выглядел бы так:

Это неправильно. nginx умеет полноценный reload без прерывания
в обслуживании клиентов.

> restart() {
>     reload
> }
> 
> но если nginx вообще не запущен, то в теперешней реализации
> сервиса "service nginx restart" приведет к его запуску,
> а "service nginx reload" - нет. кроме того, обновление
> пакета nginx в fedora/epel реализовано через condrestart:
> 
> %postun
> if [ $1 -ge 1 ]; then
>     /sbin/service %{name} condrestart > /dev/null 2>&1 || :
> fi
> 
>   condrestart|try-restart)
>         [ ! -f $lockfile ] || restart
>         ;;
>         
> =======================================================================
> 
> -- 
> С уважением,
>  Gena                          mailto:gmm at csdoc.com
> 

-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list