<p>gunicorn 20.0.0: --paste๊ฐ€ [server:main]์—์„œ ์ธ์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•จ</p>

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

์•ˆ๋…•ํ•˜์„ธ์š” gunicorn ์œ ์ง€ ๋ณด์ˆ˜์ž,

ํ™˜๊ฒฝ:

  • python 3.6.1
  • pyramid==1.9.2

2019๋…„ 9์›” 12์ผ, ์ด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์ œ์•ˆ์— ๋”ฐ๋ผ waitress ๋ฅผ gunicorn ๋กœ ๊ต์ฒดํ•˜์—ฌ ๋‚ด๋ถ€ pyramid ์„œ๋ฒ„๊ฐ€ ๋ฐฐํฌ๋˜๋Š” ๋ฐฉ์‹์„ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

https://stackoverflow.com/a/26872261/10491481

๋‚ด๋ถ€ PR์ด ์ž‘์„ฑ๋˜์—ˆ์„ ๋•Œ gunicorn ์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” 19.9.0์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์˜ค๋Š˜ ๊ตฌํ˜„์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ CentOS 6.5 ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ƒˆ๋กœ์šด git clone ๋กœ ์ด๊ฒƒ์„ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

PRํ•  ๋•Œ setup.py ์— gunicorn ์˜ ๋ฒ„์ „์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜ pip install ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ (์˜ˆ์ƒ์น˜ ์•Š๊ฒŒ) gunicorn==20.0.0 ์„(๋ฅผ) ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

[server:main] development.ini ์— ์žˆ๋Š” ์„ค์ •์ด ์‹œ์ž‘ ์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด development.ini ์— ๋‹ค์Œ ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

[server:main]
use = egg:gunicorn#main
host = 0.0.0.0
port = 9090
workers = 1
worker_class = gevent
certfile=/etc/ssl/certs/current/webserver.cer
keyfile=/etc/ssl/certs/current/private.key.u
ca_certs=/etc/ssl/certs/current/intermediate.cert

gunicorn 19.9.0 :

$ gunicorn --version
gunicorn (version 19.9.0)
$ gunicorn --paste development.ini 
[2019-11-12 12:42:59 -0800] [16733] [INFO] Starting gunicorn 19.9.0
[2019-11-12 12:42:59 -0800] [16733] [INFO] Listening at: https://0.0.0.0:9090 (16733)
[2019-11-12 12:42:59 -0800] [16733] [INFO] Using worker: gevent
[2019-11-12 12:42:59 -0800] [16744] [INFO] Booting worker with pid: 16744

gunicorn 20.0.0

$ gunicorn --version
gunicorn (version 20.0.0)
$ gunicorn --paste development.ini 
[2019-11-12 12:45:28 -0800] [17295] [INFO] Starting gunicorn 20.0.0
[2019-11-12 12:45:28 -0800] [17295] [INFO] Listening at: http://127.0.0.1:8000 (17295)
[2019-11-12 12:45:28 -0800] [17295] [INFO] Using worker: sync
[2019-11-12 12:45:28 -0800] [17300] [INFO] Booting worker with pid: 17300

๋‘ ์ถœ๋ ฅ ๊ฐ„์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • ๋” ์ด์ƒ SSL์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( gunicorn 20.0.0 ์— ๋Œ€ํ•œ ์ถœ๋ ฅ์ด http $์ž„์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค).
  • host ์ธ์ˆ˜๊ฐ€ ๋” ์ด์ƒ ์ •ํ™•ํ•˜์ง€ ์•Š์Œ( 0.0.0.0 127.0.0.1 $ ์‚ฌ์šฉ)
  • port ์ธ์ˆ˜๊ฐ€ ๋” ์ด์ƒ ์ •ํ™•ํ•˜์ง€ ์•Š์Œ( 9090 8000 $ ์‚ฌ์šฉ)

gunicorn 20.0.0 ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

http://docs.gunicorn.org/en/stable/news.html

๊ทธ๋Ÿฌ๋‚˜ --paste ์ธ์ˆ˜์— ๋Œ€ํ•œ ์˜๋„์ ์ธ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€์น˜๋ฅผ ์œ„ํ•ด gunicorn 20.0.0 ๋ช…๋ น์ค„์—์„œ ์–ด๋–ค ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

$ gunicorn \
  --paste development.ini \
  -b 0.0.0.0:9090
  --workers 1 \
  --certfile /etc/ssl/certs/current/webserver.cer \
  --keyfile /etc/ssl/certs/current/private.key.u
[2019-11-12 12:54:08 -0800] [18979] [INFO] Starting gunicorn 20.0.0
[2019-11-12 12:54:08 -0800] [18979] [INFO] Listening at: https://0.0.0.0:9090 (18979)
[2019-11-12 12:54:08 -0800] [18979] [INFO] Using worker: sync
[2019-11-12 12:54:08 -0800] [18985] [INFO] Booting worker with pid: 18985

์ด ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ž์„ธํ•œ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ฐ์‚ฌ ํ•ด์š”,
์ฝ”๋ฆฌ

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

๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  ์ž์ฒด ํ• ๋‹นํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ฒ˜์Œ์— ๋ณ€๊ฒฝ ๋กœ๊ทธ์—์„œ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋กœ๊ทธ ํ•ญ๋ชฉ์—๋Š” "Simplify Paste Deployment documentation"๋งŒ ํ‘œ์‹œ๋˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ ๋” ๋‚˜์€ ๋‰ด์Šค ํ•ญ๋ชฉ์„ ์ค€๋น„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ PR์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/benoitc/gunicorn/pull/1957

์ด์ „์—๋Š” use = egg:gunicorn#main ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ Paste Deploy ํ˜ธํ™˜ ํ™˜๊ฒฝ์—์„œ Gunicorn์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šคํƒ€์ผ์˜ .ini ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ Gunicorn์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์€ gunicorn CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ Gunicorn์˜ ์ž์ฒด CLI ํ”Œ๋ž˜๊ทธ ๋˜๋Š” Gunicorn์˜ ์ž์ฒด ๊ตฌ์„ฑ ๋ชจ๋“ˆ(๊ธฐ๋ณธ๊ฐ’ gunicorn.conf.py )์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์ธ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Gunicorn ๋ฐ”์ธ๋“œ์˜ ์†Œ์ผ“์€ ์žฌ๋กœ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  PID ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Gunicorn์€ $ .ini ์˜ app ์„น์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ถœ ๊ฐ€๋Šฅ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ต์…˜์€ pserve ์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์‹คํ–‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ์Šคํฌ๋ฆฝํŠธ ๋Ÿฌ๋„ˆ๋Š” ๋‹ค์‹œ ๋กœ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  PID ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘๋™ํ•˜์ง€๋งŒ .ini ํŒŒ์ผ์˜ server ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ถ™์—ฌ๋„ฃ๊ธฐ์™€ ํ˜ธํ™˜๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰๊ธฐ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Gunicorn์€ ๋” ์ด์ƒ ๊ทธ๋Ÿฐ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋” ๋ช…ํ™•์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์ด์ „๊ณผ ๊ฐ™์ด ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ $ gunicorn #$ ๋Œ€์‹  pserve ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. Gunicorn์˜ ๋ชจ๋“  ์„œ๋ฒ„ ๊ตฌ์„ฑ์€ ์ด๋ฏธ ์™„๋ฃŒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ server ๋ธ”๋ก์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋™์ž‘์€ ํŒŒ์ผ๊ณผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ค„์— ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž ์žฌ์ ์œผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ .ini ํŒŒ์ผ์— ๋ณด๊ฐ„์„ ์œ„ํ•œ ๊ตฌ์„ฑ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค๋ฅธ server ๋ธ”๋ก(๋‹ค๋ฅธ app ๋ธ”๋ก ์™ธ์—)์„ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋‹ฌ๋ผ๋Š” ์š”์ฒญ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ณด๋‹ค Gunicorn์„ ๋ถ™์—ฌ๋„ฃ๊ธฐ _server_ ์‹คํ–‰๊ธฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Gunicorn CLI๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Paste Deploy .ini ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ server ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์ƒํƒœ๊ณ„์˜ ์ „์šฉ ๋„๊ตฌ์— ๋งก๊ฒจ์ง‘๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์ด์ „๊ณผ ๊ฐ™์ด ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ $ gunicorn #$ ๋Œ€์‹  pserve ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

@tilgovi ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ท€ํ•˜์˜ ์ถ”์ฒœ์— ๋”ฐ๋ผ:

$ pserve development.ini
# ...
Starting server in PID 40148.
[2019-11-12 14:26:30 -0800] [40148] [INFO] Starting gunicorn 20.0.0
[2019-11-12 14:26:30 -0800] [40148] [INFO] Listening at: https://0.0.0.0:9090 (40148)
[2019-11-12 14:26:30 -0800] [40148] [INFO] Using worker: gevent
[2019-11-12 14:26:30 -0800] [40263] [INFO] Booting worker with pid: 40263

๋‚ด๊ฐ€ ์—ด์—ˆ๋˜ ๋‚ด๋ถ€ PR์˜ ์ผ๋ถ€๊ฐ€ pserve ๋ช…๋ น์„ gunicorn ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” ์šฐ๋ฆฌ์˜ ์›๋ž˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ์กฐ์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ API ์„œ๋ฒ„.

๊ทธ๋Ÿฌ๋ฉด ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ข…๋ฃŒํ•˜์„ธ์š” =)

๊ฐ์‚ฌ ํ•ด์š”,
์ฝ”๋ฆฌ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฉ”๋ชจ๋ฅผ ํ•œ ๋‹ค์Œ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. server ๋ธ”๋ก์ด egg:gunicorn#main ์ด์™ธ์˜ ๊ฒƒ์„ ์ง€์ •ํ•˜๋”๋ผ๋„ gunicorn --paste production.ini ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Gunicorn์„ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ž ์žฌ์ ์œผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค _!

Gunicorn์€ ์ฃผ๋กœ ์„œ๋ฒ„ ๋ฐ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— Gunicorn์ด ์ž„์˜์˜ Paste ํ˜ธํ™˜ ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜ CLI๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Gunicorn์€ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฐฐํฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„์ด๋ฉฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ˜ธํ™˜ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์‹คํ–‰๊ธฐ CLI๋Š” _์•„๋‹™๋‹ˆ๋‹ค_!

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ํ”ผ๋ผ๋ฏธ๋“œ ์š”๋ฆฌ์ฑ…์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/Pylons/pyramid_cookbook/issues/222

๋‚˜๋Š” ์ด๊ฒƒ์„ Gunicorn ์ž์ฒด์—์„œ ์ฒ ์ €ํžˆ ๋ฌธ์„œํ™”ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ฒ˜์Œ์—๋Š” ์ฐธ์กฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค: http://docs.gunicorn.org/en/stable/run.html#paste -deployment

@tilgovi ๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ ํŒ€์—๋„ ํฐ ๋ณ€ํ™”๋ฅผ ์ฃผ์—ˆ๋‹ค๋Š” ์ ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋กœ๊ทธ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  ์ž์ฒด ํ• ๋‹นํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ฒ˜์Œ์— ๋ณ€๊ฒฝ ๋กœ๊ทธ์—์„œ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ํ‹ธ๊ณ ๋น„ ๋ฒ”ํ”„

์ด ๋ฌธ์ œ๋ฅผ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ์—ด์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ณ ๋ฆฝ๋œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์กฐ๊ธˆ ๋” ํ…Œ์ŠคํŠธํ•œ ํ›„ ์šฐ๋ฆฌ ํŒ€์€ API ์„œ๋ฒ„์—์„œ gunicorn 20.0.0 ๊ฐ€ pyramid_ldap3.get_ldap_connector ํ•จ์ˆ˜๋ฅผ ์ค‘๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

gunicorn 20.0.0 :

์‹œ์ž‘์—:

