Как настроить приложение Node.js для производства в Ubuntu 16.04

Вступление

Node.js is an open source JavaScript runtime environment for easily building server-side and networking applications. Платформа работает на Linux, OS X, FreeBSD и Windows. Node.js applications can be run at the command line, but we’ll focus on running them as a service, so that they will automatically restart on reboot or failure, and can safely be used in a production environment.

В этом руководстве мы рассмотрим настройку готовой к работе среды Node.js на одном сервере Ubuntu 16.04. Этот сервер будет запускать приложение Node.js, управляемое PM2, и предоставлять пользователям безопасный доступ к приложению через обратный прокси-сервер Nginx. Сервер Nginx будет предлагать HTTPS, используя бесплатный сертификат, предоставляемый Let’s Encrypt.

Предпосылки

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

Когда вы выполните предварительные требования, у вас будет сервер, обслуживающий страницу-заполнитель Nginx по умолчанию вhttps://example.com/.

Давайте начнем с установки среды выполнения Node.js на вашем сервере.

Установить Node.js

Мы установим последнюю версию LTS Node.js, используя архивы пакетовNodeSource.

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

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

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

nano nodesource_setup.sh

И запустите скрипт подsudo:

sudo bash nodesource_setup.sh

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

sudo apt-get install nodejs

Пакетnodejs содержит двоичный файлnodejs, а такжеnpm, поэтому вам не нужно устанавливатьnpm отдельно. Однако для того, чтобы некоторые пакетыnpm работали (например, те, которые требуют компиляции кода из исходного кода), вам необходимо установить пакетbuild-essential:

sudo apt-get install build-essential

Среда выполнения Node.js теперь установлена ​​и готова к запуску приложения! Давайте напишем приложение Node.js.

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

Создать приложение Node.js

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

Hello World Code

Сначала создайте и откройте приложение Node.js для редактирования. В этом руководстве мы будем использоватьnano для редактирования примера приложения под названиемhello.js:

cd ~
nano hello.js

Вставьте следующий код в файл. Если вы хотите, вы можете заменить выделенный порт8080 в обоих местах (обязательно используйте порт без прав администратора, т.е. 1024 или выше):

hello.js

#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');

Теперь сохраните и выйдите.

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

Тестовое приложение

Чтобы протестировать ваше приложение, отметьте исполняемый файлhello.js:

chmod +x ./hello.js

И запустить его так:

./hello.js
OutputServer running at http://localhost:8080/

[.note] #Note: Запуск приложения Node.js таким образом заблокирует дополнительные команды до тех пор, пока приложение не будет убито нажатиемCtrl-C.
#

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

curl http://localhost:8080

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

OutputHello World

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

Убедившись, что оно работает, закройте приложение (если вы еще этого не сделали), нажавCtrl+C.

Установить PM2

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

Мы будем использоватьnpm, менеджер пакетов для модулей Node, который устанавливается вместе с Node.js, чтобы установить PM2 на наш сервер. Используйте эту команду для установки PM2:

sudo npm install -g pm2

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

Управление приложением с помощью PM2

PM2 прост и удобен в использовании. Мы рассмотрим несколько основных применений PM2.

Запустить приложение

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

pm2 start hello.js

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

Output[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello    │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
 Use `pm2 show ` to get more details about an app

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

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

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

pm2 startup systemd

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

Output[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Запустите сгенерированную команду (аналогично выделенному выше выходу, но с вашим именем пользователя вместоsammy), чтобы настроить PM2 для запуска при загрузке (используйте команду из собственного вывода):

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

Это создаст systemdunit, которая запускаетpm2 для вашего пользователя при загрузке. Этот экземплярpm2, в свою очередь, запускаетhello.js. Вы можете проверить статус модуля systemd с помощьюsystemctl:

systemctl status pm2-sammy

Подробный обзор systemd см. ВSystemd Essentials: Working with Services, Units, and the Journal.

Другое использование PM2 (опционально)

PM2 предоставляет много подкоманд, которые позволяют вам управлять или искать информацию о ваших приложениях. Обратите внимание, что запускpm2 без каких-либо аргументов отобразит страницу справки, включая пример использования, которая описывает использование PM2 более подробно, чем этот раздел руководства.

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

pm2 stop app_name_or_id

Перезапустите приложение с помощью этой команды (укажите PM2App name илиid):

pm2 restart app_name_or_id

Список приложений, которыми в настоящее время управляет PM2, также можно просмотреть с помощью подкомандыlist:

pm2 list

Более подробную информацию о конкретном приложении можно найти с помощью подкомандыinfo (укажите PM2App name илиid):

pm2 info example

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

pm2 monit

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

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

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

В предварительном руководстве мы настроили нашу конфигурацию Nginx в файле/etc/nginx/sites-available/default. Откройте файл для редактирования:

sudo nano /etc/nginx/sites-available/default

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

/etc/nginx/sites-available/default

. . .
    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

Это настраивает сервер для ответа на запросы в его корне. Предполагая, что наш сервер доступен наexample.com, доступ кhttps://example.com/ через веб-браузер отправит запрос наhello.js, прослушивая порт8080 наlocalhost.

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

/etc/nginx/sites-available/default — Optional

    location /app2 {
        proxy_pass http://localhost:8081;
        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;
    }

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

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

sudo nginx -t

Далее перезапустите Nginx:

sudo systemctl restart nginx

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

Заключение

Поздравляем! Теперь у вас есть приложение Node.js, работающее за обратным прокси-сервером Nginx на сервере Ubuntu 16.04. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться. Удачи в разработке Node.js!

Related