Gunicorn: 問題を引き起こすカスタムワーカー

作成日 2017年07月11日  ·  4コメント  ·  ソース: benoitc/gunicorn

こんにちは、

サーバーからクライアント証明書情報を取得し、それを次のようにFlaskアプリに取り込むようにカスタムワーカーを設定しようとしています。

gunicorn_options.py:

import multiprocessing
import os
from mypackage.client_auth_worker import CustomSyncWorker

def config_dir():
    return os.path.dirname(os.path.realpath(__file__))

bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = CustomSyncWorker
timeout = 30
ca_certs = os.path.join(config_dir(), 'ca.cert.pem')
certfile = os.path.join(config_dir(), 'server.cert.pem')
keyfile = os.path.join(config_dir(), 'server.key.pem')
cert_reqs = 2
do_handshake_on_connect = True

custom_auth_worker.py:

from gunicorn.workers.sync import SyncWorker

class CustomSyncWorker(SyncWorker):
    def handle_request(self, listener, req, client, addr):
        subject = dict(client.getpeercert().get('subject')[0])
        headers = dict(req.headers)
        headers['X-USER'] = subject.get('commonName')
        print(headers)
        req.headers = list(headers.items())
        super(CustomSyncWorker, self).handle_request(listener, req, client, addr)

次の例外が発生し続けます。

File "/Users/me/.virtualenvs/mypackage/lib/python3.5/site-packages/gunicorn/arbiter.py", line 162, in start
    self.log.info("Using worker: %s", self.cfg.worker_class_str)
  File "/Users/me/.virtualenvs/mypackage/lib/python3.5/site-packages/gunicorn/config.py", line 68, in __getattr__
    raise AttributeError("No configuration setting for: %s" % name)
AttributeError: No configuration setting for: worker_class_str

これを修正するために複数のことを試みました。たとえば、 gunicorn_options.pyファイルにworker_class_strを設定しようとしましたが、問題は解決しませんでした。 次に、実際のパッケージのコードを調べ始めました。 gunicorn/arbiter.pyファイルを変更して次の行をコメントアウトすると、 self.log.info("Using worker: %s", self.cfg.worker_class_str)すべて正常に機能し、CustomSyncWorkerは正常に読み込まれます。 X-USERヘッダーとすべてを設定することになっているようにその仕事をします。

これはバグですか? それとも私は劇的に間違ったことをしているだけですか? 物事を強制的に機能させるためだけにコードをローカルで変更することを自分自身に任せるべきではないと思います...

Feedback Requested

最も参考になるコメント

worker_class文字列を渡す必要があると思います。 だから変化する

worker_class = CustomSyncWorker

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

あなたの問題を解決するでしょう。

全てのコメント4件

worker_class文字列を渡す必要があると思います。 だから変化する

worker_class = CustomSyncWorker

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

あなたの問題を解決するでしょう。

また、これはhttp://docs.gunicorn.org/en/stable/settings.html#worker-classですでに文書化されていることに注意してください。

オプションで、gunicorn.workers.base.WorkerのサブクラスへのPythonパスをGunicornに与えることで、独自のワーカーを提供できます。 この代替構文は、geventクラスgunicorn.workers.ggevent.GeventWorkerをロードします。

もちろん、より良い提案があれば、いつでもドキュメントを改善することができます。

報告ありがとうございます!

私はそれを試したと思いますが、うまくいきませんでしたが、確信が持てず、文字列を別の方法で記述した可能性があります( "mypackage.client_auth_worker:CustomSyncWorker"形式など)。 今日遅くに家に帰ったらチェックしなければなりません。

それとは別に、私がそのドキュメントを見たことがあり、それが私がすべきことであることが明確ではなかったという理由だけで、ドキュメントまたは少なくともどこか(適切だと思う場所)に直接例を入れることをお勧めしますPython構成ファイル。 試行錯誤を繰り返した結果、印刷​​物をコメントアウトした後に投稿した作業バージョンを入手しました。

早く返事をくれてありがとう!

OK、確認しました、それはうまくいきました。 お手伝いありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価