15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
09.10.2024

Как да инсталирате Node.js и PM2 на Ubuntu: Пълно ръководство за продукционна среда

Node.js е асинхронна, управлявана от събития JavaScript среда за изпълнение, изградена върху V8 двигателя на Chrome, предназначена за изпълнение на JavaScript код от страна на сървъра с висока производителност. PM2 е мениджър на процеси от производствен клас за Node.js приложения, който предоставя демонизация, автоматично възстановяване при сривове, агрегиране на логове, балансиране на натоварването в клъстерен режим и генериране на стартови скриптове — всичко от един CLI интерфейс.

Това ръководство обхваща всеки метод за инсталиране, опция за конфигурация и оперативен модел, необходими за надеждно изпълнение на Node.js приложения на Ubuntu 20.04, 22.04 или 24.04 LTS в производствена среда.

Предварителни изисквания

Преди да продължите, потвърдете следното:

  • Операционна система: Ubuntu 20.04, 22.04 или 24.04 LTS (сървър или десктоп)
  • Потребителски привилегии: `sudo` или root достъп
  • Мрежов достъп: Изходящ HTTPS за изтегляне на пакети и скриптове
  • Инсталиран curl: Изпълнете `sudo apt install curl -y` ако все още не е наличен

Ако изпълнявате това на облачен сървър, средата VPS Хостинг е най-честата цел за разгръщане на Node.js натоварвания и всичко в това ръководство се прилага директно.

Стъпка 1: Актуализиране на системните пакети

Винаги синхронизирайте индекса на пакетите си и прилагайте чакащи надстройки преди инсталиране на нов софтуер. Остарелите метаданни на пакетите са честа причина за конфликти на зависимости.

“`bash

sudo apt update

sudo apt upgrade -y

“`

След като надстройката приключи, рестартирайте ако ядрото е актуализирано:

“`bash

sudo reboot

“`

Стъпка 2: Инсталиране на Node.js — Избор на правилния метод

Съществуват три основни метода за инсталиране на Node.js на Ubuntu. Всеки има различни компромиси по отношение на контрол на версиите, изолация и системна наличност.

Сравнение на методите

ФункцияNodeSource (apt)NVMСистемен apt (universe)
Контрол на версиитеЕдинична фиксирана основна версияМножество версии на потребителОбикновено остаряла LTS
Системна инсталацияДаНе (по подразбиране за потребител)Да
Превключване на версииИзисква повторно изпълнение на скрипта за настройка`nvm use <version>`Не се поддържа
Най-подходящ заCI/CD, сървъри с единична версияРазработка, мулти-проектСамо за бързо тестване
Изисква sudo за npm глобалиДаНеДа
Пригодност за производствоВисокаСреднаНиска

Метод 1: Инсталиране на Node.js чрез NodeSource (Препоръчително за сървъри)

NodeSource поддържа актуални Debian/Ubuntu хранилища за всяка активна линия на издания на Node.js. Това е предпочитаният подход за производствени сървъри, където се изисква единична, стабилна версия за цялата система.

Добавете хранилището NodeSource за текущото LTS издание:

“`bash

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –

“`

Този скрипт извършва няколко действия: открива вашата версия на Ubuntu, добавя подходящото NodeSource apt хранилище, импортира GPG ключа за подписване и изпълнява `apt-get update`. Флагът `-E` запазва вашите променливи на средата при ескалиране до sudo, което е важно ако имате конфигурирани настройки за прокси.

Инсталирайте Node.js и npm:

“`bash

sudo apt install nodejs -y

“`

Пакетът NodeSource включва едновременно `node` и `npm` в един пакет `nodejs`. За разлика от пакета Ubuntu universe, той не ги разделя.

Проверете инсталацията:

“`bash

node -v

npm -v

“`

Примерен очакван изход:

“`

v20.14.0

10.7.0

“`

Фиксиране към конкретна основна версия: Ако ви трябва Node.js 18 вместо текущата LTS, заменете `setup_lts.x` с `setup_18.x` в командата curl. Наличните потоци включват `setup_18.x`, `setup_20.x` и `setup_22.x`.

Метод 2: Инсталиране на Node.js чрез NVM (Препоръчително за разработка и среди с множество версии)

NVM (Node Version Manager) инсталира Node.js в домашната ви директория, без да изисква root привилегии нито за самия Node.js, нито за глобално инсталирани npm пакети. Това елиминира проблемите с разрешенията, които обикновено възникват при изпълнение на `npm install -g` на системно инсталиран Node.js.

Инсталирайте NVM:

“`bash

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

“`

Проверете официалното хранилище на NVM за най-новия таг на издание преди да изпълните тази команда — номерът на версията в URL адреса се променя с всяко издание.

Презаредете средата на вашата обвивка:

“`bash

source ~/.bashrc

“`

Ако използвате Zsh, вместо това заредете `~/.zshrc`. Инсталаторът на NVM добавя своя инициализационен блок към конфигурационния файл на обвивката, който открие.

Инсталирайте най-новата LTS версия на Node.js:

“`bash

nvm install –lts

“`

Инсталирайте конкретна версия заедно с LTS:

“`bash

nvm install 18

nvm install 20

“`

Превключване между инсталираните версии:

“`bash

nvm use 20

nvm alias default 20

“`

Командата `alias default` задава версията, която се активира в нови сесии на обвивката, което е критично за скриптове и cron задачи, които не зареждат вашия интерактивен профил на обвивката.

Проверка:

“`bash

node -v

npm -v

“`

Критичен проблем с NVM за производство: Тъй като NVM е с обхват на потребителя, стартовите скриптове и systemd единиците на PM2 няма да имат достъп до управлявания от NVM Node.js двоичен файл, освен ако изрично не конфигурирате пътя. Вижте Стъпка 5 за правилното справяне с това.

Стъпка 3: Инсталиране на PM2

PM2 се разпространява като npm пакет и трябва да се инсталира глобално, за да е наличен неговият CLI за цялата система.

Инсталирайте PM2:

“`bash

sudo npm install -g pm2

“`

Ако сте инсталирали Node.js чрез NVM, пропуснете `sudo`:

“`bash

npm install -g pm2

“`

Проверете инсталацията:

“`bash

pm2 -v

“`

Инсталирайте конкретна версия на PM2 (полезно при фиксиране на инфраструктурата):

“`bash

sudo npm install -g pm2@5.3.1

“`

PM2 версия 5.x е текущата стабилна линия. Тя въведе значителни подобрения в уеб таблото (pm2 plus), ротацията на логове и модулната система в сравнение с v4.

Стъпка 4: Управление на Node.js приложения с PM2

Стартиране на приложение

Навигирайте до директорията на вашето приложение и го стартирайте:

“`bash

cd /var/www/my-app

pm2 start app.js –name "my-app"

“`

Винаги задавайте флаг `–name`. Без него PM2 използва името на файла като име на процеса, което става неясно когато имате множество услуги.

Стартиране с допълнителни опции:

“`bash

pm2 start app.js –name "my-app" –watch –max-memory-restart 300M

“`

  • `–watch`: Рестартира процеса при промяна на изходните файлове (полезно при staging, не се препоръчва в производство)
  • `–max-memory-restart 300M`: Автоматично рестартира процеса ако надхвърли 300 MB RSS памет — критична защита срещу изтичане на памет

Преглед на изпълняващите се процеси

“`bash

pm2 list

“`

Това извежда таблица, показваща ID на процеса, име, режим (fork/cluster), PID, статус, използване на CPU, консумация на памет и брой рестартирания.

За табло в реално време:

“`bash

pm2 monit

“`

Управление на процеси

“`bash

pm2 restart my-app # Graceful restart

pm2 reload my-app # Zero-downtime reload (cluster mode only)

pm2 stop my-app # Stop without removing from process list

pm2 delete my-app # Stop and remove from process list

“`

Разликата между `restart` и `reload`: `restart` убива процеса и стартира нов, причинявайки кратък престой. `reload` (наличен само в клъстерен режим) преминава през работниците един по един, поддържайки наличността през цялото време. Винаги използвайте `reload` в производствени клъстерни разгръщания.

Управление на логове

“`bash

pm2 logs # Stream logs from all processes

pm2 logs my-app # Stream logs for a specific process

pm2 logs my-app –lines 200 # Show last 200 lines

pm2 flush # Clear all log files

“`

PM2 съхранява логове в `~/.pm2/logs/` по подразбиране. За производствени сървъри инсталирайте модула за ротация на логове, за да предотвратите изчерпване на диска:

“`bash

pm2 install pm2-logrotate

pm2 set pm2-logrotate:max_size 50M

pm2 set pm2-logrotate:retain 10

pm2 set pm2-logrotate:compress true

“`

Това ротира логовете когато достигнат 50 MB, запазва 10 компресирани архива и предотвратява неконтролиран растеж на логовете — честа проблем на дълго работещи сървъри, който се пренебрегва докато не свърши дисковото пространство.

Стъпка 5: Конфигуриране на PM2 за стартиране при зареждане на системата

PM2 трябва да бъде конфигуриран да оцелява при рестартиране на сървъра. Това се обработва чрез systemd сервизна единица, генерирана от самия PM2.

Генерирайте командата за стартиране:

“`bash

pm2 startup

“`

PM2 ще изведе команда, съобразена с вашата init система и текущия потребител. Изглежда така:

“`

[PM2] Init System found: systemd

[PM2] To setup the Startup Script, copy/paste the following command:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu

“`

Копирайте и изпълнете точно тази команда. Не я модифицирайте — пътят до двоичния файл на PM2 и домашната директория трябва да съответстват на конфигурацията на вашата система.

Специфична конфигурация за стартиране с NVM: Ако сте инсталирали Node.js чрез NVM, пътят в генерираната команда ще сочи към вашия управляван от NVM двоичен файл. Това е правилно, но трябва да се уверите, че версията на NVM е зададена като подразбираща се преди изпълнение на `pm2 startup`:

“`bash

nvm alias default 20

pm2 startup

“`

Запазете текущия списък с процеси:

“`bash

pm2 save

“`

Това записва списъка с процеси в `~/.pm2/dump.pm2`. При рестартиране systemd единицата чете този файл и възстановява всички запазени процеси. Ако по-късно добавите или премахнете приложения, изпълнете `pm2 save` отново за актуализиране на снимката.

Проверете дали systemd единицата е активна:

“`bash

systemctl status pm2-ubuntu

“`

Заменете `ubuntu` с вашето действително потребителско име.

Стъпка 6: Производствено разгръщане с PM2 Ecosystem файлове

За всичко извън приложение с единичен скрипт използвайте конфигурационния файл на екосистемата на PM2. Той предоставя възпроизводими, версионно контролирани дефиниции на процеси и елиминира необходимостта от запомняне на дълги CLI флагове.

Генериране на Ecosystem файла

“`bash

pm2 ecosystem

“`

Това създава `ecosystem.config.js` в текущата директория.

Готова за производство конфигурация на екосистемата

“`javascript

module.exports = {

apps: [

{

name: 'api-server',

script: './src/server.js',

instances: 'max',

exec_mode: 'cluster',

watch: false,

max_memory_restart: '500M',

log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

error_file: '/var/log/pm2/api-server-error.log',

out_file: '/var/log/pm2/api-server-out.log',

merge_logs: true,

env: {

NODE_ENV: 'development',

PORT: 3000

},

env_production: {

NODE_ENV: 'production',

PORT: 8080

}

},

{

name: 'worker',

script: './src/worker.js',

instances: 2,

exec_mode: 'fork',

cron_restart: '0 2 * * *',

env_production: {

NODE_ENV: 'production'

}

}

]

};

“`

Обяснение на ключовите конфигурационни решения:

  • `instances: 'max'`: PM2 автоматично създава по един работник за всяко логическо CPU ядро. На 4-ядрен сървър това създава 4 Node.js процеса, напълно използвайки хардуера.
  • `exec_mode: 'cluster'`: Използва вградения клъстерен модул на Node.js. Всички инстанции споделят един и същи порт чрез балансиране на натоварването на сокета на операционната система.
  • `exec_mode: 'fork'`: Изпълнява процеса като самостоятелен дъщерен процес. Изисква се за приложения, които не са HTTP сървъри (работници на опашки, планирани задачи, WebSocket сървъри с прилепнали сесии).
  • `merge_logs: true`: Комбинира stdout от всички инстанции на клъстера в един лог файл, което значително улеснява анализа на логовете.
  • `cron_restart`: Планира автоматични рестартирания с помощта на cron синтаксис. Полезно за работници, които натрупват състояние или за прилагане на нощни промени в конфигурацията.

Стартиране с Ecosystem файла

