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

Gena Makhomed gmm на csdoc.com
Пт Авг 6 02:46:01 MSD 2010


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

случайно сделал несколько ошибок в конфиге,
но 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