Просмотр журналов из NodeJS в EC2

#node.js #logging #amazon-ec2

#node.js #ведение журнала #amazon-ec2

Вопрос:

У меня есть единственный экземпляр EC2 в AWS, на котором работает HTTPS-сервер с NodeJS. Я запускаю свой сервер NodeJS с /etc/rc.local , поэтому он будет запускаться автоматически при каждой загрузке.

У меня есть 2 вопроса:

  1. Есть ли лучший способ запустить сервер https, прослушивающий порт 443, без использования sudo path/to/node myScript.js ? Какие риски у меня возникают, если я запускаю этот процесс от имени root?

  2. Где я могу увидеть свои журналы? При запуске скрипта из оболочки я вижу журналы процесса, но теперь, когда он запускается из rc.local , как мне получить доступ к выводам сервера?

Спасибо!

Ответ №1:

Запуск приложения с использованием sudo определенно не является хорошей практикой. Вы не должны запускать общедоступную службу с учетными данными root. Если в вашем приложении есть ошибка, и кто-то узнает об этом, существует опасность доступа к дополнительным службам на компьютере.

Ваше приложение должно запускаться с непривилегированного порта (например, 5000), а затем иметь nginx или apache в качестве обратного прокси, который будет перенаправлять трафик внутри вашего приложения, работающего на порту 5000. pm2 также предлагает что-то подобное:http://pm2.keymetrics.io/docs/tutorials/pm2-nginx-production-setup. При поиске в Интернете вы сможете найти руководства о том, как настроить nginx для работы по протоколу https и как перенаправлять весь трафик с http на https. Ваше приложение не должно знать о SSL-сертификатах и т.д. Помните, что модуль pm2 должен быть установлен локально в вашем проекте, и вы должны воспользоваться преимуществами package.json. Там вы можете определить задачу, которая будет загружать ваше приложение в рабочей среде, используя локальный модуль pm2. Преимущество заключается в том, что вам не нужно устанавливать модуль pm2 глобально, и вы больше не будете путаться с разрешениями и суперпользователями.

Я не думаю, что журнал где-то сохраняется, пока вы не скажете, что это произойдет в скрипте rc.local. Как вы запускаете процесс там? Что-то подобное должно перенаправить стандартный вывод в файл:

 node path/to/node myScript.js 2> /var/log/my-app.rc.local.log      # send stderr from rc.local to a log file`
  

Однако вы не используете регистратор в своем приложении? Я бы посоветовал выбрать один (их много, таких как bunyan, winston и т.д.) И заменить все ваши console.logs на регистратор. Затем вы можете явно определить в своем приложении, где будут сохраняться журналы, у вас могут быть разные уровни журналов и больше возможностей в целом.

Ответ №2:

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

У нас есть сильно используемое приложение nodejs в рабочей среде на AWS, на установке, отличной от Docker (на данный момент 😉 ).

У нас есть пользователь, выделенный для запуска приложения node, я думаю, что если вы запустите свой процесс node с root, у него будет root-доступ, а это небезопасно.

Для запуска приложения мы используем pm2 в качестве диспетчера процессов, это позволяет перезапускать процесс узла при сбое (и это произойдет) и масштабировать количество рабочих в соответствии с количеством ядер вашего экземпляра EC2. У вас также есть доступ к журналу всех рабочих, использующих ./path/to/node ./node_modules/.bin/pm2 logs , и вы можете отправить его куда угодно (от ELK до slack).

My2cents.