NodeJS в production

NodeJS в production — запуск проекта, разработка которого завершена на сервере, к которому есть общий доступ. Контент должен отдаваться при запросе, поступившему на стандартный порт веб-сервера. Также нужна отказоустойчивость на случай прерывания процесса NodeJS.

 

Сначала настроим проксирование запросов с порта 80 на порт 3000, для этого будем использовать Nginx.

apt-get install nginx

 

Создаем конфигурационный файл

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

server {
listen *:80;
server_name example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://123.123.123.123:3000;
}
}

 

Добвляем символьную ссылку в каталоге /etc/nginx/sites-enabled/

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

 

Даем команду на перечитывание конфигурационных файлов

nginx -s reload

 

Теперь все запросы, приходящие на стандартный порт 80 будут перенаправляться на порт 3000. Т.е. посетители сайта стандартным образом вбивая в браузере имя example.com будут попадать на порт 3000 и видеть работающее приложение.

 

Теперь нужно добиться отказоустойчивости, т.е. автоматического запуска процесса NodeJS в случае если он завершился.

Завершиться он может от возникновения нагрузки на сервере или кратковременного отключения питания.

 

Смоделировать ситуацию можно выполнив в консоли pkill nodejs

 

Управление процессом NodeJS при помощи Systemd

На Debian 9 и современных Ubuntu systemd используется по-умолчанию, для любого другого дистрибутива можно установить systemd. Добавим сервис для  приложения.

 

mcedit /etc/systemd/system/nodeapp.service

[Service]
ExecStart=/usr/bin/nodejs /var/node/bin/www
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nodeapp
User=root
Group=root
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

 

 

/usr/bin/nodejs здесь — бинарный файл NodeJS,  /var/node/bin/www — каталог из которого запускается приложение.

 

Завершаем процесс в случае если он существовал

pkill nodejs

 

Сейчас требуется активировать сервис и запустить его

systemctl enable nodeapp.service

Created symlink /etc/systemd/system/multi-user.target.wants/nodeapp.service → /etc/systemd/system/nodeapp.service.

 

Управление производится стандартными командами start/stop/restart

systemctl start nodeapp.service

 

Просматриваем существующие TCP соединения

netstat -nltp | grep 3000

tcp6 0 0 :::3000 :::* LISTEN 19960/nodejs

 

Останавливаем сервис

systemctl stop nodeapp.service

 

Сейчас на 3000 порту ничего нет и приложение стало недоступно

netstat -nltp | grep 3000

 

Вновь запускаем

systemctl start nodeapp.service

netstat -nltp | grep 3000

tcp6 0 0 :::3000 :::* LISTEN 19981/nodejs

 

Важно заметить идентификатор процесса 19981

 

pkill node

netstat -nltp | grep 3000

tcp6 0 0 :::3000 :::* LISTEN 19992/nodejs

 

После pkill node идентификатор сменился, это означает, что предыдущий процесс завершился новый при этом сразу был запущен systemd.

 

Отказоустойчивость на случай OOM или принудительной перезагрузки, таким образом обеспечена; приложение NodeJS в production полностью запущено и обслуживать запросы пользователей.

 

Вместо systemd можно использовать аналоги — например, supervisor