Как обнулить время простоя перезагрузить сервер nginx
Как отправить сигнал HUP и нулевое время простоя перезапустить сервер nginx с помощью файла Node.js
2 ответа
Вам нужно три вещи:
PID вашего сервера nginx. Хранится в:
/var/run/nginx.pid
Команда для отправки
SIGHUP
(1
) к процессу с этим PID:kill -1 $(cat /var/run/nginx.pid)
Способ для node.js отправить
kill
, Я бы пошел с детским процессом.
Я не разработчик Node. У меня нет способа соединить их во что-то, что имеет смысл, но это то, что вы бы сделали, если бы знали, что делаете.
Да, и ваш сервер nginx и приложение Node.JS должны работать под одним и тем же пользователем, чтобы позволить Node отправлять сигнал. Это довольно легко сделать, но может иметь последствия для безопасности. Вместо этого вы можете захотеть создать SUID-сценарий для вызова Node, но если сделать это небрежно, это также может иметь последствия для безопасности.
В качестве альтернативы, вы можете использовать process
модуль для запуска process.kill(...)
, Вам все равно нужно будет прочитать PID для nginx, а разрешения все равно нужно отсортировать.
Примерно так (опять же, я все еще не разработчик Node, так что это может быть синтаксически некорректно):
var fs = require('fs'),
process = require('process');
process.kill(fs.readFileSync('/var/run/nginx.pid', "utf8"), 'SIGHUP');
- создать файл внутри
/etc/sudoers.d/
, Назовите это reload-nginx - Поместите следующее со следующими строками внутри reload-nginx.
%dev
это группа пользователей из нескольких пользователей, которые хотят перезагрузить nginx. Вы также можете ограничить эту привилегию для одного пользователя
%dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx.service
%dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx
Как только это будет сделано, любой, кто принадлежит к %dev
группа сможет перезагрузить nginx без ввода пароля. Вы можете немедленно проверить это из командной строки.
Добавьте записи для пользователя, под которым будет запускаться nodejs, а затем используйте nodejs child_process
модуль для вызова команд оболочки Unix, таких как sudo systemctl reload nginx
, Это должно сделать свое дело.