Запуск Node.js приложения на Ubuntu 18.04
20 января 2019
54
Node

Вступление

Node.js - это среда выполнения JavaScript с открытым исходным кодом для создания серверных и сетевых приложений. Node js сервер может работать на Linux, macOS, FreeBSD и Windows.

Вы можете запускать приложения Node.js из командной строки, однако подобный подход обычно используется для локального тестирования приложения. В этом руководстве основное внимание будет уделено запуску вашего приложения в "боевом" окружении.

В этой статье мы настроим хостинг Node js server на Ubuntu 18.04. Этот сервер будет запускать приложение Node.js, управляемое PM2 , и предоставлять пользователям безопасный доступ к приложению через прокси-сервер Nginx.

Что вам потребуется

В этом руководстве предполагается, что у вас:

  • Настроен сервер Ubuntu 18.04. У вас должен быть пользователь без полномочий root с правами sudo и активным брандмауэром.
  • Доменное имя указывает на IP вашего сервера. Для удобства в этой статье будет использоваться имя домена example.com.
  • Nginx на сервере установлен.
  • Nginx настроен с использованием сертификатов Let's Encrypt.

Таким образом, на начальном этапе у вас есть сервер, обслуживающий страницу-"заглушку" вашего домена https://example.com/

Шаг 1 - Установка Node js

Давайте начнем с установки последней версии LTS Node.js с использованием архивов пакетов NodeSource .

Сначала установите NodeSource PPA, чтобы получить доступ к его содержимому. Убедитесь, что вы находитесь в своем домашнем каталоге, и используйте curl для получения сценария установки для архивов Node.js 8.x:

cd ~
curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh

Вы можете проверить содержимое этого скрипта с помощью nano или предпочитаемого вами текстового редактора:

nano nodesource_setup.sh

Когда вы закончите проверку скрипта, запустите его через sudo:

sudo bash nodesource_setup.sh

PPA будет добавлен в вашу конфигурацию, и ваш локальный кеш пакетов будет обновлен автоматически. После запуска сценария установки из Nodesource вы можете установить Node js server side:

sudo apt install nodejs

Чтобы проверить, какую версию Node.js вы установили после этих начальных шагов, введите:

nodejs -v


v8.11.3

Примечание. При установке из NodeSource PPA вызывается исполняемый файл Node.js nodejs, а не node.

nodejsПакет содержит nodejsбинарный файл, а также менеджер пакетов npm, так что вам не нужно устанавливать npmотдельно.

npmиспользует файл конфигурации в вашем домашнем каталоге, чтобы отслеживать обновления. Он будет создан при первом запуске npm. Выполните эту команду, чтобы проверить, что npmустановлено, и создать файл конфигурации:

npm -v


5.6.0

Чтобы некоторые npmпакеты работали (например, требующие компиляции кода из исходного кода), вам необходимо установить build-essentialпакет:

sudo apt install build-essential

Теперь у вас есть необходимые инструменты для работы с npmпакетами, которые требуют компиляции кода из исходного кода.

Установив среду выполнения Node.js, давайте перейдем к написанию приложения Node.js.

Шаг 2 - Создание приложения Node.js

Давайте напишем приложение Hello World, которое возвращает «Hello World» любым HTTP-запросам. Это приложение поможет вам настроить Node.js. Вы можете заменить его своим собственным приложением - просто убедитесь, что вы изменили свое приложение для прослушивания соответствующих IP-адресов и портов.

Сначала давайте создадим приложение под названием hello.js:

cd ~
nano hello.js

Вставьте следующий код в файл:

~ / Hello.js

const http = require('http');

