Справочная информация >> Инструкции по аккаунту >> Установка и настройка Node.js


Установка и настройка Node.js

Если вы используете Node.js как средство серверной разработки для своего сайта или web-приложения, то эта статья для вас, поскольку в ней мы рассмотрим настройку данной программной платформы и правильную организацию структуры папок для корректного функ­цио­ни­ро­ва­ния вашего проекта.

Для начала вам необходимо установить Node.js на свой аккаунт. Скачать любую версию Node.js можно с официального репозитория https://nodejs.org/dist/. На момент написания данного руководства, последним релизом являлась версия v10.6.0, скачать её можно здесь.

Выбирать нужно версию для Linux, битность x64, архиватор GZIP. Скачиваем файл https://nodejs.org/dist/v10.6.0/node-v10.6.0-linux-x64.tar.gz

Для нужной версии вы сможете также установить и необходимые модули (см. ниже).

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

Рассмотрим структуру папок и файлов. Мы предлагаем реализовать ее примерно следующим образом:

  • site-name.com (корневая папка вашего сайта)
  • htdocs
  • www

     .htaccess

  • nodejs_app
  • www

     app.js

  • nodejs_tmp
  • www

     always_restart.txt

     restart.txt

Ваша цель - создать идентичную структуру и разместить файлы в соответствующих схеме директориях. Далее мы наполним их содержимым.

Установка Node.js

Чтобы сразу начать пользоваться необходимой вам версией Node (при условии, что Вы уже получили доступ по SSH), можете ввести следующие команды в терминале для загрузки и распаковки архива с файлами:

wget https://nodejs.org/download/release/node_version/node-file.tar.gz
tar xfz node-file.tar.gz
  1. Загружать нужно 64-разрядную версию для Linux
  2. Архив должен иметь расширение .tar.gz, как видно из примера выше
Работа с .htaccess файлом

Чтобы Passenger мог взаимодействовать с Node.js, в файле .htaccess (мы рекомендуем располагать его здесь ./site-name.com/htdocs/www/.htaccess) необходимо прописать следующее:

PassengerAppRoot /home/hostXXXXXXX/site-name.com/nodejs_app/www
PassengerAppType node
PassengerStartupFile app.js
PassengerNodejs /home/hostXXXXXXX/node/bin/node
PassengerRestartDir /home/hostXXXXXXX/site-name.com/nodejs_tmp/www
PassengerFriendlyErrorPages on
  • Вместо hostXXXXXXX вы прописываете номер своего аккаунта
  • site-name.com - это имя папки с вашим проектом
  • app.js - название файла, который запускает работу серверной части (вы можете назвать его как захотите, главное, пропишите соответствующее имя в .htaccess)
  • PassengerNodejs - путь до исполняемого файла Node.js
  • PassengerFriendlyErrorPages - опция для отображения ошибок, в случае, когда приложение работает не корректно, или не запускается (по умолчанию - PassengerFriendlyErrorPages off). Данная опция выводит сообщения об ошибке, некоторые предложения по решению проблемы, трассировку и дамп переменных среды выполнения. Рекомендуется включать эту опцию только на этапе разработки. После её окончания удалите или закомментируйте в .htaccess эту опцию.
Включение лога ошибок

При разработке любого сайта или приложения разработчики допускают ошибки. По умолчанию, они записываются в папку logs, которая находится в корне сайта. Также, убедитесь, что у вас включена данная опция в панели управления. Во вкладке «Домены»→«Прикрепление домена», рядом с надписью "Лог-файлы веб сервера" есть переключатель, который включает/выключает данную опцию. После включения, логи начнут писаться в течение 5 минут (при обычной загруженности сервера).

Перезапуск приложения

Файлы restart.txt и always_restart.txt необходимы для того, чтобы при внесении вами каких-либо изменений в рабочие файлы (к примеру, app.js) Passenger, применяя правила записанные в .htaccess, мог перехватывать их и применять в работе сайта. Отличие заключается в том, что restart.txt сработает только один раз, а always_restart.txt перезапускает процесы веб-сервера при каждом поступившем запросе. Рекомендуется использовать always_restart.txt только при разработке. После того, как разработка проекта будет завершена, не забудьте удалить этот файл, чтобы избежать задержек при отображении страницы посетителям.

Если Вы уверены в том, что ваш код работает без багов, но всё-равно видите ошибки на странице, можно принудительно завершить все процессы с помощью следующей команды через SSH-соединение:

killall -2 "Passenger NodeApp"

После чего перезагрузить страницу.

Код для app.js

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

const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Итак, все настройки произведены. Откройте сайт в новой вкладке. Если выводится Hello world, то всё работает, как и ожидалось. В противном случае, ещё раз пройдите по вышеприведённому алгоритму действий. Возможно, вы что то упустили.

Пример подключения модуля

Чтобы установить какой-либо модуль в директорию с файлами приложения, при этом используя установленную версию Node.js, необходимо для начала прописать путь до исполняемого файла node в .bash_profile (он лежит в корне вашего аккаунта). После этого вы сможете обращаться к нему из любой директории вашего проекта.

Итак, откройте .bash_profile и допишите следующую строку:

PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/site-name.com/node/bin

Для примера, рассмотрим подключение модуля mysql для работы с базой данных (предварительно, создайте таблицу под любым названием и поместите туда несколько записей). Чтобы установить даный модуль, зайдите через SSH-соединение в директорию «nodejs_app/www» и введите в терминале команду:

npm init --force

Таким обазом создастся файл package.json с данными о вашем приложении. После этого наберите команду:

npm install mysql --save-dev

Вы увидите, что автоматически создастся новая директория «node_modules» и подгрузятся необходимые нам для работы файлы.

Также, рекомендуем загрузить 2 часто используемых модуля - fs (для работы с файлами) и util (для красивого вывода объектов в консоль)

npm install fs util --save-dev

Далее, открываем файл нашего приложения app.js и добавляем следующий код:

const fs = require('fs');
const util = require('util');
var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;

console.log = function(d) {
  log_file.write(util.format(d) + '\n');
  log_stdout.write(util.format(d) + '\n');
};

const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'hostXXXXXXX',
  password : 'your_password',
  database : 'your_database_name'
});

connection.connect();
connection.query('SELECT * FROM my_table', function (error, results, fields) {
  if (error) throw error;
  results.forEach(function(obj) {
      console.log( util.inspect(obj) );
  });
});
connection.end();

В коде выше мы, с помощью модуля fs, создаём новый файл debug.log, в который будем помещать вывод функции console.log

Далее, переопределяем саму функцию console.log, задействуя поток на запись.

Теперь, при помощи модуля mysql, подключаемся к своей БД и выбираем все записи из нужной нам таблицы, прописывая их в созданный нами файл.

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

Запуск приложений через crontab

Для запуска приложений Node.js через crontab создайте shell скрипт и определите в нём переменную окружения PATH исходя из ваших требований. Например, для запуска приложения с помощью утилиты pm2 (process manager), используйте такой код в shell скрипте:

#!/usr/bin/env sh
env PATH=$PATH:/home/hostXXXXXXX/node-vXX.ZZ.YY/bin:/home/hostXXXXXXX/node-vXX.ZZ.YY/lib/node_modules/pm2/bin pm2 start /home/hostXXXXXXX/example.js --name some-socket ...

Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из панели управления хостингом, раздел «Помощь и поддержка».