Gunicorn: ASGI ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 11์›” 02์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

Django Daphne ์€ ASGI๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ ์ค‘์ด์ง€๋งŒ Daphne ์„œ๋ฒ„๋Š” ๋งค์šฐ ์ƒˆ๋กญ๊ณ  ์•„์ง ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ: SSL ์ง€์› ์—†์Œ, ์„ฑ์ˆ™ ๋ฌธ์ œ).

์›ํ™œํ•œ WSGI/ASGI ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด Gunicorn์— ASGI ์ง€์› ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

- Mailing List -

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์•„, ์ง€๊ธˆ ์ด๊ฒƒ์„ ๋ฎ์œผ์‹ญ์‹œ์˜ค. (ํƒ€์‚ฌ ์ž‘์—…์ž ํด๋ž˜์Šค๋กœ.)

Uvicorn 0.2๋Š” ๋” ์ด์ƒ ์ง์ ‘ ์‹คํ–‰์„ ์œ„ํ•ด gunicorn์— ์˜์กดํ•˜์ง€ ์•Š์ง€๋งŒ ASGI ์•ฑ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ gunicorn ์ž‘์—…์ž ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ๋…์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” uvicorn์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์„ ์œ„ํ•ด ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ gunicorn ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

http://www.uvicorn.org/#running-with-gunicorn

uvloop ๋ฐ httptools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gunicorn์—์„œ ASGI ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker

asyncio ๋ฐ h11(pypy ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด)์„ ์‚ฌ์šฉํ•˜์—ฌ gunicorn์—์„œ ASGI ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gunicorn app:App -w 4 -k uvicorn.workers.UvicornH11Worker

ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ต์‹ฌ gunicorn ํŒจํ‚ค์ง€๋กœ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  22 ๋Œ“๊ธ€

@arcivanov ์ด ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. :)

์ด ํ‹ฐ์ผ“์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์—…๋ฐ์ดํŠธ?

@benoitc @berkerpeksag ์™€ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ด๋ฉ”์ผ๋กœ ์ฑ„ํŒ…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋‚ด๊ฐ€ ์•„๋Š” ์ž‘์—…์ด ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ASGI์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ฝ์„ ์‹œ๊ฐ„์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ• ์ง€ ์ง์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฅผ ์œ„ํ•ด ์ž‘์—…์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์—ด์ •์ ์œผ๋กœ ๋•๊ณ  ํ† ๋ก ํ•˜๊ณ  ๊ฒ€ํ† ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์„œ๋ฒ„์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ASGI ์‚ฌ์–‘์„ ์ ๊ฒ€ํ•˜๋Š” ์ค‘์ด๋ฏ€๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฌด์—‡์ด๋“  ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ฃผ์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์—ฌ๊ธฐ์— ์ƒˆ ์‚ฌ์–‘์ด ์ดˆ์•ˆ ์ž‘์„ฑ ์ค‘์ด์ง€๋งŒ ์ตœ์ข…์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค: http:// /channels.readthedocs.io/en/2.0/asgi.html - ๊ธฐ๋ณธ์ ์œผ๋กœ WSGI์™€ ํ›จ์”ฌ ๋น„์Šทํ•จ)

@andrewgodwin ๋ฉ‹์ง„ asgi์™€ ํ•จ๊ป˜ gunicorn์„ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์–ด ์ฐธ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@andrewgodwin ASGI ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ตœ๊ทผ์— ASGI ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๊ณ  ์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ์–ป์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import json

def app(scope):
    async def channel(receive, send):
        message = await receive()

        if scope['method'] == 'POST':
            response = message
        else:
            response = scope

        await send({
            'type': 'http.response.start',
            'status': 200,
            'headers': [
                [b'Content-Type', b'application/json'],
            ],
        })
        await send({
            'type': 'http.response.body',
            'body': json.dumps(response, default=bytes.decode).encode(),
        })
        await send({
            'type': 'http.disconnect',
        })
    return channel
> daphne app:app
2018-03-31 22:28:10,823 INFO     Starting server at tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,824 INFO     HTTP/2 support enabled
2018-03-31 22:28:10,824 INFO     Configuring endpoint tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,825 INFO     Listening on TCP address 127.0.0.1:8000
127.0.0.1:43436 - - [31/Mar/2018:22:28:17] "GET /" 200 347
127.0.0.1:43440 - - [31/Mar/2018:22:28:22] "POST /" 200 43
127.0.0.1:43446 - - [31/Mar/2018:22:28:42] "POST /" 200 54
> http -b get :8000/
{
    "type": "http"
    "http_version": "1.1",
    "method": "GET",
    "path": "/",
    "query_string": "",
    "root_path": "",
    "scheme": "http",
    "headers": [
        ["host", "localhost:8000"],
        ["user-agent", "HTTPie/0.9.9"],
        ["accept-encoding", "gzip, deflate"],
        ["accept", "*/*"],
        ["connection", "keep-alive"]
    ],
    "client": ["127.0.0.1", 43360],
    "server": ["127.0.0.1", 8000],
}

> http -b -f post :8000/ foo=bar
{
    "body": "foo=bar",
    "type": "http.request"
}

> http -b -j post :8000/ foo=bar
{
    "body": "{\"foo\": \"bar\"}",
    "type": "http.request"
}

https://github.com/django/asgiref/blob/master/specs/www.rst

@sirex ASGI๋Š” ์ด์ œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. daphne์ด ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

django์˜ ๋งํฌ๊ฐ€ ASGI "์‚ฌ์–‘"์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๋งํฌ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ํ๋ฆ„์„ ์„ค๋ช…ํ•˜๋Š” ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@andrewgodwin ์ €๋Š” Daphne์ด ASGI๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ASGI๊ฐ€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ/์„œ๋ฒ„๋ฅผ ์ฑ„ํƒํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‹œ์—ฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

