ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bugreport] nginx -t возвращает 0 ко д завершения при наличии ошибок в конфиге


  • To: nginx-ru@xxxxxxxxx
  • Subject: [bugreport] nginx -t возвращает 0 ко д завершения при наличии ошибок в конфиге
  • From: Gena Makhomed <gmm@xxxxxxxxx>
  • Date: Fri, 06 Aug 2010 01:46:01 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=csdoc.com; s=dkim; t=1281048361; bh=VTSQnEq21coAs+4PBWQHEAvN9ci3WiTxGQUlHSnJ+hA=; h=Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Content-Transfer-Encoding; b=PTrlBQr7T3eAR/rU0vC1UQsm DXM466BSe2l73hC6HzZC2zybOE7Os9XObrC60F+MQnyiC16IEgovITcAnL3z4+FUs9B WpO+SEC7ZR0bgE1GofeqFlaeo+o2HHbS/1iDlgQmYF9kJOecGnOQtWBIqr6KSczzCws BSwGYPCZpzrhA=

Здравствуйте!

случайно сделал несколько ошибок в конфиге,
но nginx -t вернул 0 код завершения:

# nginx -t ; echo $?
[warn]: conflicting server name "example.com" on ip:80, ignored
[warn]: conflicting server name "*.example.com" on ip:80, ignored
the configuration file /etc/nginx/conf/nginx.conf syntax is ok
configuration file /etc/nginx/conf/nginx.conf test is successful
0

ожидаемое поведение:

возвращать 0 код завершения только в случае отсутствия ошибок.

почему/зачем это так важно:

в init-скрипте для Fedora/CentOS я сделал две функции:

configtest() {
  $binary -t -c $config -g "pid $pidfile;"
}

configtest_q() {
    configtest >/dev/null 2>&1
}

и все потенциально опасные операции
( reload, online_upgrade, restart )
защитил таким образом:

restart() {
    configtest_q || configtest || return 6
    stop
    start
}

reload() {
    configtest_q || configtest || return 6
    echo -n $"Reloading $instance: "
    killproc -p $pidfile $instance -HUP
}

в результате при выполнении service nginx reload
нет возможности узнать что в конфиге nginx
есть какие-то ошибки:

# service nginx reload
Reloading nginx:                                           [  OK  ]
#

хотя они там есть:

# nginx -t ; echo $?
[warn]: conflicting server name "example.com" on ip:80, ignored
[warn]: conflicting server name "*.example.com" on ip:80, ignored
the configuration file /etc/nginx/conf/nginx.conf syntax is ok
configuration file /etc/nginx/conf/nginx.conf test is successful
0
#

в данном случае "conflicting server name" - это ведь ошибка, а не warn.

warn - это например, напоминание о том, что параметр default
в директиве listen уже deprecated и будет removed в новых версиях.

а "критическая ошибка" - то, что делает невозможным запуск nginx.

"conflicting server name" - это что-то между [warn] и [critical].

возможно имеет смысл добавить параметр -Werror для -t
чтобы все возможные предупреждения считать ошибками,
если ненулевой код возврата будет возвращаться только для ошибок.

хотя лучше возвращать 0 только при полном отсутствиии
и ошибок и предупреждений при выполнении nginx -t

если будет возврат 0 кода завершения в случае ошибок/предупреждений
то придется парсить вывод nginx -t на предмет того, есть ли там лишние
строки кроме двух последних, где прямо говорится о том, что проблем нет:

[warn]: conflicting server name "example.com" on ip:80, ignored
[warn]: conflicting server name "*.example.com" on ip:80, ignored
the configuration file /etc/nginx/conf/nginx.conf syntax is ok
configuration file /etc/nginx/conf/nginx.conf test is successful

P.S.

баг-трекера нет, емейл может потеряться, поэтому пишу в рассылку.

--
Best regards,
 Gena


_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.