глобальные директивы error_log и pid
Gena Makhomed
gmm на csdoc.com
Сб Ноя 13 18:51:42 MSK 2010
*** ответ на сообщение из англоязычного списка рассылки
On 13.11.2010 16:51, Maxim Dounin wrote in nginx at nginx.org list:
>> Ideally I would like Nginx to always write to the error log file as
>> specified in the config, and never to the default error log file,
>> but it seems that the codebase does not allow this
>> and assumes logging facilities to be available
>> even before the config file is loaded.
> Writing early errors to error_log as specified in config is not
> possible as we haven't (yet) parsed the config.
это можно так сделать, чтобы писать early errors
только в тот error_log, который указан в конфиге.
> It would be good to have something like '-e' switch instead,
> similar to '-p' for prefix (actually, I even have it in my TODO
> since 0.7.53, but ENOTIME).
примерно так сейчас Apache и делает:
# httpd -h 2>&1 | grep error
-e level : show startup errors of level (see LogLevel)
-E file : log startup errors to file
но это не очень красивое решение, потому что инофрмация тут дублируется,
да и с pid-файлом будут аналогичные проблемы, тогда еще один ключ надо?
я придумал более красивое решение:
1. nginx определяет имя конфигурационного файла из параметра -с
или используется built-in значение, если ключ -c не определен.
2. вызывается helper-функция, которая парсит конфигурационный файл,
считывая только несколько глобальных директив: error_log и pid,
если эти две директивы встретились в конфиге, парсинг прекращается.
директива include также игнорируется, как и возможные ошибки разбора.
3. устанавливаются значения для error_log и pid,
если их нет в конфиге - тогда используются built-in значения.
4. дальше обработка конфиг-файла продолжается как и раньше.
5. добавляется всего один параметр командной строки -G
-G directive : get global directive from configuration file
это необходимо для того, чтобы можно было seamless использовать
один бинарник nginx для запуска нескольких независимых instances:
pidfile=`nginx -G pid`
и дальше init-script знает, какой pid file отвечает этому экземпляру.
причем, вся конфигурация nginx находится только в одном месте - конфиге.
если в init-скрипте явно не указывать pid мастер-процесса,
то в Linux функция killproc будет искать процесс по имени
бинарника и будет посылать сигнал всем экземплярам nginx,
до которых только сможет дотянуться - я по этим граблям
уже прошелся. других вариантов кроме явного указания
"killproc -p $pidfile $instance" - просто нет.
не хотелось бы в nginx клонировать старые идеи и методы из apache,
тем более, что nginx ведь можно сделать гораздо лучше и красивее.
аналогично, практически ENOTIME, чтобы в спокойной
обстановке заняться программированием этой feature.
но раз уж эта тема обсуждается в списках рассылки,
- вот мой вариант решения проблемы с error_log и pid.
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru