В этом руководстве мы рассмотрим, как правильно развернуть nodejs приложение на виртуальном сервере (VDS) с использованием связки PM2 + Nginx.
Содержание
Создайте VDS на чистом дистрибутиве debian.
Далее подключитесь к VDS по SSH (инструкция) под пользователем root.
Создайте пользователя web
с домашним каталогом /home/web
:
adduser --home /home/web --gecos "" web
После выполнения команды, введите пароль для пользователя web
. Пароль не будет отображаться на экране при его вводе.
Выдайте права администратора пользователю web
:
usermod -aG sudo web
Для удобства управления версиями nodejs установим NVM
.
NVM позволяет устанавливать любую версию nodejs на ваш сервер.
Более подробно почитать о работе nvm можно по (ссылке )
Перед установкой нужно переключиться на пользователя web
.
su - web
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
Чтобы применить изменения выполните команду:
source ~/.bashrc
Просмотрите доступные версии nodejs для установки на сервер :
nvm ls-remote
Установите nodejs нужной версии (например, nodejs 20):
nvm install 20
Проверьте установленную версию:
node -v
npm -v
Для удобства запуска и управления nodejs приложения установим PM2
.
PM2 позволяет легко запускать любые nodejs приложения, а также масштабироваь приложение под нагрузку на ваш сервер.
Более подробно почитать о работе PM2 можно по (ссылке )
Установите глобально PM2 через версию nodejs, которую мы установили ранее:
npm install -g pm2
Проверьте что PM2 установился на сервер
pm2 -v
Для корректного запуска PM2, нужно отредактировать файл .bashrc
. Откройте файл командой:
nano ~/.bashrc
В конец файла допишите строки:
alias pm2='export NVM_DIR="$HOME/.nvm" && source $NVM_DIR/nvm.sh && nvm use 20 > /dev/null && pm2'
Чтобы применить изменения выполните команду:
source ~/.bashrc
Создайте каталог, где будут хранится файлы сайта:
mkdir /home/web/sitename.ru
Вместо
sitename.ru
используйте имя вашего сайта
Перейдите в этот каталог:
cd /home/web/sitename.ru
Создайте папки app
и www
. В папке app
будут хранится исходные файлы сайта, а в папке www
будут хранится статические файлы для работы сайта.
mkdir app www
Теперь загрузите исходные файлы приложения в каталог /home/web/sitename.ru/app
, а в каталог /home/web/sitename.ru/www
зашрузите статические файлы сайта.
Перейдите в каталог проекта:
cd /home/web/sitename.ru/app
Установите зависимости:
npm install
Соберите приложение, если это требуется:
npm run build
В том же каталоге /home/web/sitename.ru/app
, создайте конфигурационный файл для PM2
nano ecosystem.config.js
Пример конфигурации:
const path = require("path");
module.exports = {
apps: [
{
name: "myapp",
cwd: "/home/web/sitename.ru/app",
script: "bash",
args: "-c 'source $HOME/.nvm/nvm.sh && nvm use 20 && npm run start'",
env: {
NODE_ENV: "production",
PATH: process.env.PATH + ":" + path.join(__dirname, "node_modules/.bin"),
},
},
],
};
Переменные окружения, нужные для запуска Вашего приложения, можно указать в переменной env, указав их через запятую, также как указаны переменные NODE_ENV и PATH
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная name
- указывает как будет называться ваше приложение в PM2
Переменная cwd
- указывает путь до каталога с файлами сайта, чтобы nodejs понимал, откуда нужно подгружать файлы проекта
Переменная args
- указывает как именно нужно запускать nodejs приложение.
Строка source $HOME/.nvm/nvm.sh
указывает что нужно использовать NVM для выбора версии nodejs
Строка nvm use 20
указывает какая версия nodejs используется для запуска приложения
Строка npm run start
указывает какая команда используется для запуска приложения
Переменная env
- указывает какие переменные окружения будут использоваться при запуске приложения. Сюда также можно дописывать свои переменные через запятую
Запустите приложение командой:
pm2 start ecosystem.config.js
Чтобы при перезагрузке приложение запустилось автоматически выполните команду:
pm2 startup
Выполните команду, которую выведет PM2 после команды pm2 startup
(пример: sudo env PATH=... pm2 startup systemd -u user --hp /home/web
)
Сохраните настройки
pm2 save
Установите nginx
:
apt install nginx -y
Создайте конфигурационный файл для сайта:
nano /etc/nginx/sites-available/sitename.ru.conf
Пример конфигурации:
server {
listen 80;
server_name sitename.ru;
access_log /var/log/nginx/sitename_ru.log combined;
root /home/web/sitename.ru/www;
location ~* \.(?:css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot|otf|map)$ {
expires 30d;
access_log off;
add_header Cache-Control "public";
try_files $uri =404;
}
location / {
try_files $uri @backend;
}
location @backend {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120s;
}
location ~ /\.(?!well-known).* {
deny all;
access_log off;
log_not_found off;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 256;
gzip_comp_level 5;
gzip_vary on;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
В большинстве nodejs приложений по умолчанию используется 3000 порт при запуске, поэтому мы указали в nginx на этот порт. Если Ваше приложение использует другой порт, то в конфигурационном файле поменяте 3000 порт, на порт по которому запущено Ваше приложение.
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная server_name
- указывает по какому домену будет работать данный конфигурационный файл nginx
Переменная root
- указывает путь до каталога с файлами сайта, чтобы nginx раздавал сатические файлы, при обращении к сайту
Переменная proxy_pass
- указывает по какому адресу работает ваше nodejs-приложение и куда нужно проксировать запросы, для работы сайта.
Активируйте конфигурационный файл и перезапустите Nginx:
ln -s /etc/nginx/sites-available/sitename.ru.conf /etc/nginx/sites-enabled/
nginx -t
nginx -s reload
Поздравляем, ваше nodejs приложение запущено и доступно по домену.
Данная статья также подходит для запусков nodejs приложений на нашем дистрибутиве Netangels panel, так как он построен на дистрибутиве debian
Старт приложения делается командом:
pm2 start myapp
Остановка приложения делается командом:
pm2 stop myapp
Проверить логи приложения можно командой:
pm2 logs myapp
Посмотреть список приложений, добавленных в PM2 можно командой:
pm2 list
Переключаемся на пользователя web
:
su - web
Установите нужную версию nodejs, на которую вы хотите переключить приложение (например, nodejs 16) :
nvm install 16
Переключите версию nodejs в консоли:
nvm use 16
Перейдите в каталог проекта:
cd /home/web/sitename.ru/app
Удалите старые зависимости проекта:
rm -r node_modules
Установите новые зависимости:
npm install
Соберите приложение, если это требуется:
npm run build
В файле ecosystem.config.js
, поменяйте строку nvm use 20
на nvm use 16
Удалите старый процесс:
pm2 delete myapp
Запустите прилоежние с новой версией Node.js :
pm2 start ecosystem.config.js
Сохраните конфигурацию автозапуска:
pm2 save
Поздравляем, теперь ваше приложение работает на другой версии nodejs.