0

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 を設定するときに間違っていることはありますか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

/etc/environment次のように、環境変数 GEVENT_LOOP が既にエクスポートされていることがわかりました。

export GEVENT_LOOP=pypycore.loop

pypy で gevent を実行するには、上記のエクスポートを含むいくつかのハックが必要です。

しかし、Monit の「start_program」コマンド エントリで手動でエクスポートする必要があったため (最後に Monit を使用しました)、結果のコマンドは次のようになります。

/bin/bash -c 'cd /path/to/project/api && export GEVENT_LOOP=pypycore.loop && /path/to/project/env/bin/gunicorn -c settings.py my-api:my_api'
于 2015-06-11T16:13:17.720 に答える