РЭДЛАЙН
Лучшие решения для Вас и Вашего бизнеса!
На нашем сайте вы можете получить информацию о веб-разработке, обслуживании и продвижении сайта. Интернет-маркетинге. SEO (поисковой оптимизации). Контекстной и медийной рекламе в Интернете. SMM. Регистрации доменов и хостинговых услугах. И современном дизайне сайтов. Вообщем того что касается веб-разработки, а также много другой полезной информации из мира интернета, бизнеса и интернет-технологий...
Создаем доступные и современные сайты, которые работают! Обслуживаем и эффективно продвигаем интернет-проекты с 2006 года!
Главная Web-мастеру Запуск демона приложения через systemd


Запуск демона приложения через systemd

Серверные приложения, написанные, к примеру, на nodejs или на python, держат всегда запущенными. Если приложение вдруг упало, нужно его переподнять.

Кто-то запускает приложения через supervisor (написан на python) или pm2 (nodejs) - это такие демоны как раз для запуска приложений. Но на вашем сервере скорее всего уже есть systemd, который тоже умеет это делать. Зачем тогда устанавливать и настраивать supervisor или pm2?

Я не говорю о больших энтерпрайз-решениях, там свои инструменты для таких задач. Я говорю о небольших или хобби-проектах.

Рассмотрю запуск nodejs-приложения через systemd. Расскажу про перезапуск, ограничение прав и сбор логов.

Для примера попробую запустить такое приложение, написанное на nodejs:


const http = require('http');

// Get MYAPP_PORT from environment variable
const MYAPP_PORT = process.env.MYAPP_PORT;

http.createServer((req, res) => {
        if (req.url === '/kill') {
            // App die on uncaught error and print stack trace to stderr
            throw new Error('Someone kills me');
        }

        if (req.method === 'POST') {
            // App print this message to stderr, but is still alive
            console.error(`Error: Request ${req.method} ${req.url}`);

            res.writeHead(405, { 'Content-Type': 'text/plain' });
            res.end('405 Method Not Allowed');

            return;
        }

        // App print this message to stdout
        console.log(`Request ${req.method} ${req.url}`);

        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('200 OK');
    })
    .listen(MYAPP_PORT);

Этот скрипт запускает веб-сервер. Он слушает порт, который задан в переменной окружения MYAPP_PORT. Запущу приложение, чтобы проверить:


    MYAPP_PORT=3000 node index.js

Приложение на все гет-запросы отвечает «200 OK»:


    curl 'http://localhost:3000'

На пост-запросы отвечает «405 Method Not Allowed»:


    curl -X POST 'http://localhost:3000'

И при запросе /kill вообще умирает:


    curl 'http://localhost:3000/kill'

Сервис-юнит

Systemd оперирует понятиями юнитов. Юнитом может быть процесс-демон, устройство, или даже список других юнитов. В руководстве man systemd в секции «Concepts» описано, какие есть типы юнитов, и для чего они нужны.

Мне понадобится самый первый — Service unit. Он позволяет запустить процесс в режиме демона и перезапускать процесс, если он упал. В руководстве man systemd.unit описано, как писать юниты в целом, а в man systemd.service — как писать сервис-юниты.

Файлы своих юнитов нужно класть в /etc/systemd/system/. Я назову свой /etc/systemd/system/myapp.service. Минимальная конфигурация для сервиса может быть такая:


    [Service]
    Environment=MYAPP_PORT=3000
    ExecStart=/usr/local/bin/node /usr/local/www/myapp/index.js

В поле Environment нужные приложению переменные окружения. В ExecStart команда для запуска приложения. /usr/local/bin/node — это полный путь к nodejs, его можно узнать командой:


    which node

А /usr/local/www/myapp/index.js — полный путь к моему приложению.

Пробую запустить сервис:


    sudo systemctl start myapp.service