@benoitc ๋‘ ๊ฐœ์˜ ASGI ์‚ฌ์–‘ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/django/asgiref/blob/master/specs/asgi.rst - ์ผ๋ฐ˜ ASGI ์‚ฌ์–‘.

https://github.com/django/asgiref/blob/master/specs/www.rst - HTTP ๋ฐ WebSockets ํ”„๋กœํ† ์ฝœ๊ณผ WSGI์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค.

@sirex ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์–‘์€ ๊ตฌํ˜„์— ๊ด€ํ•œ ํ•œ ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋‚˜๋Š” ๊ดœ์ฐฎ์€ https://channels.readthedocs.io/en/latest/ ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” pep๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ python 2 ์ง€์›์„ ์ œ๊ฑฐํ•˜์ž๋งˆ์ž asgi๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

btw ํ•ด๋‹น ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

ASGI๋ฅผ PEP๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์›€์ง์ด์ง€ ์•Š์•˜๋Š”๋ฐ, ๋จผ์ € ์ถฉ๋ถ„ํ•œ ์ผ๋ฐ˜ ์ง€์›์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์—๋Š” ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์˜๋„์ด๊ณ  ํ•˜๋‚˜์ฒ˜๋Ÿผ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

python 2 ์ง€์›์„ ์ œ๊ฑฐํ•˜์ž๋งˆ์ž asgi๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด gunicorn, uvloop ๋ฐ httptools๋ฅผ ํ•จ๊ป˜ ์ ‘์ฐฉํ•˜๋Š” uvicorn ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”

(๊ทธ๋Ÿฐ ๋‹ค์Œ gunicorn์ด ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ์ด ์—†์ด uvicorn์ด ๋” ์ตœ์†Œํ•œ์˜ ์˜ต์…˜์ด ๋˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

ASGI ์‚ฌ์–‘ ๋ฌธ์„œ๋Š” ์ด์ œ https://asgi.readthedocs.io/en/latest/์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ข‹์•„, ์ง€๊ธˆ ์ด๊ฒƒ์„ ๋ฎ์œผ์‹ญ์‹œ์˜ค. (ํƒ€์‚ฌ ์ž‘์—…์ž ํด๋ž˜์Šค๋กœ.)

Uvicorn 0.2๋Š” ๋” ์ด์ƒ ์ง์ ‘ ์‹คํ–‰์„ ์œ„ํ•ด gunicorn์— ์˜์กดํ•˜์ง€ ์•Š์ง€๋งŒ ASGI ์•ฑ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ gunicorn ์ž‘์—…์ž ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ๋…์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” uvicorn์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์„ ์œ„ํ•ด ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ gunicorn ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

http://www.uvicorn.org/#running-with-gunicorn

uvloop ๋ฐ httptools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gunicorn์—์„œ ASGI ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker

asyncio ๋ฐ h11(pypy ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด)์„ ์‚ฌ์šฉํ•˜์—ฌ gunicorn์—์„œ ASGI ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gunicorn app:App -w 4 -k uvicorn.workers.UvicornH11Worker

ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ต์‹ฌ gunicorn ํŒจํ‚ค์ง€๋กœ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ž…๋‹ˆ๋‹ค.

์ด์ œ gunicorn ์ด python 2 ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธฐ์ˆ ์ ์œผ๋กœ ASGI ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tomchristie ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

h11 ๋ฐ/๋˜๋Š” httptools ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด uvicorn ์— ์˜์กดํ•˜๋Š” gunicorn์˜ ์ž‘์—…์ž ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์—ฌ๊ธฐ์—์„œ ๊ตฌํ˜„์„ ๋ณต์ œํ•˜์‹ญ์‹œ์˜ค.

h11 ์ข…์†์„ฑ์ด ์žˆ๋Š” Gunicorn ๋‚ด์žฅ ASGI HTTP ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„์˜ ์ œํ•œ๋œ ๋ถ€๋ถ„์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ธฐ์ค€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ”„๋กœํ† ์ฝœ์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

uvicorn ์—์„œ ์ถ”์ถœํ•  ๋‚ด์šฉ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. click ํ•˜๊ณ  argparse๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  setup.py ์ข…์†์„ฑ์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ํ•˜๋“œ ์ข…์†์„ฑ์ด 0์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ HTTP ๊ตฌํ˜„, WS ๊ตฌํ˜„, ์ด๋ฒคํŠธ ๋ฃจํ”„.

๋ฌด์—‡์„ ์„ค์น˜ํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์Šคํ… ์ž‘์—…์ž์ธ Gunicorn์— ์ถ”๊ฐ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋“ , ๋ฌธ์„œํ™” ๋˜๋Š” ๊ธฐํƒ€ ๋ฌด์—‡์ด๋“  ์ผ๋ฅ˜ ASGI ์ง€์›์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค. gunicorn์—์„œ daphne์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค .. gunicorn์ด asgi๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๊ฐ„์„ ๋งŽ์ด ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@japrogramer http://www.uvicorn.org/#running -with -gunicorn

Django 3.0(2019๋…„ 12์›” ์ถœ์‹œ ์˜ˆ์ •)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ASGI๋ฅผ ์ง€์› ํ•˜๋ฏ€๋กœ gunicorn ์—์„œ ์ง์ ‘ ์ง€์›ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํฐ ์ด์œ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ถœ์‹œ๋œ ํ›„ ์‚ฌ์šฉ์ž์˜ ๊ด€์‹ฌ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@johnthagen ํŒŒ์ดํ”„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ํ‹ฐ์ผ“์„ ์ •๋ฆฌํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋ฒˆ ๋‹ฌ์— ๋ฆด๋ฆฌ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