2.10.1. Общая информация о Node.js

Внимание!

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

Node.js работает на хостинге так же, как на VPS или выделенном сервере, но с проксированием HTTP-трафика в Node.js-приложение.

Проксирование HTTP-трафика необходимо для возможности защиты вашего приложение от DDoS-атак и предоставления вам дополнительных возможностей нашего хостинга, например установка бесплатного SSL-сертификата от Let's Encrypt, кеширование статических файлов и т. д. Без проксирования HTTP-трафик не дойдёт к вашему приложению. Если HTTP-трафик вам не нужен, можете запускать приложение без него — всё будет работать.

flowchart LR client([Клиент]) host1[sub.example.com:80] host2[sub.example.com:443] proxying{Проксирование} socket[~/.system/nodejs/sub.example.com.sock] ip["127.X.X.X:3000"] app([Приложение]) client-->host1 & host2 host1 & host2-->proxying proxying-->|По сокету|socket proxying-->|По IP-адресу|ip socket & ip-->app

Доступно два типа проксирования:

  1. По сокету. При запуске приложения создаётся сокет-файл, в который проксируется весь HTTP-трафик. Преимущество такого подхода — интерфейс сокета сам по себе работает быстрее проксирования по IP-адресу, недостаток — не все популярные фрeймворки умеют запускать HTTP-сервер по сокету и в настройках принимают только параметры --host и --port. Если у вас есть возможность запустить HTTP-сервер по сокету — советуем сделать именно это, если такой возможности нет — используйте проксирование по IP-адресу.
  2. По IP-адресу. HTTP-трафик проксируется через локальный IP-адрес. Это организовано следующим образом. Мы выдаём вам уникальный локальный IP-адрес вида 127.*.*.*, где * — любое число от 0 до 255, и порт по умолчанию — 3000. Вы в настройках своего приложения указываете эти значения. В зависимости от вашего фреймворка эти параметры могут указываться по-разному, но в большинстве — это параметры запуска приложения --host и --port. Примечание При наличии выделенного IP на него напрямую можно принимать любой вид трафика по любому порту. Для использования выделенного IP его нужно явно указывать вторым параметром в server.listen(port, ip).

Тип проксирования выбирается в настройках сайта при включении Node.js (см. ниже). Данные для использования выбранного типа выводятся на странице настроек Node.js. Также они содержатся в переменных окружения: process.env.PORT и process.env.HOST (соответственно, путь к сокету и пустое значение при проксировании по сокету или порт и IP-адрес при проксировании по IP-адресу).

Порядок обработки запроса:

  1. Запрос поступает на общий сервер через порт 80 или 443.
  2. На основе имени хоста перенаправляется приложению в соответствии с выбранным типом проксирования — на сокет нужного сайта или локальный IP-адрес.
  3. Приложение получает данные, обрабатывает их и возвращает ответ.
В течение нескольких минут после включения Node.js в настройках сайта в корневом каталоге сайта автоматически создаётся примитивное приложение, выводящее заглушку о том, что сайт готов к использованию.
  1. Откройте раздел «Настройки сайта».
  2. Выберите веб-сервер Node.js, нужную версию, тип проксирования HTTP-трафика и сохраните изменения:
  3. Разместите файлы вашего приложения в корневом каталоге сайта — загрузите файлы готового проекта или установите с помощью npm.
  4. Добавьте скрипт с командой start в package.json.
  5. Нажмите «Перезапустить» в настройках Node.js.

Возможные проблемы:

  • При запуске HTTP-сервера не с нашим сокетом (при проксировании по сокету) — приложение продолжит работу, но на сайте будет ошибка 502.
  • При запуске HTTP-сервера не с нашим IP-адресом и портом (при проксировании по IP-адресу) — приложение завершит работу через пару секунд с кодом ошибки 9.
  • При запуске HTTP-сервера только с портом, без указания хоста (при проксировании по IP-адресу) — приложение займёт порт глобально и будет мешать запуску приложений на других хостах в пределах хостинг-аккаунта. Решение — указать хост в app.listen().
  • Ошибка 502 в общем случае означает, что мы не можем найти, куда проксировать ваш трафик. Обычно это происходит, когда приложение запускается с некорректным IP-адресом, портом или сокетом (см. выше), либо когда запуск приложения завершился неудачей.
  • При падении приложения из-за какой-либо внутренней ошибки наша система Supervisor отследит это и попытается перезапустить приложение в течении 10 секунд. Она будет предпринимать попытки до тех пор, пока ваше приложение не запустится и не начнёт работать.

Если вам нужно запустить приложение из консоли и вы используете проксирование по IP-адресу, то при запуске явно указываете IP-адрес и порт:

HOST=127.*.*.* PORT=3000 node index.js

Вместо 127.*.*.* и 3000 подставьте IP-адрес и порт со страницы настроек Node.js.

Примечания:

  • На хостинге нет ограничений на исходящие соединения. Вы можете свободно подключаться из своего приложения к MySQL, Redis (отдельной услуге или внешнему сервису) и т. д.
  • Если node и npm не видны в консоли — убедитесь, что в хостинг-аккаунте существуют файлы .bashrc и .bash_profile и они не содержат ошибок.