Проверю статус:


    sudo systemctl status myapp.service

    ● myapp.service
    Loaded: loaded (/etc/systemd/system/myapp.service; static; vendor preset: enabled)
    Active: active (running) since Fri 2017-08-04 21:50:14 MSK; 5s ago
    Main PID: 3815 (node)
        Tasks: 6
    Memory: 7.7M
        CPU: 80ms
    CGroup: /system.slice/myapp.service
            └─3815 /usr/local/bin/node /usr/local/www/myapp/index.js

    Aug 04 21:50:14 ubuntu16 systemd[1]: Started myapp.service.

Ну типа работает. Дёрну курлом, чтобы проверить:


    curl 'http://localhost:3000/'
    200 OK

Действительно, работает.

Автоматический перезапуск

Если приложение по какой-то причине умрёт, то оно не поднимется. Вот я дёргаю убивающий эндпойнт:


    curl 'http://localhost:3000/kill'
    curl: (52) Empty reply from server

И проверяю статус приложения:


    sudo systemctl status myapp.service
    ● myapp.service
       Loaded: loaded (/etc/systemd/system/myapp.service; static; vendor preset: enabled)
       Active: failed (Result: exit-code) since Fri 2017-08-04 21:51:46 MSK; 5s ago
      Process: 3815 ExecStart=/usr/local/bin/node /usr/local/www/myapp/index.js (code=exited, status=1/FA
    Main PID: 3815 (code=exited, status=1/FAILURE)

    Aug 04 21:51:46 ubuntu16 node[3815]:             ^
    Aug 04 21:51:46 ubuntu16 node[3815]: Error: Someone kills me
    Aug 04 21:51:46 ubuntu16 node[3815]:     at Server.http.createServer (/usr/local/www/myapp/index.js:1
    Aug 04 21:51:46 ubuntu16 node[3815]:     at emitTwo (events.js:106:13)
    Aug 04 21:51:46 ubuntu16 node[3815]:     at Server.emit (events.js:191:7)
    Aug 04 21:51:46 ubuntu16 node[3815]:     at HTTPParser.parserOnIncoming [as onIncoming] (_http_server
    Aug 04 21:51:46 ubuntu16 node[3815]:     at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23
    Aug 04 21:51:46 ubuntu16 systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILUR
    Aug 04 21:51:46 ubuntu16 systemd[1]: myapp.service: Unit entered failed state.
    Aug 04 21:51:46 ubuntu16 systemd[1]: myapp.service: Failed with result 'exit-code'.

Чтобы systemd переподнимал упавшее приложение, нужно добавить опцию Restart. У неё есть несколько значений, подробно описанных в man systemd.service. Значение always будет в любой ситуации перезапускать приложение:


    [Service]
    Environment=MYAPP_PORT=3000
    ExecStart=/usr/local/bin/node /usr/local/www/myapp/index.js
    Restart=always

Когда изменили файл юнита, надо заставлять systemd перечитать его, чтобы он использовал уже новый файл:


    sudo systemctl daemon-reload

Снова запущу сервис, дёрну убивающую ручку и проверю, переподнимется ли приложение:


    sudo systemctl start myapp.service

    curl 'http://localhost:3000/kill'
    curl: (52) Empty reply from server

    curl 'http://localhost:3000/'
    200 OK

    curl 'http://localhost:3000/kill'
    curl: (52) Empty reply from server

    curl 'http://localhost:3000/'
    200 OK

Ну вот. Теперь упавший процесс переподнимается.

Ограничение прав

Пользователя и группу, от имени которых будет запущен процесс, можно установить переменными User и Group:


    [Service]
    Environment=MYAPP_PORT=3000
    User=www-data
    Group=www-data
    ExecStart=/usr/local/bin/node /usr/local/www/myapp/index.js
    Restart=always

Запись и просмотр логов

Здорово, если ваше приложение пишет логи в файлы. Но если оно пишет в стандартный вывод, то через systemd можно собирать эти записи. По умолчанию они и так куда-то собираются. Куда именно — зависит от ваших настроек. У меня например на Ubuntu 16.04 они сливаются в журнал systemd, и посмотреть их можно вот так:


    journalctl -u myapp.service

или в файле /var/log/syslog.

Можно сделать, чтобы systemd направлял вывод процесса в syslog, и написать правила обработки логов для него. Например сливать их на сервер-агрегатор логов или просто писать в файлы.


    [Service]
    Environment=MYAPP_PORT=3000
    User=www-data
    Group=www-data
    ExecStart=/usr/local/bin/node /usr/local/www/myapp/index.js
    Restart=always
    # Отправка логов syslog
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=myapp

Опции StandardOutput и StandardError определяют, куда писать вывод приложения. Возможные значения этих опций вы можете посмотреть в man systemd.exec. SyslogIdentifier собственно задаёт имя сервиса для syslog. Кстати, при отправке логов в syslog, в журнал systemd они тоже будут писаться, так что можно по-прежнему читать их с помощью journalctl.

Ну так вот, в syslog можно настроить правила обработки логов от вашего приложения. У меня в качестве syslog-демона rsyslog. Его настройки лежат в /etc/rsyslog.d/. Создаю файл /etc/rsyslog.d/100-myapp.conf с таким содержимым:


    $RepeatedMsgReduction off
    if $programname == 'myapp' then -/var/log/myapp/debug.log

$RepeatedMsgReduction off нужно, чтобы syslog несколько одинаковых сообщений не схлопывал в одно.

Systemd не умеет слать stdout и stderr в syslog с разным уровнем severity, поэтому в такой конфигурации нельзя писать stdout в один файл, а stderr в другой.

Можно направить stdoud процесса в логгер (утилита для записи в syslog) пайпом, а stderr слать через systemd:


    [Service]
    Environment=MYAPP_PORT=3000
    User=www-data
    Group=www-data
    # пайпим stdout в logger с тегом myapp
    ExecStart=/bin/sh -c '/usr/local/bin/node /usr/local/www/myapp/index.js | logger --tag myapp'
    # stder шлём в syslog средствами systemd
    StandardError=syslog
    SyslogIdentifier=myapp
    # устанавливаем уровень логирования: err
    SyslogLevel=err
    Restart=always

И настроить в syslog правила для записи в разные файлы:


    $RepeatedMsgReduction off
    if $programname == 'myapp' and $syslogseverity < 5 then -/var/log/myapp/error.log
    if $programname == 'myapp' and $syslogseverity >= 5 then -/var/log/myapp/debug.log

Кроме записи в файлы, можно конечно и на сервер-агрегатор слать.

Если вы пишете логи в файлы, не забудьте настроить logrotate. Пример файла конфигурации /etc/logrotate.d/myapp:


    /var/log/myapp/debug.log
    /var/log/myapp/error.log {
            rotate 7
            daily
            compress
            missingok
            notifempt
            postrotate
                    invoke-rc.d rsyslog rotate > /dev/null
            endscript
    }

Самое главное тут — скрипт postrotate, который заставляет rsyslog переоткрыть файл после ротации. Подробности про настройку logrotate можно прочитать в man logrotate.conf

Вот так, с помощью нехитрых приспособлений приложение на nodejs (или на python) можно превратить в демон, который поднимется после падения, и логи которого нормально сохраняются и ротируются.

Источник - https://isqua.ru/blog/2020/05/25/nodejs-systemd/

Запуск демона приложения через systemd | | 2024-07-10 08:12:13 | | Статьи Web-мастеру | | Серверные приложения, написанные, к примеру, на nodejs или на python, держат всегда запущенными. Если приложение вдруг упало, нужно его переподнять. | systemd |
 
Дайджест новых статей по интернет-маркетингу на ваш email
Подписаться

Продающие сайты "под ключ"!

Наши сайты зарабытывают вам деньги. Landing-page. Эффективные продающие сайты точно в срок и под ключ! Всего от 28300 рублей
Подробнее...

Интернет-магазины и каталоги "под ключ"!

Эффективные и удобные инструменты торговли (электронной торговли) "под ключ". Продают, даже когда вы спите! Всего от 52700 рублей
Подробнее...

Комплексный интернет-маркетинг и продвижение сайтов

Максимальную эффективность дает не какой-то конкретный метод, а их комбинация. Комбинация таких методов и называется комплексным интернет-маркетингом. Всего от 10000 рублей в месяц
Подробнее...

Реклама в Yandex и Google

Контекстная реклама нацелена лишь на тех пользователей, которые непосредственно заинтересованы в рекламе Ваших услуг или товаров. Всего от 10000 рублей в месяц
Подробнее...

Social media marketing (SMM) — продвижение в социальных медиа

Реклама в VK, Однокласcниках и на Mail.ru Создание, ведение и раскрутка групп и реклама ВКонтакте и Facebook. Всего от 10000 рублей в месяц
Подробнее...

Приглашаем к сотрудничеству рекламные агентства и веб-студии!

Внимание Акция! Приглашаем к сотрудничеству рекламные агентства и различные веб-студии России! Индивидуальные и взаимовыгодные условия сотрудничества.
Подробнее...

Ускоренная разработка любого сайта от 5 дней!

Внимание Акция! Ускоренная разработка любого сайта! Ваш сайт будет готов за 5-10 дней. Вы можете заказать разработку любого сайта "под ключ" за 5-10 рабочих дней, с доплатой всего 30% от его стоимости!
Подробнее...

Ждем новых друзей!

Внимание Акция! Ждем новых друзей! Скидка 10% на услуги по созданию и(или) обслуживанию вашего сайта при переходе к нам от другого разработчика.
Подробнее...

Приведи друга и получи скидку!

Внимание Акция! Приведи друга и получи скидку! Скидка 10% на услуги по созданию и(или) обслуживанию вашего сайта, если клиент заказавший наши услуги, пришел по Вашей рекомендации.
Подробнее...

1 2 3 4 5 6 7 8 9

Новые статьи и публикации



Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!

Качественное и объемное представление своего бизнеса в Сети требуется любой растущей коммерческой структуре, стремящейся увеличить продажи, именно по этой причине среди наших клиентов как крупные так и небольшие компании во многих городах России и ближнего зарубежья.
Как мы работаем

Заявка
Позвоните или оставьте заявку на сайте.


Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!


Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.


Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.


Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.

Остались еще вопросы? Просто позвоните и задайте их специалистам
с 2:30 до 11:30 по Мск, звонок бесплатный
Или напишите нам в WhatsApp
с 9:30 до 18:30 по Хабаровску
Или напишите нам в WhatsApp
Веб-студия и агентство комплексного интернет-маркетинга «РЭДЛАЙН» © 2006 - 2024

Профессиональная Веб-разработка. Создание сайтов и магазинов "под ключ" , а также по всей России и зарубежью. Продвижение и реклама. Веб-дизайн. Приложения. Сопровождение. Модернизация. Интеграции. Консалтинг. Продвижение и реклама. Комплексный Интернет-маркетинг.

Оставьте заявку / Задайте вопрос

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Заказать услугу

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Обратный звонок

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Подписка на дайджест новостей

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Заказать услуги со скидкой \ Бесплатная консультация







КАКИЕ УСЛУГИ ВАС ИНТЕРЕСУЮТ?

КАКИЕ ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ ПОТРЕБУЮТСЯ?

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Высококачественные сайты по доступным ценамМы создаем практически любые сайты от продающих страниц до сложных, высоконагруженных и нестандартных веб приложений! Наши сайты это надежные маркетинговые инструменты для успеха Вашего бизнеса и увеличения вашей прибыли! Мы делаем красивые и максимально эффектные сайты по доступным ценам уже много лет!

Что нужно сделать, чтобы заказать создание сайта у нас?

Ну для начала вам нужно представлять (хотя бы в общих чертах), что вы хотите получить от сайта и возможно каким вы хотите его видеть. А дальше все просто. Позвоните нам или оставьте заявку нашим менеджерам, чтобы они связались с Вами, проконсультировали и помогли определиться с подходящим именно Вам сайтом по цене, сроку, дизайну или функционалу. Если вы все ещё не уверены, какой сайт вам нужен, просто обратитесь к нам! Мы вместе проанализируем вашу ситуацию и определим максимально эффективный для вас вариант.

Быстрый заказ \ Консультация

Для всех тарифных планов на создание и размещение сайтов включено:

Комплексная раскрутка сайтов и продвижение сайта Комплексный подход это не просто продвижение сайта, это целый комплекс мероприятий, который определяется целями и задачами поставленными перед сайтом и организацией, которая за этим стоит. Время однобоких методов в продвижении сайтов уже прошло, конкуренция слишком высока, чтобы была возможность расслабиться и получать \ удерживать клиентов из Интернета, просто сделав сайт и не занимаясь им...

Комплексная раскрутка работает в рамках стратегии развития вашего бизнеса в сети и направлена

Быстрый заказ \ Консультация

ЭФФЕКТИВНОЕ СОПРОВОЖДЕНИЕ (ПОДДЕРЖКА, ОБСЛУЖИВАНИЕ) САЙТОВ

Полный комплекс услуг по сопровождению сайтаМы оказываем полный комплекс услуг по сопровождению сайта: информационному и техническому обслуживанию и развитию Интернет сайтов.

Передав свой сайт для поддержки в руки наших специалистов, Вы избавитесь от проблем, связанных с обновлением информации и контролем за работой ресурса.

Наша компания осуществляет техническую и информационную поддержку уже имеющихся сайтов. В понятие «поддержка сайтов» также входят услуги администрирования сайтов, обновления сайтов и их модернизация.

Быстрый заказ \ Консультация

Редизайн сайта и Адаптивный веб дизайн

Современный, технологичный, кроссбраузерный ... Профессиональный дизайн сайтов и веб-приложений

Редизайн сайта — создание нового дизайна сайта с целью улучшения внешнего вида, функциональности и удобства использования. Редизайн сайта – это способ преобразовать проект к извлечению из него максимальной отдачи и средств. В современном мире задачами редизайна является поднятие существующего сайта на новый уровень для внедрения новых технологий, при этом сохраняя многолетний сформировавшийся опыт и успешные решения компаний.

Адаптивный дизайн сайтов и веб-приложений

Все больше людей пользуются мобильными устройствами (телефонами, планшетами и прочими) для посещения Интернета, это не для кого уже не новость. Количество таких людей в процентном отношении будет только больше с каждым годом, потому что это удобно и по многим другим причинам.

На сегодняшний день адаптивный дизайн является стандартным подходом при разработке новых сайтов (или веб-приложений) и в идеале ваш сайт должен смотреться и функционировать так, как вы задумывали, на всём разнообразии устройств.

Быстрый заказ \ Консультация

Контекстная реклама в Яндекс и GoogleКонтекстная реклама - это эффективный инструмент в интернет маркетинге, целью которого является увеличение продаж. Главный плюс контекстной рекламы заключается в том, что она работает избирательно.

Реклама в поисковых системах Яндекс и Google. Профессиональная настройка рекламы и отслеживание эффективности!

Рекламные объявления показываются именно тем пользователям, которые ищут информацию о Ваших товарах или услугах, поэтому такая реклама не является навязчивой и раздражающей в отличие от других видов рекламы, с которыми мы сталкиваемся на телевидении или радио. Контекстная реклама нацелена лишь на тех пользователей, которые непосредственно заинтересованы в рекламе Ваших услуг или товаров.

Быстрый заказ \ Консультация

Скидка

1500 руб.
Заинтересовались услугами создания, обслуживания или продвижения вашей компании в Интернете?!
Получите 1500 руб.
за он-лайн заявку
Предложение ограничено.

После получения заявки с Вами свяжутся наши специалисты и уточнят все детали по интересующей вас услуге.
«Нажимая на кнопку "Получить скидку", я даю согласие на обработку персональных данных»
×
Получите 1500 рублей!
×
×