$ pip list | grep gunicorn
gunicorn             20.0.0
$ pserve bioapps/development.ini
[2019-11-20 15:55:30 -0800] [9902] [INFO] Starting gunicorn 20.0.0
[2019-11-20 15:55:30 -0800] [9902] [INFO] Listening at: https://0.0.0.0:10999 (9902)
[2019-11-20 15:55:30 -0800] [9902] [INFO] Using worker: gevent
[2019-11-20 15:55:30 -0800] [10034] [INFO] Booting worker with pid: 10034
/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/gunicorn/workers/ggevent.py:53: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016. Modules that had direct imports (NOT patched): ['urllib3.util.ssl_ (/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/urllib3/util/ssl_.py)', 'urllib3.util (/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/urllib3/util/__init__.py)'].
  monkey.patch_all()

์ธ์ฆ ์‹œ๋„ ํ›„:

[2019-11-20 15:57:54,189] INFO  [access:342][DummyThread-1] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:10999/session HTTP/1.1" {'username': 'colim', 'password': ''}
[2019-11-20 15:57:57,276] ERROR [exc_logger:114][DummyThread-1] 'https://bioappsdev02.bcgsc.ca:10999/session'
Traceback (most recent call last):
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/tweens.py", line 39, in excview_tween
    response = handler(request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/router.py", line 156, in handle_request
    view_name
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/view.py", line 642, in _call_view
    response = view_callable(context, request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/config/views.py", line 181, in __call__
    return view(context, request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/viewderivers.py", line 390, in attr_view
    return view(context, request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/viewderivers.py", line 368, in predicate_wrapper
    return view(context, request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/viewderivers.py", line 439, in rendered_view
    result = view(context, request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid/viewderivers.py", line 148, in _requestonly_view
    response = view(request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/cornice/service.py", line 493, in wrapper
    response = view_(request)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/bioapps/api/endpoints/session.py", line 139, in session_post
    username, request.validated['password'], request,
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/bioapps/api/endpoints/session.py", line 27, in get_ldap_groups
    auth = connector.authenticate(username, password)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid_ldap3/__init__.py", line 208, in authenticate
    password=escape_for_search(password))
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid_ldap3/__init__.py", line 82, in execute
    with manager.connection() as conn:
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/pyramid_ldap3/__init__.py", line 165, in connection
    auto_bind=True, lazy=False, read_only=True)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/ldap3/core/connection.py", line 326, in __init__
    self.do_auto_bind()
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/ldap3/core/connection.py", line 343, in do_auto_bind
    self.bind(read_server_info=True)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/ldap3/core/connection.py", line 585, in bind
    _, result = self.get_response(response)
  File "/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/ldap3/strategy/base.py", line 370, in get_response
    raise LDAPResponseTimeoutError('no response from server')
ldap3.core.exceptions.LDAPResponseTimeoutError: no response from server
[2019-11-20 15:57:57,298] INFO  [access:362][DummyThread-1] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:10999/session HTTP/1.1" 500 206

gunicorn 19.9.0

์‹œ์ž‘์—:

$ pip install gunicorn==19.9.0
Collecting gunicorn==19.9.0
  Using cached https://files.pythonhosted.org/packages/8c/da/b8dd8deb741bff556db53902d4706774c8e1e67265f69528c14c003644e6/gunicorn-19.9.0-py2.py3-none-any.whl
Installing collected packages: gunicorn
  Found existing installation: gunicorn 20.0.0
    Uninstalling gunicorn-20.0.0:
      Successfully uninstalled gunicorn-20.0.0
Successfully installed gunicorn-19.9.0
$ pip list | grep unicorn
gunicorn             19.9.0
$ gunicorn --paste bioapps/development.ini
[2019-11-20 16:03:45 -0800] [12015] [INFO] Starting gunicorn 19.9.0
[2019-11-20 16:03:45 -0800] [12015] [INFO] Listening at: https://0.0.0.0:10999 (12015)
[2019-11-20 16:03:45 -0800] [12015] [INFO] Using worker: gevent
[2019-11-20 16:03:45 -0800] [12018] [INFO] Booting worker with pid: 12018

์ธ์ฆ ์‹œ๋„ ํ›„:

[2019-11-20 16:04:39,292] INFO  [access:342][DummyThread-1] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:10999/session HTTP/1.1" {'username': 'colim', 'password': ''}
[2019-11-20 16:04:39,527] INFO  [access:362][DummyThread-1] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:10999/session HTTP/1.1" 200 639

gunicorn 20.0.0 ์™€ gunicorn 19.9.0 development.ini ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด gunicorn 20.0.0 ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ pip list | grep unicorn
gunicorn             20.0.0
$ gunicorn --paste bioapps/development.ini -b 0.0.0.0:8999 --workers 1 --certfile /etc/ssl/certs/current/webserver.cer  --keyfile /etc/ssl/certs/current/private.key.u
[2019-11-20 16:14:27 -0800] [14783] [INFO] Starting gunicorn 20.0.0
[2019-11-20 16:14:27 -0800] [14783] [INFO] Listening at: https://0.0.0.0:8999 (14783)
[2019-11-20 16:14:27 -0800] [14783] [INFO] Using worker: sync
[2019-11-20 16:14:27 -0800] [14798] [INFO] Booting worker with pid: 14798
[2019-11-20 16:16:39,550] INFO  [access:342][MainThread] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:8999/session HTTP/1.1" {'username': 'colim', 'password': ''}
[2019-11-20 16:16:39,768] INFO  [access:362][MainThread] 10.9.202.54 - - "POST https://bioappsdev02.bcgsc.ca:8999/session HTTP/1.1" 200 639

๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ pserve gunicorn 20.0.0 ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ์ด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/gunicorn/workers/ggevent.py:53: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016. Modules that had direct imports (NOT patched): ['urllib3.util.ssl_ (/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/urllib3/util/ssl_.py)', 'urllib3.util (/home/colim/Projects/bioapps/bioapps.api.ssl/centos7venv/lib/python3.6/site-packages/urllib3/util/__init__.py)'].
  monkey.patch_all()

@tilgovi ๋ณ€๊ฒฝ ๋กœ๊ทธ์—์„œ ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@benoitc Gunicorn CLI์—์„œ Paste Deploy ์„œ๋ฒ„ ์ •์˜์— ๋Œ€ํ•œ ์ง€์› ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์†Œ๊ธ‰ํ•˜์—ฌ ์ˆ˜์ •ํ•˜์—ฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ(20.0 ๋ฆด๋ฆฌ์Šค์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์„น์…˜ ์ž‘์„ฑ)?

@CorreyL ์žฌ๋ฏธ์žˆ๋‹ค! ์ด์™€ ๊ฐ™์ด ๋ช…๋ น์ค„์— ์ง€์ •๋œ ์˜ต์…˜์œผ๋กœ gunicorn ๋ฅผ ํ™•์‹คํžˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด gunicorn ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. pserve ์™€์˜ ํ†ตํ•ฉ์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋น„์ถ”์ฒœํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์†Œ๊ธ‰ํ•˜์—ฌ ์ˆ˜์ •ํ•˜์—ฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ(20.0 ๋ฆด๋ฆฌ์Šค์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์„น์…˜ ์ž‘์„ฑ)?

@tilgovi ๋„ค ํ™•์‹คํžˆ

@tilgovi ์˜ค๋Š˜ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? 20.0.1์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

c25563f์— ํ•œ ์ค„ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•œ ์ดํ›„ ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฅผ ๋ณด๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ฌธ์„œ์™€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿ˜‚

@tilgovi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ด๊ฒƒ์— ์˜ํ•ด ๋†€๋ผ์šธ ์ •๋„๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํ™•์ธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—…๊ทธ๋ ˆ์ด๋“œ ์ดํ›„์— gunicorn์ด dev์—์„œ ์ž๋™ ๋‹ค์‹œ ๋กœ๋“œ๋ฅผ ์ค‘์ง€ํ•œ ์ด์œ ์™€ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ๋™์ž‘ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ๋‚ด --paste INI ํŒŒ์ผ์˜ ์„ค์ •์ด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, Paster ํŒŒ์ผ์„ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์„œ๋ฒ„ ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋ฉด gunicorn์ด ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜ผ๋ž€์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค, @Deimos. PR์„ ๊ฒ€ํ† ํ•˜๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋” ์ถ”๊ฐ€ํ•  ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ --paste๋ฅผ --config์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ(RhodeCode)๋Š” gunicorn ๊ตฌ์„ฑ์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ํŠน์ˆ˜ ๋…ผ๋ฆฌ์— ๋Œ€ํ•œ ํฐ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

@marcinkuzminski ์ด์ƒ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. --paste ์™€ --config ๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Gunicorn์€ ์‚ฌ์šฉ์ž๊ฐ€ gunicorn ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ ini ํŒŒ์ผ์˜ "์„œ๋ฒ„" ์„น์…˜์„ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šด์ด ์—†์—ˆ์–ด.

์šฐ๋ฆฌ๋Š” ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ณ ๊ฐ์—๊ฒŒ gunicorn์„ ๋ฐฐ์†กํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋…ผ๋ฆฌ์™€ ๊ตฌ์„ฑ์€ .ini ํŒŒ์ผ์— ์œ„์ž„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์ œ๊ฐ€ ํ”ผ๋ผ๋ฏธ๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์€ ์ด๋ฅผ ๊นจ๊ณ , gunicorn์ด ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋„๋ก ํฌํฌํ•œ ๋‹ค์Œ, ๋…ผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ตฌ์„ฑ์„ gunicorn_conf.py๋กœ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

--paste ์˜ต์…˜์ด ํŠน์ˆ˜ ์ ‘๋‘์–ด์™€ ํ•จ๊ป˜ ์ฝํ˜€์ง€๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด --paste๋กœ gunicorn์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ gunicorn. ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ๊ตฌ์„ฑ ์˜ต์…˜๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

์˜ˆ

gunicorn.workers = 2
gunicor.XXX = YYY

--config ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ™์—ฌ๋„ฃ๊ธฐ INI๋ฅผ ์™„์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด $#$ gunicorn pserve ๋Œ€์‹  pserve ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ์„œ ์ฐธ์กฐ: https://docs.gunicorn.org/en/stable/run.html#paste -deployment

๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์€ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฐฐํฌ CLI๋กœ Gunicorn์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Gunicorn์€ ์—ฌ์ „ํžˆ โ€‹โ€‹_a_ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ˜ธํ™˜ ์„œ๋ฒ„ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์€ .ini ํŒŒ์ผ์ด server ๋ธ”๋ก์—์„œ ์›จ์ดํŠธ๋ฆฌ์Šค ๋˜๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„๋ฅผ ์ง€์ •ํ•˜์ง€๋งŒ gunicorn --paste production.ini ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ž ์žฌ์ ์ธ ํ˜ผ๋ž€์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ์›จ์ดํŠธ๋ฆฌ์Šค. ์‚ฌ๋žŒ๋“ค์€ ๋˜ํ•œ server:main ์ด์™ธ์˜ ๋Œ€์ฒด server ๋ธ”๋ก์„ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. pserve ์™€ ๊ฐ™์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹์€ CLI๊ฐ€ ์žˆ์„ ๋•Œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

gunicorn CLI๋Š” INI ํŒŒ์ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •์˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. INI ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ Gunicorn ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋„๊ตฌ(์˜ˆ pserve )๋ฅผ ์Šคํฌ๋ฆฝํŠธ/ํ”„๋กœ์„ธ์Šค ์‹คํ–‰๊ธฐ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์„์— ๋”ฐ๋ผ --paste์™€ ํ•จ๊ป˜ --config๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ๊ฒƒ์€ ๋‹จ์ผ ๊ตฌ์„ฑ ํŒŒ์ผ(.ini)์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. .ini ํŒŒ์ผ์„ ์กฐ์ •ํ•˜๋Š” ๋งŽ์€ ์—…๊ทธ๋ ˆ์ด๋“œ/์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ --config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์„ค์ •ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • Python ๊ตฌ์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ๊ฑฐ ํ˜•์‹(๊ธฐ์ˆ ์ ์œผ๋กœ .ini ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์—†์Œ)
  • ์ž‘์—…์ž ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ(Python ์ฝ”๋“œ)

Gunicorn์€ ๋ถ™์—ฌ๋„ฃ๊ธฐ์™€ ํ˜ธํ™˜๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋˜๊ณ  2๊ฐœ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ํฌํฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Gunicorn๊ณผ ๊ทธ ํ–‰๋™์„ ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ํฌํฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ํ‹ฐ์ผ“์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋ฅผ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” gunicorn๊ณผ ์›จ์ดํŠธ๋ฆฌ์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๊ณ  gunicorn ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ๋ช…์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. IMHO. ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ณ„๋ž€์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋“œ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ธฐ์–ต์— ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ์‚ฌ์šฉ๋ฒ•์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„๋งˆ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์œ ์Šค์ผ€์ด์Šค์— ๋Œ€ํ•œ ์ง€์›์€ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€๊ณ  ์žˆ์–ด๋„ ๊ดœ์ฐฎ์„๊นŒ์š”
๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๊นŒ?

2020๋…„ 10์›” 16์ผ ๊ธˆ์š”์ผ 08:28 Marcin Kuลบmiล„ski [email protected]
์ผ๋‹ค:

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ๋Š” ๋‚ด ์ฒซ ๋ฒˆ์งธ์— ๋”ฐ๋ผ --paste์™€ ํ•จ๊ป˜ --config๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋…ผํ‰.
์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ๊ฒƒ์€ ๋‹จ์ผ ๊ตฌ์„ฑ ํŒŒ์ผ(.ini)๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
.ini ํŒŒ์ผ์„ ์กฐ์ •ํ•˜๋Š” ๋งŽ์€ ์—…๊ทธ๋ ˆ์ด๋“œ/์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ --config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์„ค์ •ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • Python ๊ตฌ์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊ฑฐ ํ˜•์‹(๊ธฐ์ˆ ์ ์œผ๋กœ
    .ini ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋จ)
  • ์ž‘์—…์ž ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

Gunicorn์€ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋˜๊ณ ,
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ์•Œ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ด๊ตฌ์™€ ์›จ์ดํŠธ๋ฆฌ์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” gunicorn ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ๋ช…์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. IMHO.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/benoitc/gunicorn/issues/2169#issuecomment-709838842 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAADRIQR2CLVUOYK6FDY2ZDSK7RZFANCNFSM4JMI65YA
.

>

๋‚ด ๋ชจ๋ฐ”์ผ์—์„œ ๋ณด๋‚ธ

์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ˜ ์—๊ทธ์™€ ํ•จ๊ป˜ pserve๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด .ini ํŒŒ์ผ ์•ˆ์— ์„ค์ •๋˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ

use = egg:gunicorn#main
workers = 2
config = /path/to/gunicorn_conf.py

๋”ฐ๋ผ์„œ --config=/path/to/gunicorn_conf.py๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ gunicorn_conf.py๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์˜ ๋ฐฉ๋ฒ•์€ ์šฐ๋ฆฌ์—๊ฒŒ ํšจ๊ณผ์ ์ด๋ฉฐ ์ด ํ‹ฐ์ผ“์˜ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ณ  ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด gunicorn ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ .ini ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ์„ ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋งŽ์€ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ˜ ์—๊ทธ์™€ ํ•จ๊ป˜ pserve๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด .ini ํŒŒ์ผ ์•ˆ์— ์„ค์ •๋˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜์‹ญ์‹œ์˜ค!

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ AFAIR์—์„œ๋Š” gunicorn๊ณผ pserve ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด gunicorn --paste๋Š” .ini ํŒŒ์ผ ๊ฒฝ๋กœ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ gunicorn egg๋ฅผ ์‚ฌ์šฉํ•˜๋Š” pserve๋Š” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ด€๋ จ ํ‹ฐ์ผ“์„ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

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