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์— gunicorn.workers.base.Worker์˜ ํ•˜์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ Python ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ž์‹ ์˜ ์ž‘์—…์ž๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋Œ€์ฒด ๊ตฌ๋ฌธ์€ gevent ํด๋ž˜์Šค์ธ gunicorn.workers.ggevent.GeventWorker๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋” ๋‚˜์€ ์ œ์•ˆ์ด ์žˆ์œผ๋ฉด ๋ฌธ์„œ๋ฅผ ํ•ญ์ƒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "mypackage.client_auth_worker:CustomSyncWorker" ํ˜•์‹). ์˜ค๋Š˜ ๋‚˜์ค‘์— ์ง‘์— ๊ฐ€๋ฉด ํ™•์ธํ•ด๋ด์•ผ๊ฒ ๋„ค์š”.

๊ทธ ์™ธ์—๋„ ๋‚˜๋Š” ๊ทธ ๋ฌธ์„œ๋ฅผ ๋ณด์•˜๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์ผ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ ๋˜๋Š” ์ ์–ด๋„ ๋‹ค๋ฅธ ๊ณณ (์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ณณ)์— ์ง์ ‘์ ์ธ ์˜ˆ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ๊ตฌ์„ฑ ํŒŒ์ผ. ๋‚˜๋Š” ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์œผ๋ฉด์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ถœ๋ ฅ๋ฌผ์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ๊ฒŒ์‹œํ•œ ์ž‘์—… ๋ฒ„์ „์„ ์–ป๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋นจ๋ฆฌ ๋Œ์•„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์™€ ์ค˜์„œ ๊ณ ๋งˆ์›Œ!

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