const hostname = 'localhost';
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}/`);
});

Сохраните файл и выйдите из редактора.

Это приложение Node.js прослушивает указанные адреса ( localhost) и порт ( 3000) и возвращает «Hello World!» с 200кодом успеха HTTP. Поскольку мы слушаем localhost, клиенты не смогут подключиться к нашему приложению.

Чтобы протестировать ваше приложение, введите:

node hello.js

Вы увидите следующий вывод:

Server running at http://localhost:3000/

Примечание. Запуск приложения Node.js таким способом блокирует дополнительные команды до тех пор, пока приложение не будет завершено нажатием CTRL+C.

Чтобы протестировать приложение, откройте другую терминальную сессию на сервере, и подключитесь к localhostс curl:

curl http://localhost:3000

Если вы видите следующий вывод, приложение работает правильно и прослушивает правильный адрес и порт:

Hello World!

Если вы не видите ожидаемого вывода, убедитесь что ваше Node js приложение запущено и настроено на прослушивание по правильному адресу и порту.

Если вы уверены, что это работает, завершите приложение (если вы еще этого не сделали), нажав CTRL+C.

Шаг 3 - Установка PM2

Далее давайте установим PM2, менеджер процессов для приложений Node.js. PM2 позволяет демонизировать приложения, чтобы они работали в фоновом режиме как службы.

Используйте npm для установки последней версии PM2 на ваш сервер:

sudo npm install pm2@latest -g

-g опция указывает npm установить модуль на глобальном уровне , так что он доступен для всей системы.

Давайте сначала используем pm2 start команду для запуска вашего приложения hello.js, в фоновом режиме:

pm2 start hello.js

Это также добавляет ваше приложение в список процессов PM2, который выводится каждый раз, когда вы запускаете приложение:

Как видите, PM2 автоматически назначает App name(на основе имени файла, без .jsрасширения) и PM2 id. PM2 также поддерживает другую информацию, такую ​​как PID процесса, его текущем состоянии и использовании памяти.

Приложения, работающие в PM2, будут автоматически перезапущены в случае сбоя или уничтожения приложения. Мы можем предпринять дополнительный шаг, чтобы запустить приложение при запуске системы с помощью startupподкоманды.

Эта подкоманда генерирует и настраивает скрипт запуска для запуска PM2 и его управляемых процессов при загрузке сервера:

pm2 startup systemd

Последняя строка полученного результата будет включать команду для запуска с привилегиями суперпользователя, чтобы настроить PM2 для запуска при загрузке:

[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 alexey --hp /home/alexey

Запустите команду из вывода с вашим именем пользователя вместо alexey:

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

В качестве дополнительного шага мы можем сохранить список процессов PM2 и соответствующие среды:

pm2 save

Теперь вы создали системный модуль, который запускает pm2для вашего пользователя при загрузке. Он, в свою очередь, запускает hello.js.

Запустите сервис с systemctl:

sudo systemctl start pm2-alexey

Проверьте состояние:

systemctl status pm2-alexey

Остановите приложение с помощью этой команды (укажите PM2 App nameили id):

pm2 stop app_name_or_id

Перезапустите приложение:

pm2 restart app_name_or_id

Перечислите приложения, в управляемые PM2:

pm2 list

Получить информацию о конкретном приложении, используя его App name:

pm2 info app_name

Монитор процесса PM2 можно вызвать с помощью monitподкоманды. Это отобразит статус приложения, нагрузку на процессор и использование памяти:

pm2 monit

При запуске pm2без каких-либо аргументов будет отображена страница справки с примером использования.

Теперь, когда ваше приложение Node.js запущено и управляется PM2, давайте настроим прокси-сервер.

Шаг 4 - Настройка Nginx в качестве прокси-сервера

Ваше приложение работает и прослушивает localhost, но вам нужно настроить способ доступа к нему ваших пользователей. Для этой цели мы настроим веб-сервер Nginx в качестве прокси-сервера.

Откройте файл для редактирования:/etc/nginx/sites-available/example.com

sudo nano /etc/nginx/sites-available/example.com

Внутри блока server у вас должен быть существующий location /блок. Замените содержимое этого блока конфигурацией ниже. Если ваше приложение настроено на прослушивание другого порта, укажите правильный номер порта:

/etc/nginx/sites-available/example.com

server {
...
    location / {
        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_cache_bypass $http_upgrade;
    }
...
}

Если это требуется, то вы можете добавить дополнительные locationблоки, чтобы обеспечить доступ к другим приложениям на том же сервере. Например, если вы также запускаете другое приложение Node.js на порту 3001, вы можете добавить следующий блок, чтобы разрешить доступ к нему через https://example.com/app2

/etc/nginx/sites-available/example.com - необязательно

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
...
}

Как только вы закончите изменение конфигурации Nginx для ваших приложений, сохраните файл и выйдите из редактора.

Убедитесь, что вы не допустили никаких синтаксических ошибок, набрав:

sudo nginx -t

Перезапустите Nginx:

sudo systemctl restart nginx

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

Заключение

Поздравляем! Теперь у вас есть приложение Node.js, работающее за Nginx на сервере Ubuntu 18.04.

Мы используем файлы cookie для предоставления наших услуг, а также для аналитики и маркетинга. Продолжая просматривать наш веб-сайт, вы соглашаетесь на использование нами файлов cookie.
ОК