Запуск nginx в NetBSD с помощью daemontools
Создаём каталог сервиса /service/.nginx/:
# mkdir -p /service/.nginx/
Создадим внутри каталога сервиса файл run
со следующим содержимым:
#!/bin/sh
exec 2>&1
if [ ! -f /usr/pkg/etc/nginx/nginx.conf ]
then
echo "Missing /usr/pkg/etc/nginx/nginx.conf"
exit 1
fi
exec \
softlimit -o 2048 \
/usr/pkg/sbin/nginx -g "daemon off; error_log stderr warn;" -c /usr/pkg/etc/nginx/nginx.conf
И сделаем его исполняемым:
# chmod +x /service/.nginx/run
Создадим каталог /service/.nginx/log/
:
# mkdir /service/.nginx/log/
Создадим внутри него скрипт run
со следующим содержимым:
#!/bin/sh
exec \
setuidgid multilog \
multilog t /var/log/nginx/error
И сделаем его исполняемым:
# chmod +x /service/.nginx/log/run
Теперь создадим каталог /var/log/nginx
, в котором multilog
будет вести журналы работы сервиса:
# mkdir /var/log/nginx/error/
Установим пользователя и группу multilog
владельцами этого каталога:
# chown multilog:multilog /var/log/nginx/error/
Остановим nginx
, если он уже запущен с помощью скрипта /etc/rc.d/nginx
:
# /etc/rc.d/nginx stop
Запустим сервис:
# mv /service/.nginx /service/nginx
В такой конфигурации через multilog
пропускается только журнал ошибок, но хотелось бы через него пропускать ещё и журнал доступа. Для этого в nginx
настроим запись журналов в именованный канал и настроим ещё один сервис, который назовём nginx-access
, который будет читать строки из этого канала. Если нужно, например, писать для разных доменов отдельные журналы доступа, таких сервисов можно настроить несколько.
Создаём каталог сервиса /service/.nginx-access/
:
# mkdir -p /service/.nginx-access/
Создадим внутри каталога сервиса файл run
со следующим содержимым:
#!/bin/sh
exec \
setuidgid multilog \
multilog t /var/log/nginx/access/ < /var/log/nginx/access.pipe
И сделаем его исполняемым:
# chmod +x /service/.nginx-access/run
Создадим именованный канал, в который nginx будет писать журналы доступа:
# mkfifo /var/log/nginx/access.pipe
И поменяем его владельца и группу владельца на nginx
:
# chown nginx:nginx /var/log/nginx/access.pipe
Теперь создадим каталог /var/log/nginx/access
, в котором multilog
будет вести журналы доступа:
# mkdir /var/log/nginx/access/
Установим пользователя и группу multilog
владельцами этого каталога:
# chown multilog:multilog /var/log/nginx/access/
Запустим новый сервис:
# mv /service/.nginx-access /service/nginx-access
Теперь нужно прописать в файле конфигурации /usr/pkg/etc/nginx/nginx.conf
вместо имени файла журнала имя именованного канала:
access_log /var/log/nginx/access.pipe;
Осталось только сообщить nginx
, чтобы он перечитал свой файл конфигурации и начал писать журнал в новый файл:
# svc -h /service/nginx
Совместимость с rc
Для совместимости с системой инициализации /etc/rc
создадим скрипт /etc/rc.d/nginx
со следующим содержимым:
#!/bin/sh
# REQUIRE: DAEMON
# PROVIDE: nginx
if [ -f /etc/rc.subr ]; then
. /etc/rc.subr
fi
name=nginx
rcvar=$name
load_rc_config $name
if checkyesno $rcvar ; then
rm -f /service/$name/down
else
touch /service/$name/down
fi
status_cmd="/usr/pkg/bin/svstat /service/$name/ | sed -e 's,^/service/\(.*\)/: up (\(pid .*\)).*$,\1 is running as \2.,g; s,^/service/\(.*\)/: down .*,\1 is not running.,g'"
start_cmd="/usr/pkg/bin/svc -u /service/${name}_access/ ; /usr/pkg/bin/svc -u /service/$name/ ; echo 'Starting $name.'"
stop_cmd="/usr/pkg/bin/svc -d /service/$name/ ; /usr/pkg/bin/svc -d /service/${name}_access/ ; echo 'Stopping $name.'"
restart_cmd="/usr/pkg/bin/svc -du /service/$name/ ; echo 'Restarting $name.'"
reload_cmd="/usr/pkg/bin/svc -h /service/$name ; echo 'Reloading $name.'"
test_cmd="/usr/pkg/bin/nginx -t -c /usr/pkg/etc/nginx.conf"
extra_commands="status reload test"
run_rc_command "$1"
После создания файла нужно добавить права на его выполнение:
# chmod +x /etc/rc.d/nginx
Теперь можно будет включать и выключать сервис nginx
привычным образом через переменную nginx
в файле /etc/rc.conf
, а также запускать, останавливать, перезапускать, проверять состояние сервиса, проверять файл конфигурации и перезагружать сервис без перерыва в работе с помощью скрипта /etc/rc.d/nginx
.