Node.js - несколько приложений
Размещение нескольких приложений Node.js на одном VPS (при помощи Nginx, Forever и Crontab)
Требования
Чтобы следовать данному руководству, необходимо предварительно установить Nginx и Node.js. чтобы получить инструкции по установке данного ПО, читайте статьи:
Установка Nginx; Установка Node.js. Кроме того, вместо http://[ip-адрес-vps]:[порт] лучше использовать домен, подключив к нему запущенный сервис Node.js.
Запуск приложения Node.js с помощью Forever
Forever – это простой командный инструмент, который гарантирует, что скрипт/приложение будет работать «вечно». То есть если в результате ошибки происходит сбой приложения, forever найдет способ исправить ее и перезапустит приложение.
Установите инструмент forever глобально, это займет считанные секунды:
npm install forever -g
Чтобы запустить скрипт с помощью forever, выполните следующие действия:
перейдите к приложению Node.js:
cd /path/to/your/node/app/
и запустите файл main.js через forever:
forever start --spinSleepTime 10000 main.js
где —spinSleepTime 10000 обозначает минимальный аптайм (в миллисекундах) между запусками аварийного скрипта. Эта команда сработает практически во всех случаях.
Теперь направьте браузер на http://[ip-адрес-vps]:[порт], чтобы увидеть приложение в действии.
Подключение домена к приложению Node.js
Теперь нужно добавить запись DNS в панель управления, чтобы подключить доменное имя к виртуальному выделенному серверу.
Итак, выполните следующие действия:
Войдите на сервер;
В панели найдите раздел DNS;
Добавьте домен, нажав кнопку ‘Add Domain, укажите нужный VPS и доменное имя;
Скопируйте полученный Nameserver и внесите его в запись DNS в панели управления.
Примечание: эти изменения не вступят в силу моментально, поскольку обработка может занять до 24 часов.
Подключение домена к сервису Nginx
В данном разделе речь пойдет о подключении обратного прокси-серера с помощью Nginx.
Для начала нужно при помощи наиболее удобного текстового редактора создать файл для домена в /etc/nginx/conf.d/. По соображениям совместимости файл должен быть назван доменным именем.
nano /etc/nginx/conf.d/example.com.conf
Примечание: файл можно назвать как угодно, важной часть имени файла является расширение .conf.
Теперь нужно скопировать следующий фрагмент кода и вставить его в только что созданный файл:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:{YOUR_PORT}; 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; } }
Просто замените your-domain.com своим доменным именем, а YOUR_PORT – номером порта, который прослушивает приложение Node.js.
Примечание: чтобы иметь возможность ссылаться на несколько доменов одного приложения Node.js (например, www.example.com и example.com) необходимо добавить следующий код в раздел http файла /etc/nginx/nginx.conf:
server_names_hash_bucket_size 64;
Когда изменения DNS вступят в силу, направьте веб-браузер на доменное имя; это должно открыть работающее в сети приложение.
Запуск приложения Node.js при перезагрузке
Инструмент forever очень полезен при аварийных сбоях приложения; но что делать при перезагрузке сервера?
В таком случае нужно использовать простую таблицу crontab, которая может предотвратить неожиданные простои приложения.
Создайте файл по имени starter.sh в домашнем каталоге приложения и скопируйте в него следующий код:
#!/bin/sh if [ $(ps -e -o uid,cmd | grep $UID | grep node | grep -v grep | wc -l | tr -s "\n") -eq 0 ] then export PATH=/usr/local/bin:$PATH forever start --sourceDir /path/to/your/node/app main.js >> /path/to/log.txt 2>&1 fi
где main.js нужно заменить именем главного скрипта приложения.
Чтобы этот скрипт запускался при каждой перезагрузке сервера, нужно отредактировать crontab:
crontab -e
внеся в нее следующий код:
@reboot /path/to/starter.sh
Затем укажите абсолютный путь к файлу starter.sh.
Примечание: перейдите в местонахождение файла starter.sh и выведите текущий каталог с помощью pwd.
Повторите все вышеописанные действия для каждого домена и сервиса.