Falcon Frameworkを使用してPythonで構築された小さなrest APIがあり、gunicorn + geventおよびpypy 2.3の仮想環境で実行されます(gevent@pypy-hacksおよびgevent-on-pypy/pypycoreからpipパッケージを正常にインストールしました)。アプリケーションに「スーパーバイザー」を追加したかったので、最初に Supervisord をインストールし、手順に従って起動して実行しました。
サーバーで最初にしたことは、API を開始するコマンドをテストすることでした。正常に実行され、問題なく API を使用できました。コマンドは次のとおりです。
/bin/bash -c 'cd /path/to/project/api && /path/to/project/env/bin/gunicorn -c settings.py my-api:my_api'
注:settings.pyでdaemon=False
、スーパーバイザーがコマンドを「フォアグラウンド」で実行し、デーモン化しないことを要求していることがわかったので、パラメーターを設定しました。
それが機能したら、先に進み/etc/supervisor/conf.d/my_api.conf
、「コマンド」パラメーターを上記のコマンドとして設定してアプリの conf ファイルを作成し、正常に実行しました。Supervisord を使用して API を起動しようとすると失敗し、API のログには次のエラーが記録されていました。
Traceback (most recent call last):
File "/path/to/project/env/site-packages/gunicorn/arbiter.py", line 507, in spawn_worker
worker.init_process()
File "/path/to/project/env/site-packages/gunicorn/workers/ggevent.py", line 185, in init_process
self.patch()
File "/path/to/project/env/site-packages/gunicorn/workers/ggevent.py", line 74, in patch
_sock=s))
File "/path/to/project/env/site-packages/gevent/socket.py", line 240, in __init__
self.hub = get_hub()
File "/path/to/project/env/site-packages/gevent/hub.py", line 169, in get_hub
hub = _threadlocal.hub = hubtype(*args, **kwargs)
File "/path/to/project/env/site-packages/gevent/hub.py", line 268, in __init__
loop_class = _import(self.loop_class)
File "/path/to/project/env/site-packages/gevent/hub.py", line 198, in _import
return _import(path[-1])
File "/path/to/project/env/site-packages/gevent/hub.py", line 210, in _import
x = __import__(module)
ImportError: No module named gevent.core
そのため、コマンドを手動で実行するとうまくいくことに驚きましたが、スーパーバイザーが実行しようとすると、上記のエラーがスローされました。
多くの試行錯誤の後、monit をインストールして API を監視できるかどうかを確認することにし、前述のコマンドとして「start program」パラメーターを指定して正常にセットアップしました。
monit がまったく同じエラーをスローしたことに驚きました。つまり、これは、私の API (pypy + gunicorn + gevent) の性質上、周囲の監視ソフトウェアによって監視されないということですか?
Supervisord/monit を設定するときに間違っていることはありますか?
どんな助けでも大歓迎です。