Лучшие практики при запуске Node.js с портом 80 (Ubuntu / Linode)
Я настраиваю свой первый Node.js
сервер на cloud Linux node
и я довольно новичок в деталях Linux admin
, (Кстати, я не пытаюсь использовать Apache одновременно.)
Все установлено правильно, но я обнаружил, что если я не использую root login
Я не могу слушать port 80
с узлом. Однако я бы не хотел запускать его как root по соображениям безопасности.
Какова лучшая практика для:
- Установить хорошие права / пользователя для узла, чтобы он был безопасным / изолированным?
- Разрешить использование порта 80 в рамках этих ограничений.
- Запустите узел и запустите его автоматически.
- Обработка информации журнала, отправленной на консоль.
- Любые другие вопросы общего обслуживания и безопасности.
Должен ли я перенаправлять трафик порта 80 на другой порт прослушивания?
Спасибо
5 ответов
Порт 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 в файл, который вы отредактировали для перенаправления портов, /etc/rc.local
, Это запустит ваш скрипт запуска Node.js при запуске системы.
Digital Ocean и другие VPS
Это относится не только к Linode, но и к Digital Ocean, AWS EC2 и другим VPS-провайдерам. Однако на системах на базе RedHat /etc/rc.local
является /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\``
Теперь, когда вы сообщаете приложению 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. Я нашел полезный ответ вместе со gabrielhpugliese о том, как справиться с этим. В основном я
Создан запрос на подпись сертификата SSL (CSR) через OpenSSL
openssl genrsa 2048 > private-key.pem openssl req -new -key private-key.pem -out csr.pem
- Получил настоящий сертификат из одного из этих мест (я использовал Comodo)
- Установленный nginx
Изменил
location
в/etc/nginx/conf.d/example_ssl.conf
вlocation / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; }
Отформатировал сертификат для nginx
cat
-связать отдельные сертификаты вместе и связаны с ним в моем nginxexample_ssl.conf
файл (и некомментированные вещи, избавился от "примера" в названии,...)ssl_certificate /etc/nginx/ssl/cert_bundle.cert; ssl_certificate_key /etc/nginx/ssl/private-key.pem;
Надеюсь, что это может спасти кого-то еще от головной боли. Я уверен, что есть способ сделать это на чистом узле, но nginx был быстрым и сработал.
Предоставляет ли Linode некую "переднюю стенку" или брандмауэр, где вы должны открыть порт для машины? Может быть, это будет хорошее место, чтобы найти лучшее решение, чем маршрутизация на каждой машине? При развертывании сервера в Azure я должен определить так называемые конечные точки. Конечная точка содержит публичный порт, частный порт (на компьютере) и протокол (TCP/UDP). Таким образом, если вы запускаете приложение на порту 3000 на сервере, оно доступно на порту 80, и маршрутизация выполняется на платформе, а не на машине. Я также могу установить ACL на конечных точках.