“`bash

pm2 start ecosystem.config.js –env production

pm2 save

“`

Работен процес за разгръщане без престой

При разгръщане на нова версия на вашето приложение:

“`bash

git pull origin main

npm install –production

pm2 reload ecosystem.config.js –env production

“`

`pm2 reload` изпраща `SIGINT` на всеки работник един по един, изчаква новият работник да стане готов, след което прекратява стария. Вашето приложение трябва да обработва `SIGINT` коректно и да сигнализира готовност чрез `process.send('ready')` за да работи това правилно.

Обработчик за коректно изключване във вашето приложение:

“`javascript

process.on('SIGINT', () => {

server.close(() => {

console.log('HTTP server closed');

process.exit(0);

});

});

“`

Стъпка 7: Наблюдение и проследимост на PM2

Вградено наблюдение

“`bash

pm2 monit

“`

Показва графики на CPU и памет в реално време за всеки процес в терминала.

Информация за процеса

“`bash

pm2 show my-app

“`

Извежда подробни метаданни: работно време, брой рестартирания, версиониране, път до интерпретатора, променливи на средата и местоположения на лог файловете.

Уеб табло на PM2 (PM2 Plus)

PM2 предлага хоствано табло за наблюдение на pm2.io. Свържете вашия сървър:

“`bash

pm2 link <secret_key> <public_key>

“`

Това предоставя исторически метрики, сигнализиране и дистанционно управление на процеси — особено ценно при управление на множество сървъри или когато ви е необходима видимост без SSH достъп.

Стъпка 8: Актуализиране на Node.js и PM2

Актуализиране на PM2

“`bash

sudo npm install -g pm2@latest

pm2 update

“`

`pm2 update` е от съществено значение след надстройване на двоичния файл на PM2 — актуализира демона на PM2 в паметта без прекъсване на изпълняващите се процеси.

Актуализиране на Node.js чрез NodeSource

Повторно изпълнете скрипта за настройка за новата основна версия:

“`bash

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash –

sudo apt install nodejs -y

“`

След актуализиране на Node.js рестартирайте PM2, за да се уверите, че използва новия двоичен файл:

“`bash

pm2 restart all

“`

Актуализиране на Node.js чрез NVM

“`bash

nvm install 22

nvm alias default 22

nvm use 22

pm2 restart all

“`

Ако сте променили подразбиращата се версия на NVM, регенерирайте стартовия скрипт на PM2 за актуализиране на пътя до двоичния файл в systemd единицата:

“`bash

pm2 unstartup

pm2 startup

pm2 save

“`

Съображения за укрепване на сигурността

Изпълнението на Node.js приложения в производство изисква внимание извън управлението на процесите:

  • Изпълнявайте като непривилегирован потребител: Никога не изпълнявайте PM2 или Node.js като root. Създайте специален системен потребител (`adduser –system –group nodeapp`) и изпълнявайте PM2 под този акаунт.
  • Управление на променливите на средата: Не кодирайте твърдо тайни в `ecosystem.config.js`. Използвайте файл `.env` зареден чрез `dotenv`, или инжектирайте тайните чрез вашия pipeline за разгръщане. Ecosystem файлът обикновено се записва в контрол на версиите.
  • Обратен прокси: Поставете Nginx или Caddy пред вашето Node.js приложение. Това обработва TLS терминация, обслужване на статични файлове, ограничаване на скоростта и буфериране на заявки. Комбинирайте това с решение за SSL Сертификати за налагане на HTTPS.
  • Правила на защитната стена: Блокирайте директния достъп до вашия Node.js порт (напр. 3000, 8080) от публичния интернет. Само обратният прокси трябва да комуникира с Node.js.
  • Ограничения на ресурсите: Задайте `max_memory_restart` в PM2 и конфигурирайте стойности на `ulimit` на системно ниво, за да предотвратите дестабилизиране на сървъра от единичен неконтролиран процес.

За производствени разгръщания с висок трафик, където изолацията на ресурсите е критична, средата Dedicated Сървъри предоставя пълен контрол върху хардуера и елиминира проблема с шумните съседи, присъщ на споделената инфраструктура.

Избор на правилната хостинг среда за Node.js

