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

Вступление

Node.js is an open source Javascript runtime environment for easily building server-side and networking applications. Платформа работает на Linux, OS X, FreeBSD и Windows, а ее приложения написаны на JavaScript. Node.js applications can be run at the command line but we will teach you how to run them as a service, so they will automatically restart on reboot or failure, so you can use them in a production environment.

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

Версию этого руководства для CentOS можно найтиhere.

Предпосылки

В этом руководстве используются два сервера Ubuntu 14.04with private networking (в одном центре обработки данных). Мы будем ссылаться на них под следующими именами:

  • app: сервер, на котором мы установим среду выполнения Node.js, ваше приложение Node.js и PM2.

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

Для этого урока можно использовать один сервер, но вам придется внести несколько изменений по пути. Просто используйте локальный IP-адрес, т.е. 127.0.0.1, где бы ни использовался частный IP-адрес сервераapp.

Вот схема того, что будет после установки этого урока:

Reverse Proxy to Node.js Application

Прежде чем вы начнете это руководство, у вас должен быть обычный пользователь без полномочий root с привилегиямиsudo, настроенными на обоих ваших серверах - это пользователь, под которым вы должны входить на свои серверы. Вы можете узнать, как настроить учетную запись обычного пользователя, выполнив шаги 1–4 в нашемinitial server setup guide for Ubuntu 14.04.

Если вы хотите иметь доступ к серверуweb через доменное имя, а не через его общедоступный IP-адрес, приобретите доменное имя и следуйте этим руководствам:

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

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

Мы установим последнюю версию LTS Node.js на серверapp.

На сервереapp давайте обновим списки пакетов apt-get с помощью этой команды:

sudo apt-get update

Затем используйтеapt-get для установки пакетаgit, от которого зависитnpm:

sudo apt-get install git

Перейдите вNode.js Downloads page и найдите ссылку для скачиванияLinux Binaries (.tar.xz). Щелкните правой кнопкой мыши и скопируйте адрес ссылки в буфер обмена. На момент написания последней версии LTS была4.2.3. Если вы предпочитаете установить последнюю стабильную версию Node.js, перейдите вappropriate page и скопируйте эту ссылку.

Перейдите в свой домашний каталог и загрузите исходный код Node.js сwget. Вставьте ссылку для скачивания вместо выделенной части:

cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

Теперь извлеките только что загруженный tar-архив в каталогnode с помощью следующих команд:

mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node

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

cd ~
rm -rf node-v*

Затем мы настроим глобальныйprefix дляnpm, гдеnpm создаст символические ссылки на установленные пакеты Node, где-то в вашем пути по умолчанию. Мы установим его на/usr/local с помощью этой команды:

mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc

Теперь мы готовы переместить двоичные файлыnode иnpm в место установки. Мы переместим его в/opt/node с помощью этой команды:

sudo mv node /opt/

На этом этапе вы можете сделатьroot владельцем файлов:

sudo chown -R root: /opt/node

Наконец, давайте создадим символические ссылки на двоичные файлыnode иnpm в вашем пути по умолчанию. Мы поместим ссылки в/usr/local/bin с помощью следующих команд:

sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

Убедитесь, что Node установлен, проверив его версию с помощью этой команды:

node -v

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

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

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

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

Если вы используете каплю DigitalOcean в качестве сервера, вы можете найти частный IP-адрес сервера через службуMetadata. На сервереapp используйте командуcurl, чтобы получить IP-адрес сейчас:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

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

Hello World Code

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

cd ~
vi hello.js

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

hello.js

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

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

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

Тестовое приложение (необязательно)

Если вы хотите проверить, работает ли ваше приложение, запустите эту командуnode на сервереapp:

node hello.js

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

Чтобы протестировать приложение, откройте другой сеанс терминала и подключитесь к серверуweb. Поскольку веб-сервер находится в той же частной сети, он должен иметь возможность получить доступ к частному IP-адресу сервераapp, используяcurl. Обязательно замените частный IP-адрес сервераapp наAPP_PRIVATE_IP_ADDRESS и порт, если вы его изменили:

curl http://APP_PRIVATE_IP_ADDRESS:8080

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

Output:Hello World

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

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

Установить PM2

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

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

sudo npm install pm2 -g

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

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

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

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

pm2 start hello.js

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

Output:┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

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

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

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

pm2 startup ubuntu

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

Output:[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

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

 sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

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

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

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

pm2 stop example

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

pm2 restart example

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

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

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

pm2 monit

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

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

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

На сервереweb давайте обновим списки пакетов apt-get с помощью этой команды:

sudo apt-get update

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

sudo apt-get install nginx

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

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

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

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

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

Это настраивает серверweb для ответа на запросы в своем корне. Предполагая, что наш сервер доступен вexample.com, доступ кhttp://example.com/ через веб-браузер отправит запрос на частный IP-адрес сервера приложений через порт8080, который будет получен и на который будет дан ответ от Приложение Node.js.

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

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

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

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

На сервереweb перезапустите Nginx:

sudo service nginx restart

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

Заключение

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

Кроме того, если вы хотите зашифровать передачу данных между вашим веб-сервером и вашими пользователями,here is a tutorial that will help you get HTTPS (TLS/SSL) support set up.

Related