Назад | Перейти на главную страницу

Разрешение запуска приложений node.js на 80-м порту

Я следую пошаговому руководству, которое проведет вас через настройку узла на машине ubuntu. Я нахожусь на том этапе, когда вы настраиваете систему, чтобы позволить узлу работать на порту 80. Он (а также несколько других руководств, на которые я смотрел) рекомендует выполнить следующую команду:

sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

Это возвращает следующую ошибку:

Failed to set capabilities on file `/usr/local/bin/node' (Invalid argument)
The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

Есть идеи, что может вызвать эту ошибку?

чтобы избежать этой ошибки, вы можете разрешить исполняемый файл без символической ссылки с помощью which node, как полный пример:

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

команда which показывает полный путь команд оболочки.

Догадаться. Однако оказалось, что я установил узел, создал символьную ссылку в / usr / bin / node, которая указала на другую символьную ссылку в / etc / alternatives / node, которая указала на другую символьную ссылку в / usr / bin / nodejs.

Выполнение команды для / usr / bin / nodejs сработало.

FWIW, другой вариант - использовать authbind. Authbind использует немного другой механизм для достижения целей, аналогичных CAP_NET_BIND_SERVICE. Т.е. позволяет непривилегированным приложениям использовать привилегированные порты.

Установить из apt:

sudo apt-get update && sudo apt-get install authbind

Предполагая, что желаемый app.js работает от имени непривилегированного пользователя "user", и вы хотите привязаться к порту 80:

sudo touch /etc/authbind/byport/80
sudo chown user:user /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80

Затем запустите ваше приложение следующим образом:

authbind node app.js

Если вместо этого вы хотите использовать что-то вроде «навсегда» (по сути, демонизирует приложения узлов), то вот что нужно:

authbind --deep forever app.js

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

The filesystem must support attaching capabilities to an executable file, so that a process gains those capabilities when the file is executed.

http://man7.org/linux/man-pages/man7/capabilities.7.html

Это особенно верно в отношении Docker. Docker использует серверную часть хранилища BTRFS или AUFS, но также может использовать оверлейные файлы. Overlayfs поддерживает установку ограничений, а BTRFS и AUFS (см. Ниже) - нет.

https://github.com/moby/moby/issues/30557

Если вам нужно запускать образы с AUFS, вы должны запустить ядро ​​с CONFIG_AUFS_XATTR=y.

По этой причине authbind часто бывает лучшим решением.