web-dev-qa-db-ja.com

スーパーバイザーをルートとして起動するかどうか。

スーパーバイザは3.0で実行されています:

pip freeze | grep supervisor
supervisor==3.0

コマンドラインからSupervisordを起動する場合:

Sudo $VIRTENV/supervisord --nodaemon --configuration $PATH_TO_CONFIG/supervisord.conf

私はこのエラーを受け取ります:

2013-11-11 23:30:50,205 CRIT Supervisor running as root (no user in config file)

しかし、Sudoなしではスーパバイザを起動できません。

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

それに対処する正しい方法は何ですか?

(rootとして起動したが、supervisord.confの[supervisord]セクションでuser = foobarに設定した場合、同じエラーが発生します)

更新:ここに私のSupervisord.confがあります

[unix_http_server]
file = /opt/run/supervisord.sock

[inet_http_server]
port = 9001
username = foobar
password = foobar

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisord]
logfile = /opt/logs/supervisord.log
loglevel = debug
pidfile = /opt/run/supervisord.pid

[supervisorctl]

[program:foo1]
user = foobar
autostart = True
autorestart = True
command = foo1
stdout_logfile = /opt/logs/foo1.stdout.log
stderr_logfile = /opt/logs/foo1.stderr.log
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB

[program:foo2]
user = foobar
autostart = true
autorestart = true
command = foo2
priority = 100
stdout_logfile_backups = 0
stderr_logfile_backups = 0
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile = /opt/logs/foo2.stdout.log
stderr_logfile = /opt/logs/foo2.stderr.log
33
kev

スーパーバイザーは、処理の前にUNIXユーザーアカウントに切り替えます。

使用するユーザーアカウントの種類を指定し、デーモンをルートとして実行する必要がありますが、設定ファイルでユーザーを指定する必要があります

例:

[program:myprogram]
command=gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker app.wsgi:application -b 127.0.0.1:8000
directory=/opt/myprogram
user=user1
autostart=true
autorestart=true
redirect_stderr=True

詳細については、 http://supervisord.org/configuration.html#program-x-section-values をご覧ください

24
Jan Vorcak

スーパーバイザーをルートとして起動する場合、セキュリティ上の理由からスーパーバイザーがドロップするユーザーを指定する必要があります

スーパーバイザードキュメント( http://supervisord.org/configuration.html )から:

user
If supervisord is run as the root user, switch users to this UNIX user account before doing any meaningful processing. 
This value has no effect if supervisord is not run as root.

これをconfファイルに入れてください:

[supervisord]
user=nobody

ユーザーは存在するユーザーである必要がありますが、Sudo権限はありません(誰も作業できません)。

13
Rylan

私にとっては、非rootユーザーとして実行中にこのエラーを受け取りました。

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

これは、そのユーザーにsockファイルを保持しているディレクトリの名前を変更した後、なくなりました。

あなたの場合:

[unix_http_server]
file = /opt/run/supervisord.sock

chown username /opt/run/、またはユーザーが所有する別のディレクトリをファイルにポイントします。

これからこのアプローチを学びました link


さらに、システム管理者は、作成したinit.dスクリプトをインストールしました。 init.dスクリプトはrootとして実行されますが、スクリプトは次のコマンドでmyuserでスーパーバイザーを開始できます:

SUPERVISORD=/path/to/supervisord
PIDFILE=/path/to/supervisord.pid
OPTIONS='-c /path/to/supervisord.conf'
daemon --pidfile=$PIDFILE --user=myuser $SUPERVISORD $OPTIONS
9
Matthew Moisen

あなたが得た:

私の理解では、あなたはあなたを悩ませているこのCRITメッセージを受け取りました:

Rootとして実行されているCRITスーパーバイザー(構成ファイルにユーザーがいない)

括弧内の単語は手がかりです。このメッセージは、スーパーバイザをルートとして意図せずに実行している可能性があることを示しています

これを行う:

そのため、ソリューションは非常に簡単です。これを意図的に行っていることをスーパーバイザーに伝えてください。
(in /etc/supervisor/supervisord.conf

[supervisord]
user = root

Supervisordをrootとして実行すると、uidを割り当てたユーザー(root)に設定します。 ( #308

重要じゃない:

ただし、次のメッセージが表示される場合があります。

CRIT uidをユーザー0に設定

心配する必要はありません。このメッセージはCRITレベルではなく、INFOレベルである必要があります。 ( #69

8
Kyan