NodejsExpressアプリをデプロイしています。これは、UNIXソケットを介してリクエストをプロキシするNginxサーバーと同じボックスで実行されます。ただし、この質問はNodejsに固有のものではありません。
Expressアプリはユーザーnodejs
として実行され、nginxはnginx
として実行されます。
私の計画は、Expressがソケットを配置するためにnodejs
が所有する_/sockets
_ディレクトリを作成し、ディレクトリのデフォルトACLを介してそれらのソケットへのnginx
アクセスを許可することです。これがばかげた考えであるかどうか私に遠慮なく教えてください、しかしそれが私の中心的な質問ではないことを覚えておいてください。
Rootとして実行して、ディレクトリにACLを作成します。
_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--
_
すごい!
ただし、Nodeがこのディレクトリ内のパスでlisten()
を呼び出してソケットを作成する場合、mask
がアクセスできないようにするACLnginx
を使用して作成されます。
_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
_
_/sockets
_でNodejsを使用して通常のファイルを作成する場合(たとえば、_fs.writeFile
_によって)、上記の_touch /sockets/testFile
_を実行したときと同じ権限で作成されるため、問題はないと思います。ノードのumask
の。
同様に、同等のコードを実行してpython
のソケットにバインドすると、結果は同じになるため、Node自体に問題があるとは思いません。
明らかに、これはNginxが私のExpressアプリと通信するのを止めています。誰かがなぜ解決できますか? :/サーバーはCentOS7を実行しています。
答えは、socket()は100%で文書化されているACLポリシーを実装しないlibc関数であるということです。
実験を通して、呼び出しプロセスのumaskを設定する必要があることがわかりました。これは、ACLルールに従って、ファイルを作成するときに重要ですnot必要な方法でソケットを正常に作成するには、次のことを行う必要があります。
umask 0002
setfacl -d -m user:nginx:rwx /sockets
setfacl -d -m group::rwx /sockets
setfacl -d -m mask::rwx /sockets