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