Пока разбираюсь с тем что творится в жизни и душе, оставлю несколько заметок по поднятию (и удержанию) сервера node.js на centos. Благо тема лично для меня интересная и несколько познавательная.
Итак, приступим.
Первым делом конечно же надо получить сам сервер. К сожалению в репозитории epel на данный момент валяется довольно старая версия, тогда как мне понадобилась новенькая, свежая, только с сайта разработчика. Поэтому отставить yum install! (:
Качаем ноду:
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
Для дистрибутива CentOS берем ссылку Linux binaries (x64) и первое что бросается в глаза, что за .хз
Распаковать такой форматик обычной командой не получится, поэтому делаем
unxz node-v10.15.3-linux-x64.tar.xz tar --strip-components 1 -xvf node-v* -C /usr/local
Если с первой командой фейл, то надо поставить пакет xz. Что вполне логично. Вторая команда распаковывает получившийся tar, обрезая информацию о версии, сразу в путь где будет жить сервер ноды.
Проверяем всё ли работает:
node --version
Следующим шагом будет установка менеджера пакетов. Кому-то по-вкусу npm, но мне понадобился yarn. Его и будем ставить. Опять же есть вариант с добавлением официального репозитория, но у него в зависимостях старая версия ноды.
Поэтому… идем на гетхуб и качаем актуалочку.
wget https://github.com/yarnpkg/yarn/releases/download/v1.21.1/yarn-1.21.1-1.noarch.rpm rpm -i --nodeps yarn-1.21.1-1.noarch.rpm rpm -U --nodeps yarn-1.21.1-1.noarch.rpm // для обновления
Качаем пакет и устанавливаем минуя проверку зависимостей (нода у нас уже стоит).
Проверяем:
yarn --version
Ну и в качестве бонуса информация или правильнее сказать подводные камушки как это всё крутить в виде сервера и с приложением.
Для начала, приложение. Ставим необходимое, настраиваем по вкусу, проверяем работу в ручном режиме.
/path_to_app/node yourapp.js
Если всё работает как надо, добавляем в начало yourapp.js строку
#!/usr/bin/env node
и делаем файл исполняемым (об этом умалчивает часть руководств). Дополнительно я рекомендую создать отдельного пользователя на котором будет крутиться нода и запускать всё от его имени (об этом чуть ниже).
chmod +x yourapp.js chown -R nodeuser:nodegroup /path_to_app/
А теперь, самое интересное. Пока что нода работает только вызовом команды, и это не здорово! Это же сервер! Поэтому надо сделать ноду демоном и отправить на службу. )))
Для этого создаем файл описания сервиса нашего приложения:
touch /usr/lib/systemd/system/yourapp.service
со следующим содержимым
[Unit] Description=Your best app After=network.target [Service] ExecStart=/path_to_app/yourapp.js Restart=always StandardOutput=syslog StandardError=syslog TimeoutSec=90 SyslogIdentifier=yourapp User=nodeuser Group=nodegroup Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/path_to_app [Install] WantedBy=multi-user.target
После чего сервис будет доступен для управления. В случае неполадок, либо после изменения файла, обновляем список демонов командой systemctl daemon-reload
Поехали! systemctl start yourapp
Если всё запускается и работает, новую службу можно смело добавлять в автозагрузку.
systemctl enabe yourapp
Дополнительно можно вынести лог сервиса в отдельный файл. Для этого создаем файл /etc/rsyslog.d/yourapp.conf со следующим содержанием:
if $programname == 'yourapp' then /var/log/yourapp/logfile.log & stop
Перезапускаем сервис и наслаждаемся systemctl restart rsyslog