[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