Я развертываю приложение Nodejs Express. Он будет работать как на том же компьютере, что и сервер Nginx, который будет передавать ему запросы через сокет unix. Однако этот вопрос не относится к Nodejs.
Экспресс-приложение запускается от имени пользователя nodejs
, а nginx работает как nginx
.
Я планирую создать ] / sockets
каталог, принадлежащий nodejs
, чтобы Express мог вставлять сокеты и предоставлять nginx
доступ к этим сокетам через ACL по умолчанию для каталога. Не стесняйтесь сказать мне, является ли это глупой идеей, но имейте в виду, что это не мой основной вопрос.
Я создаю ACL в каталоге, запустив от имени root,
setfacl -Rd --mask -m nginx:rw /sockets
setfacl -R --mask -m nginx:rwX /sockets
В этом каталоге есть следующие ACL: (табуляция мной для разборчивости вопроса)
# file: /sockets
# owner: nodejs
# group: root
user: : rwx
user: nginx: rwx
group: : r-x
mask: : rwx
other: : r-x
default: user: :rwx
default: user:nginx:rw-
default:group: :r-x
default: mask: :rwx
default:other: :r-x
Если, работая как nodejs
, я пишу в файл, он создается соответствующим образом:
sudo -su nodejs
touch /sockets/testFile
getfacl /sockets/testFile
# file: /sockets/testFile
# owner: nodejs
# group: nodejs
user: :rw-
user:nginx:rw-
group: :r-x #effective:r--
mask: :rw-
other: :r--
Отлично!
Однако, если Узел создает сокет, вызывая listen ()
на пути в этом каталоге, он создается с маской ACL
, которая предотвращает ] nginx
от доступа к нему.
const e = require('express')()
e.listen('/sockets/testSocket', (e) => console.error(e))
getfacl /sockets/testSocket
# file: /sockets/testSocket
# owner: nodejs
# group: nodejs
user: :rwx
user:nginx:rw- #effective:r--
group: :r-x
mask: :r-x
other: :r-x
Если я создам обычный файл с помощью Nodejs в / sockets
(например, с помощью fs.writeFile
), он будет создан с теми же разрешениями, что и когда я запускал touch / sockets / testFile
выше, поэтому я не думаю, что это проблема umask узла
.
Аналогично, если я запускаю эквивалентный код для привязки к сокету в python
результаты такие же, поэтому я не думаю, что это проблема самого Node.
Очевидно, это мешает Nginx взаимодействовать с моим приложением Express. Кто-нибудь может понять, почему? : / На сервере работает CentOS 7.
Die Antwort lautet, dass socket () eine libc-Funktion ist, die die zu 100% dokumentierten ACL-Richtlinien nicht implementiert.
Durch Experimente habe ich festgestellt, dass Sie die Umask festlegen müssen Für den aufrufenden Prozess, der gemäß den ACL-Regeln beim Erstellen von Dateien keine Rolle spielen sollte, und um Sockets erfolgreich nach Ihren Wünschen zu erstellen, müssen Sie:
umask 0002
setfacl -d -m user:nginx:rwx /sockets
setfacl -d -m group::rwx /sockets
setfacl -d -m mask::rwx /sockets