Рекомендации при запуске Node.js с портом 80 (Ubuntu / Linode) [закрыто]

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

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

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

  1. установите хорошие разрешения / пользователя для узла, чтобы это безопасно / песочница?
  2. разрешить использование порта 80 в рамках этих ограничений.
  3. запустите узел и запустите его автоматически.
  4. обрабатывать информацию журнала, отправленную в консоль.
  5. любые другие общие проблемы обслуживания и безопасности.

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

спасибо

5 ответов


порт 80

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

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

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

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

журналы

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

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

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

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

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


Дайте Безопасное Разрешение Пользователя На Использование Порта 80

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

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

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

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

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

проверить это ссылка


отбросьте привилегии 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());
});

см. более подробную информацию на этом полная ссылка.


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

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


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