3

aiohttp Web アプリをデプロイしようとしていますが、アプリを unix ソケット経由で提供する方法がわかりません。これは、nginx と gunicorn を相互に通信させるために必要だと思います。

app.py として保存された aiohttp ドキュメントからの簡単なサンプル アプリ:

import asyncio
from aiohttp import web

@asyncio.coroutine
def hello(request):
    return web.Response(body=b'Hello')

app = web.Application()
app.router.add_route('GET', '/', hello)

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    handler = app.make_handler()
    f = loop.create_server(handler, '0.0.0.0', 8080)
    srv = loop.run_until_complete(f)
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.run_until_complete(handler.finish_connections(1.0))
        srv.close()
        loop.run_until_complete(srv.wait_closed())
        loop.run_until_complete(app.finish())
    loop.close()

これを gunicorn で実行すると、直接動作します:

gunicorn -k aiohttp.worker.GunicornWebWorker -b 0.0.0.0:8000 app:app

しかし、代わりに UNIX ソケットにバインドしようとすると、次のエラーが発生します。

gunicorn -k aiohttp.worker.GunicornWebWorker -b unix:my_sock.sock app:app

トレースバック:

[2015-08-09 12:26:05 -0700] [26898] [INFO] Booting worker with pid: 26898
[2015-08-09 12:26:06 -0700] [26898] [ERROR] Exception in worker process:
Traceback (most recent call last):
  File "/home/claire/absapp/venv/lib/python3.4/site-  packages/gunicorn/arbiter.py", line 507, in spawn_worker 
    worker.init_process()
  File "/home/claire/absapp/venv/lib/python3.4/site-packages/aiohttp/worker.py", line 28, in init_process
    super().init_process()
  File "/home/claire/absapp/venv/lib/python3.4/site-packages/gunicorn/workers/base.py", line 124, in init_process
    self.run()
  File "/home/claire/absapp/venv/lib/python3.4/site-packages/aiohttp/worker.py", line 34, in run
    self.loop.run_until_complete(self._runner)
  File "/usr/lib/python3.4/asyncio/base_events.py", line 268, in run_until_complete
    return future.result()
  File "/usr/lib/python3.4/asyncio/futures.py", line 277, in result
    raise self._exception
  File "/usr/lib/python3.4/asyncio/tasks.py", line 236, in _step
    result = next(coro)
  File "/home/claire/absapp/venv/lib/python3.4/site-packages/aiohttp/worker.py", line 81, in _run
    handler = self.make_handler(self.wsgi, *sock.cfg_addr)
TypeError: make_handler() takes 4 positional arguments but 11 were given
[2015-08-09 12:26:06 -0700] [26898] [INFO] Worker exiting (pid: 26898)

aiohttp の問題 ( https://github.com/KeepSafe/aiohttp/issues/136 ) で、ソケットを使用してソケットを作成し、 loop.create_server() 関数のパラメーターとして配置するものに遭遇しましたが、できませんでした何も機能しません。(彼のコードのアプリが同じ web.Application オブジェクトかどうかもわかりません)

これを機能させる方法を知っている人はいますか?ありがとう!

4

1 に答える 1

1

問題は、GunicornWebWorkerUNIX ドメイン ソケットがサポートされていないことです。これはGunicornWebWorker.make_handler(self, app, host, port)、パラメータが必要な から来ています:hostおよびport. unix ソケットを使用している場合は明らかにそれらはありませんが、代わりにソケットへのパスがあります。

の冒頭を見てみましょうGunicornWebWorker._run():

def _run(self):
    for sock in self.sockets:
        handler = self.make_handler(self.wsgi, *sock.cfg_addr)
    ...

の場合は-b localhost:8000 sock.cfg_addrですが['localhost', 8000]-b unix:my_sock.sockただの'my_sock.sock'です。ここからエラーが発生TypeError: make_handler() takes 4 positional arguments but 11 were givenします。リストの代わりに文字列をアンパックします。

これを修正する簡単な方法は、サブクラスGunicornWebWorker化して再定義GunicornWebWorker.make_handler()し、ignore hostandを無視することportです。いずれにせよ、それらは使用されません。次のように実行できます。

class FixedGunicornWebWorker(worker.GunicornWebWorker):
    def make_handler(self, app, *args):
        if hasattr(self.cfg, 'debug'):
            is_debug = self.cfg.debug
        else:
            is_debug = self.log.loglevel == logging.DEBUG

        return app.make_handler(
            logger=self.log,
            debug=is_debug,
            timeout=self.cfg.timeout,
            keep_alive=self.cfg.keepalive,
            access_log=self.log.access_log,
            access_log_format=self.cfg.access_log_format)

: に固定ワーカーを含むパッケージが必要ですPYTHONPATH。そうしないと、Gunicorn はそれを見つけることができません。たとえば、固定ワーカーfixed_worker.pyを実行元と同じディレクトリ内のファイル内に配置gunicornする場合、次のように使用できます。

$ PYTHONPATH="`pwd`:$PYTHONPATH" gunicorn -k fixed_worker.FixedGunicornWebWorker -b unix:my_sock.sock app:app

UPDもリポジトリで問題を開きました。aiohttp

于 2015-08-19T14:11:36.337 に答える