Я следую пошаговому руководству, которое проведет вас через настройку узла на машине 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
часто бывает лучшим решением.