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-адресою, недолік — не всі популярні фреймворки вміють запускати 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
    Там використовується проксування за сокетом, тому хост не потрібен. Додамо примітку стосовно цього моменту.