НатоварванеПрепоръчителна средаОбосновка
Лични проекти, staging[VPS Хостинг](https://alexhost.com/bg/vps/)Икономически ефективен, пълен root достъп, мащабируем
API с висок трафик[Dedicated Сървъри](https://alexhost.com/bg/dedicated-servers/)Предвидима производителност, без конкуренция за ресурси
ML извод + Node.js[GPU Хостинг](https://alexhost.com/bg/gpu-hosting/)Прехвърляне на изчислително интензивни задачи към GPU работници
Управляван контролен панел[VPS с cPanel](https://alexhost.com/bg/vps/control-panels/cpanel-vps/)Управление на процеси и файлове чрез GUI

Контролен списък за технически решения

Използвайте този контролен списък преди разгръщане на Node.js и PM2 в производство:

  • [ ] Node.js инсталиран чрез NodeSource (сървър) или NVM (разработка) — не чрез пакета Ubuntu universe
  • [ ] PM2 инсталиран глобално с правилните разрешения за вашия метод на инсталиране
  • [ ] Приложението стартирано с флаг `–name` и дефиниран праг `–max-memory-restart`
  • [ ] Клъстерен режим активиран за HTTP сървъри; fork режим използван за фонови работници
  • [ ] `pm2 startup` изпълнен и генерираната команда изпълнена с sudo
  • [ ] `pm2 save` изпълнен след конфигуриране на всички процеси
  • [ ] Модулът за ротация на логове инсталиран и конфигуриран
  • [ ] Nginx или Caddy конфигуриран като обратен прокси с TLS
  • [ ] Приложението обработва `SIGINT` коректно за презареждания без престой
  • [ ] Тайните управлявани извън `ecosystem.config.js`
  • [ ] PM2 systemd единицата проверена с `systemctl status pm2-<username>`
  • [ ] Защитната стена блокира директния достъп до Node.js портовете от публичния интернет

ЧЗВ

Каква е разликата между fork режим и клъстерен режим на PM2?

Fork режимът създава приложението като единичен дъщерен процес — една инстанция, едно използвано CPU ядро. Клъстерният режим използва вградения клъстерен модул на Node.js за създаване на множество работни процеси, които всички споделят един и същи TCP порт, позволявайки истинско използване на множество ядра и презареждания без престой. Използвайте клъстерен режим за HTTP/HTTPS сървъри и fork режим за работници, cron задачи или приложения, поддържащи вътрешно състояние, несъвместимо с многопроцесно споделяне.

Защо PM2 не се рестартира след рестартиране на сървъра, въпреки че изпълних `pm2 startup`?

Най-честата причина е, че `pm2 save` не е изпълнен след конфигуриране на процесите, така че dump файлът е празен или липсва. Втората най-честа причина е несъответствие на NVM пътя: ако подразбиращата се версия на NVM е променена след генериране на стартовия скрипт, systemd единицата сочи към несъществуващ двоичен файл. Разрешете това като изпълните `pm2 unstartup`, зададете правилната подразбираща се версия на NVM, след което повторно изпълнете `pm2 startup` и `pm2 save`.

Може ли PM2 да управлява процеси, различни от Node.js?

Да. PM2 може да управлява всеки изпълним файл чрез задаване на интерпретатора. Например: `pm2 start script.py –interpreter python3`. Това прави PM2 полезен като универсален надзорник на процеси за микросервизни архитектури с различни езици.

Как да изпълнявам множество Node.js приложения на различни портове зад един сървър?

Дефинирайте всяко приложение като отделен запис в `ecosystem.config.js` с различни променливи на средата `PORT`. Конфигурирайте Nginx като обратен прокси с отделни блокове `server` или директиви `location`, насочващи към всеки порт. Всички приложения споделят един и същи PM2 демон и се управляват чрез единичен изглед `pm2 list`.

Трябва ли да използвам NVM или NodeSource за производствен VPS?

NodeSource обикновено е за предпочитане за производствени сървъри. Той инсталира Node.js като системен пакет, правейки го достъпен за всички потребители и системни услуги без зависимости от инициализация на обвивката. Моделът на активиране на NVM за потребител и обвивка въвежда фини режими на неуспех в systemd единици, cron задачи и CI/CD pipeline, изпълнявани извън интерактивна сесия на обвивката. Запазете NVM за локални машини за разработка, където управлението на множество версии на Node.js едновременно е реално изискване.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало