Как я могу запустить node.js Express в производственном режиме через sudo? - PullRequest
8 голосов
/ 22 февраля 2012

Я использую пакет npm express версия 2.5.2 с версией узла .0.6.5. Кажется, я использую bash версии 4.1.5 в Debian 4.4.5.

Я пытаюсь запустить свой сервер в рабочем режиме, но он все еще работает в режиме разработки.

Я запускаю эти команды в моей оболочке bash:

$ export NODE_ENV=production
$ echo $NODE_ENV
production
$ sudo echo $NODE_ENV
production
$ sudo node bootstrap.js

У меня есть этот код внутри bootstrap.js:

var bootstrap_app = module.exports = express.createServer();
//...
console.log(bootstrap_app.settings.env);

и вот что я вижу в распечатанном виде:

development

Это проблема с моим использованием или с моей системой?

EDIT: Спасибо ThiefMaster за то, что он правильно определил, что эта проблема связана с моим работающим узлом как root. ThiefMaster предложил использовать iptables для переадресации с порта 80 на непривилегированный порт, но моя система выдает ошибку. Перемещение этого обсуждения на superuser.com или serverfault.com (ссылка для продолжения)

Ответы [ 2 ]

9 голосов
/ 22 февраля 2012

Большинство переменных окружения сбрасываются при использовании sudo по соображениям безопасности. Таким образом, вы не можете передать эту переменную среды на узел, не изменив файл sudoers, чтобы разрешить этой переменной проходить.

Однако, вы все равно не должны запускать узел как root Итак, вот хороший обходной путь:
Если вам просто нужен порт 80, запустите узел на непривилегированном порту и настройте пересылку iptables для сопоставления порта 80 с этим портом:

iptables -A PREROUTING -d 1.2.3.4/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.3.4.5:1234

Замените 1.2.3.4 на ваш общедоступный IP, 2.3.4.5, если запущен узел IP (может быть общедоступным или 127.0.0.1), и 1234, если запущен узел порта.


С достаточно новым ядром, которое поддерживает возможности, вы также можете предоставить исполняемому файлу node привилегию CAP_NET_BIND_SERVICE, используя в качестве пользователя root следующую команду:

setcap 'cap_net_bind_service=+ep' /usr/bin/node 

Обратите внимание, что это позволит любому пользователю в вашей системе открывать привилегированные порты, используя узел!

2 голосов
/ 12 декабря 2014
sudo NODE_ENV=production /usr/local/bin/node  /usr/local/apps/test/app.js
...