На хостинге также поддерживается npx.

npm — пакетный менеджер Node.js. Позволяет устанавливать дополнительные пакеты напрямую на хостинге. Для использования достаточно подключиться по SSH и в каталоге сайта выполнить необходимые команды.

Команды:

  • npm -v — просмотр текущей версии npm.
  • npm install пакет (или npm i пакет) — установка пакета. После установки появится подкаталог node_modules, в котором будет находится установленный модуль.
  • npm uninstall пакет — удаление пакета.

package.json — файл конфигурации и управления пакетами npm.

Параметры:

  • name (обязательный) — название приложения маленькими латинскими буквами без пробелов, для разделения слов можно использовать символы - и _.
  • version (обязательный) — версия приложения в формате x.x.x.
  • description — описание приложения.
  • dependencies — секция с информацией о всех пакетах, используемых приложением.

Команда npm init — создаёт файл с нуля. Перед созданием запрашиваются все необходимые данные. В конце нужно ознакомиться с содержимым будущего файла и если всё в порядке, ввести yes. Примечание Можно на все вопросы просто нажимать Enter, тогда будет создан файл со стандартным содержимым.

Управление работой приложениея Node.js выполняется в разделе «Настройки Node.js».

Блок «Статус приложения»:

  • «Статус приложения» — текущий статус работы сервиса Node.js:
    • «Запущено» — сервис запущен и работает.
    • «Остановлено» — не запущен (например, из-за отсутствия package.json) или остановлен из-за возникшей ошибки.
  • «Команда для запуска» — наличие в файле package.json скрипта с командой start:
    • «Присутствует» — скрипт найден.
    • «Отсутствует» — скрипт не найден.
  • «Принудительный перезапуск» — перезапуск сервиса. ⚠️ Обязательно нужно нажимать после любых изменений файлов.
  • «Принудительная остановка» — остановка сервиса. Кнопка отображается только при запущенном приложении.

Блок «Основные настройки»:

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

Блок «Запуск приложения» — содержит команду, которую нужно добавить в package.json для запуска приложения (./index.js в команде — путь к главному файлу приложения, название файла может быть любым):

Блок «Ваш package.json» — показывает текущее содержимое файла package.json из корневого каталога сайта (обновляется при открытии или перезагрузке страницы настроек):

При обнаружении в файле синтаксических ошибок в блоке будет выводится сообщение «Файл содержит ошибки». Если сообщение об ошибке выводится при работающем приложении, значит приложение было запущено до появления ошибки в файле.

Блок «Логи приложения» — вывод логов приложения в реальном времени. Включает информацию, которую приложение в процессе работы выводит в консоль.

Полный лог находится в файле вида ~/.system/nodejs/logs/www.example.com.log, где вместо www.example.com будет название вашего сайта.

Используется проксирование по IP-адресу.
  1. В корневом каталоге сайта создайте два файла:
    1. Файл конфигурации package.json:
      {
        "name": "node",
        "version": "1.0.0",
        "scripts": {
          "start": "node ./index.js"
        }
      }
    2. Файл приложения index.js:
      const HTTP = require('http');
      const WebServer = HTTP.createServer((req, res) => {
          res.statusCode = 200;
          res.setHeader('Content-Type', 'text/plain');
          res.end('Hello, World!');
      });
      WebServer.listen(process.env.HOST, process.env.PORT, () => {
          console.log(`Server is running.`);
      });
  2. В настройках Node.js нажмите «Перезапустить».
  3. Откройте сайт в браузере — в случае успеха должен выводиться текст «Hello, World!».
Используется проксирование по сокету.
  1. Подключитесь к хостингу по SSH.
  2. Перейдите в корневой каталог сайта (в команде используйте свои данные):
    cd example.com/www
  3. Инициализируйте npm и установите фреймворк express:
    npm init && npm i express
  4. В корневом каталоге сайта создайте файл приложения index.js:
    const express = require("express");
    const app = express();
    
    app.get("/", function(request, response){
        response.end("Hello from Express!");
    });
    
    app.listen(process.env.PORT);
  5. Отредактируйте файл package.json и добавьте в него команду запуска:
    "scripts": {
        "start": "node ./index.js"
    }

    При добавлении команды соблюдайте синтаксис JSON!

    Команду нужно добавлять не просто в конец файла, а с соблюдением стандартного синтаксиса формата JSON:
    • Секция scripts не должна дублироваться. Если она уже есть в файле, добавьте команду start туда.
    • В конце предыдущей строки на том же уровне вложенности должна быть запятая.
    • Порядок вложенности скобок должен быть корректным.
  6. В настройках Node.js нажмите «Перезапустить».
  7. Откройте сайт в браузере — в случае успеха должен выводиться текст «Hello from Express!».
Содержание

    (4)

    Комментарии

    blazheiko
    "При запуску HTTP-сервера тільки з портом, без вказання хоста — застосунок займе порт глобально і заважатиме запуску застосунків на інших хостах в межах хостинг-акаунту. Рішення — вказати хост в app.listen()."
    але в прикладі для Express "app.listen(process.env.PORT);" вказано тільки порт...
    karlov
    Там використовується проксування за сокетом, тому хост не потрібен. Додамо примітку стосовно цього моменту.