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 в production при помощи Systemd


На Debian и современных 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

Сказать спасибо