Рекомендации по использованию Node.js с портом 80 (Ubuntu/Linode)

Я настраиваю свой первый сервер Node.js на cloud Linux node, и я довольно новичок в деталях Linux admin. (Кстати, я не пытаюсь использовать Apache одновременно).

Все установлено правильно, но я обнаружил, что, если я не использую root login, я не могу слушать port 80 с помощью node. Однако я бы предпочел не запускать его как root для обеспечения безопасности.

Какова наилучшая практика:

  • Установите хорошие разрешения/пользователя для node, чтобы он был безопасным/изолированным?
  • Разрешить использовать порт 80 в этих ограничениях.
  • Запустите node и запустите его автоматически.
  • Обработка информации журнала, отправленной на консоль.
  • Любые другие общие проблемы обслуживания и безопасности.

Должен ли я пересылать трафик порта 80 на другой порт прослушивания?

Спасибо

Ответ 1

Порт 80

Что я делаю в своих облачных экземплярах, я перенаправляю порт 80 на порт 3000 с помощью этой команды:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Затем я запускаю свой Node.js на порт 3000. Запросы на порт 80 будут отображаться на порт 3000.

Вы также должны отредактировать файл /etc/rc.local и добавить эту строку минус sudo. Это добавит перенаправление при загрузке машины. Вам не нужно sudo в /etc/rc.local, потому что команды там выполняются как root, когда система загружается.

Журналы

Используйте forever, чтобы запустить Node.js с помощью. Он будет следить за тем, чтобы он перезапустился, если он когда-либо сработает, и он перенаправит консольные журналы в файл.

Запуск при загрузке

Добавьте свой Node.js start script в файл, отредактированный для перенаправления портов, /etc/rc.local. Это приведет к запуску Node.js script при запуске системы.

Цифровой океан и другие VPS

Это относится не только к Linode, но и к Digital Ocean, AWS EC2 и другим провайдерам VPS. Однако в системах на основе RedHat /etc/rc.local есть /ect/rc.d/local.

Ответ 2

Предоставить безопасное разрешение пользователя для использования порта 80

Помните, что мы НЕ хотим запускать ваши приложения в качестве пользователя root, но есть заминка: у вашего безопасного пользователя нет разрешения использовать HTTP-порт по умолчанию (80). Целью является публикация веб-сайта, который посетители могут использовать, перейдя на простой в использовании URL-адрес, например http://ip:port/

К сожалению, если вы не входите в систему под учетной записью root, вам обычно нужно использовать URL-адрес, например http://ip:port, где номер портa > 1024.

Многие люди застревают здесь, но решение легко. Там несколько вариантов, но это тот, который мне нравится. Введите следующие команды:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Теперь, когда вы сообщаете приложение Node, которое вы хотите запустить на порт 80, оно не будет жаловаться.

Отметьте эту ссылку

Ответ 3

Отключить привилегии root после привязки к порту 80 (или 443).

Это позволяет сохранить порт 80/443, сохраняя при этом запрет на выполнение запросов от имени пользователя root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Полный рабочий пример с использованием вышеуказанной функции:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Подробнее об этом полная ссылка.

Ответ 4

Для порта 80 (который был исходным вопросом), Даниэль точно прав. Недавно я перешел на https и должен был перейти от iptables к прокси-серверу nginx, управляющему сертификатами SSL. Я нашел полезный ответ вместе с gist gabrielhpugliese о том, как с этим справиться. В основном я

Надеюсь, это может спасти кому-то еще некоторые головные боли. Я уверен, что существует чистый способ node, но nginx был быстрым, и он работал.

Ответ 5

Предоставляет ли Linode некоторую "переднюю стену" или брандмауэр, где вы должны открыть порт для машины? Может быть, это будет хорошее место, чтобы найти лучшее решение, чем маршрутизация на каждой машине? Когда я развертываю сервер на Azure, я должен определить так называемые конечные точки. Конечная точка содержит открытый порт, частный порт (на машине) и протокол (TCP/UDP). Поэтому, если вы используете приложение на порту 3000 на сервере, оно доступно на порту 80, а маршрутизация выполняется платформой, а не машиной. Я также могу установить ACL на конечных точках.