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

Вступление

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

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

Предпосылки

В этом руководстве предполагается, что у вас есть сервер Debian 8, сконфигурированный с пользователем без полномочий root с привилегиями + sudo +, как описано в https://www.digitalocean.com/community/tutorials/initial-server-setup-with -debian-8 [руководство по первоначальной настройке сервера для Debian 8].

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

Давайте начнем с установки среды выполнения 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.

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

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

Hello World Code

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

cd ~
nano hello.js

Вставьте следующий код в файл. Если вы хотите, вы можете заменить выделенный порт ++ в обоих местах (обязательно используйте порт без прав администратора, т.е. 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(, 'localhost');
console.log('Server running at http://localhost:/');

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

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

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

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

chmod +x ./hello.js

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

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

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

curl http://localhost:

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

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

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

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

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

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

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

pm2 startup systemd

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

Output[PM2] You have to run this command as root. Execute the following command:

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

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

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

systemctl status pm2

Подробный обзор systemd см. По адресу Systemd Essentials: работа со службами, единицами и Журнал.

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

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

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

pm2 stop

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

pm2 restart

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

pm2 list

Дополнительную информацию о конкретном приложении можно найти, используя подкоманду + info + (укажите имя_приложения PM2 _ или id):

pm2 info

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

pm2 monit

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

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

Теперь, когда ваше приложение работает и прослушивает * localhost *, вам нужно настроить способ доступа пользователей к нему. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси-сервера. Из этого туториала вы сможете настроить сервер Nginx с нуля. Если у вас уже есть настройка сервера Nginx, вы можете просто скопировать блок «+ location +» в выбранный вами блок сервера (убедитесь, что местоположение не конфликтует с любым существующим контентом вашего веб-сервера).

Сначала установите Nginx, используя apt-get:

sudo apt-get install nginx

Теперь откройте файл конфигурации блока сервера по умолчанию для редактирования:

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

Удалите все в файле и вставьте следующую конфигурацию. Обязательно замените свое собственное доменное имя на директиву + server_name +. Кроме того, измените порт (++), если ваше приложение настроено на прослушивание другого порта:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   listen 80;

   server_name ;

   location / {
       proxy_pass http://localhost:;
       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 +, доступ к + http: // example.com / + через веб-браузер отправит запрос на + hello.js +, прослушивая порт + 8080 + на * localhost *.

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

Конфигурация Nginx - Дополнительные места

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

Затем разрешите трафик на Nginx через брандмауэр, если он у вас включен.

Если вы используете * ufw *, вы можете использовать следующую команду:

sudo ufw allow 'Nginx Full'

С * ufw * вы всегда можете проверить статус с помощью следующей команды:

sudo ufw status

Если вместо этого вы используете * IPTables *, вы можете разрешить трафик в Nginx с помощью следующей команды:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

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

sudo iptables -S

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

Отсюда вы должны продолжить защищать свои настройки, прочитав How Защищать Nginx с помощью Let’s Encrypt на Debian 8.

Заключение

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

Related