<p>gunicorn ํฌ๋ฆฌํ‹ฐ์ปฌ ์ž‘์—…์ž ์‹œ๊ฐ„ ์ดˆ๊ณผ</p>

์— ๋งŒ๋“  2017๋…„ 01์›” 21์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

๋‹ค์Œ ์„ค์ •์œผ๋กœ gunicorn์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
gunicorn --worker-class gevent --timeout 30 --graceful-timeout 20 --max-requests-jitter 2000 --max-requests 1500 -w 50 --log-level DEBUG --capture-output --bind 0.0.0.0:5000 run:app ์ด๊ณ  [CRITICAL] WORKER TIMEOUT ์ œ์™ธํ•œ 3๋ช…์˜ ์ž‘์—…์ž๋ฅผ ๋ชจ๋‘ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด gunicorn์€ ๋” ์ด์ƒ ์ผ๊พผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๊ณ  ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž ์ˆ˜๋ฅผ 3์œผ๋กœ ์ค„์ด๊ณ  ๊ฐ ์ž‘์—…์ž์—๊ฒŒ 2๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ณตํ–ˆ๋Š”๋ฐ ์ด์ œ ์ด ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ์ดˆ๊ณผ์—์„œ ์Šคํƒ ์ถ”์ ์„ ์–ป์„ ์ˆ˜ ์—†์ง€๋งŒ ํŠน์ • ์ˆ˜์˜ ์ž‘์—…์ž ํ›„์—๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ?

( unconfirmed - Bugs -

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

์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ž‘์—…์ž ํด๋ž˜์Šค ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฆฌ์†Œ์Šค ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Docker Swarm์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์ œํ•œํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๊ฐ€ ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์ž‘์—…์ž๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜๋ฉด ์ค‘์žฌ์ž์—๊ฒŒ ์ œ ์‹œ๊ฐ„์— ์‚ด์•„ ์žˆ์Œ์„ ์•Œ๋ฆฌ์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ ์‹œ๊ฐ„๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ ์ค‘์— ์‹คํ–‰๋œ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@jseidou ๋ฒ”ํ”„.

@benoitc๋‹˜ ๋‹ต๋ณ€์ด ๋Šฆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„ํ™œ์„ฑ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ™œ์„ฑ ์Šค๋ ˆ๋“œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ถ€ํ•˜๊ฐ€ ์ ์€ ๋น„ํ™œ์„ฑ ์Šค๋ ˆ๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์‹ฌ๊ฐํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. gevent์—์„œ ํ† ๋„ค์ด๋„๋กœ ์ „ํ™˜ํ–ˆ๋Š”๋ฐ ์ค‘๋‹จ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์—ฌ์ „ํžˆ 30์ดˆ๋งˆ๋‹ค ์ž„๊ณ„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” 3๋ช…์˜ ์ž‘์—…์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฑฐ๋‹ˆ์ฝ˜ 19.7.1
์ œ๋ฒคํŠธ 1.2.1
ํŒŒ์ด์ฌ 3.5.3
Docker์—์„œ ์‹คํ–‰, ๊ณต์‹ " python:3.5 "๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ด๋ฏธ์ง€

@jseidou ์ค‘์žฌ์ž๊ฐ€ ์ด์— ๋ฐ˜์‘ํ•œ๋‹ค๋Š” ์ ์—์„œ

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

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@saabeilin ๋™์ผ ^^

๋™์ผํ•œ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์ž‘์—…์ž๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•œ ์ผ์€ AWS ECS์—์„œ ๋‚ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

[2017-06-27 20:41:56 +0000] [1] [DEBUG] Current configuration:
proxy_protocol: False
worker_connections: 1000
statsd_host: None
max_requests_jitter: 0
post_fork: <function post_fork at 0x7f6bbc3f1938>
errorlog: -
enable_stdio_inheritance: False
worker_class: sync
ssl_version: 2
suppress_ragged_eofs: True
syslog: False
syslog_facility: user
when_ready: <function when_ready at 0x7f6bbc3f1668>
pre_fork: <function pre_fork at 0x7f6bbc3f17d0>
cert_reqs: 0
preload_app: False
keepalive: 2
accesslog: -
group: 0
graceful_timeout: 30
do_handshake_on_connect: False
spew: False
workers: 4
proc_name: None
sendfile: None
pidfile: None
umask: 0
on_reload: <function on_reload at 0x7f6bbc3f1500>
pre_exec: <function pre_exec at 0x7f6bbc3f1ed8>
worker_tmp_dir: None
limit_request_fields: 100
pythonpath: None
on_exit: <function on_exit at 0x7f6bbc3f7758>
config: None
logconfig: None
check_config: False
statsd_prefix:
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
reload_engine: auto
proxy_allow_ips: ['127.0.0.1']
pre_request: <function pre_request at 0x7f6bbc3f70c8>
post_request: <function post_request at 0x7f6bbc3f71b8>
forwarded_allow_ips: ['127.0.0.1']
worker_int: <function worker_int at 0x7f6bbc3f1c08>
raw_paste_global_conf: []
threads: 1
max_requests: 0
chdir: /opt/app
daemon: False
user: 0
limit_request_line: 4094
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
certfile: None
on_starting: <function on_starting at 0x7f6bbc3f1398>
post_worker_init: <function post_worker_init at 0x7f6bbc3f1aa0>
child_exit: <function child_exit at 0x7f6bbc3f7320>
worker_exit: <function worker_exit at 0x7f6bbc3f7488>
paste: None
default_proc_name: app:app
syslog_addr: udp://localhost:514
syslog_prefix: None
ciphers: TLSv1
worker_abort: <function worker_abort at 0x7f6bbc3f1d70>
loglevel: DEBUG
bind: ['0.0.0.0:5005']
raw_env: []
initgroups: False
capture_output: False
reload: False
limit_request_field_size: 8190
nworkers_changed: <function nworkers_changed at 0x7f6bbc3f75f0>
timeout: 30
keyfile: None
ca_certs: None
tmp_upload_dir: None
backlog: 2048
logger_class: gunicorn.glogging.Logger
[2017-06-27 20:41:56 +0000] [1] [INFO] Starting gunicorn 19.7.1
[2017-06-27 20:41:56 +0000] [1] [DEBUG] Arbiter booted
[2017-06-27 20:41:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5005 (1)
[2017-06-27 20:41:56 +0000] [1] [INFO] Using worker: sync
[2017-06-27 20:41:56 +0000] [8] [INFO] Booting worker with pid: 8
[2017-06-27 20:41:57 +0000] [9] [INFO] Booting worker with pid: 9
[2017-06-27 20:41:57 +0000] [10] [INFO] Booting worker with pid: 10
[2017-06-27 20:41:57 +0000] [12] [INFO] Booting worker with pid: 12
[2017-06-27 20:41:57 +0000] [1] [DEBUG] 4 workers
[2017-06-27 20:42:15 +0000] [10] [DEBUG] Closing connection.
[2017-06-27 20:42:15 +0000] [8] [DEBUG] Closing connection.
[2017-06-27 20:42:45 +0000] [8] [DEBUG] Closing connection.
[2017-06-27 20:42:45 +0000] [10] [DEBUG] Closing connection.
[2017-06-27 20:42:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
[2017-06-27 20:42:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:12)
[2017-06-27 20:42:46 +0000] [9] [INFO] Worker exiting (pid: 9)
[2017-06-27 20:42:46 +0000] [12] [INFO] Worker exiting (pid: 12)
[2017-06-27 20:42:46 +0000] [1] [DEBUG] 3 workers
[2017-06-27 20:42:46 +0000] [24] [INFO] Booting worker with pid: 24
[2017-06-27 20:42:46 +0000] [25] [INFO] Booting worker with pid: 25
[2017-06-27 20:42:46 +0000] [1] [DEBUG] 4 workers

๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :-/

gevent ์ž‘์—…์ž๋กœ ์ „ํ™˜ํ•˜๋ฉด ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ยฏ\_(ใƒ„)_/ยฏ

#1194์˜ ๋ณต์ œํ’ˆ์ธ ๊ฒƒ ๊ฐ™์•„์š”.

๋‚˜๋Š” ์ตœ๊ทผ์— ์ด๋Ÿฐ ์ผ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๋…ธํŠธ๋ถ์„ ์ž ์ž๊ธฐ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋šœ๊ป‘์„ ์—ด๋ฉด ์ด๋Ÿฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž”๋œฉ ๋œฌ๋‹ค. ์ด๊ฒƒ์ด ๋„์›€์ด ๋ ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค...

gunicorn --daemon --workers 2 --timeout 120 --bind 127.0.0.1:4000 --pid /var/run/mshc_admin.pid --user danilovskoe --group danilovskoe --chdir /home/danilovskoe/mshc2/src /flask/ --env MSHC_PRODUCTION=/etc/monit/mshc.config.py admin_ gunicorn:app

ํƒ€์ž„์•„์›ƒ 30์ดˆ
์š”์ฒญ ๋ฐ›๊ธฐ

์šฐ๋ถ„ํˆฌ 16.04
ํ”Œ๋ผ์Šคํฌ 0.12.2
Python 3.6.3(๊ธฐ๋ณธ๊ฐ’, 2017๋…„ 10์›” 4์ผ, 02:55:45)
[GCC 5.4.0 20160609] ๋ฆฌ๋ˆ…์Šค์—์„œ
gunicorn(๋ฒ„์ „ 19.7.1)

๊ณ ๋ฏผ์„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

์•ฑ์„ ์‹œ์ž‘ํ•œ ์งํ›„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ [CRITICAL] WORKER TIMEOUT ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

[2018-01-02 16:38:03 +0800] [24355] [INFO] Starting gunicorn 19.7.1
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] Arbiter booted
[2018-01-02 16:38:03 +0800] [24355] [INFO] Listening at: http://0.0.0.0:8080 (24355)
[2018-01-02 16:38:03 +0800] [24355] [INFO] Using worker: gevent
[2018-01-02 16:38:03 +0800] [24358] [INFO] Booting worker with pid: 24358
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] 1 workers

[2018-01-02 16:38:10 +0800] [24358] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:38:10 +0800] [24358] [DEBUG] Closing connection. 
[2018-01-02 16:38:41 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24358)
[2018-01-02 16:38:41 +0800] [24358] [INFO] Worker exiting (pid: 24358)
[2018-01-02 16:38:41 +0800] [24381] [INFO] Booting worker with pid: 24381

[2018-01-02 16:48:51 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24381)
[2018-01-02 16:48:51 +0800] [24381] [INFO] Worker exiting (pid: 24381)
[2018-01-02 16:48:51 +0800] [24703] [INFO] Booting worker with pid: 24703
[2018-01-02 16:48:51 +0800] [24703] [INFO] worker pid 24703 notify
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] Closing connection. 
CentOS: 6.7
Python: 3.6.3
Gevent: 1.2.2
Greenlet: 0.4.9
Gunicorn: 19.7.1

RUN CMD: gunicorn --worker-class gevent --log-level debug --bind 0.0.0.0:8080 app

์ž‘์—…์ž ํด๋ž˜์Šค๋ฅผ eventlet ๋กœ ์ „ํ™˜ํ–ˆ์„ ๋•Œ, ์ฆ‰,
gunicorn --worker-class eventlet --log-level debug --bind 0.0.0.0:8080 app ,
๊ดœ์ฐฎ์•„.

์•Œ๋ฆผ: ๋‚ด ์•ฑ์€ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋‚˜ ํด๋ผ์šฐ๋“œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋ฌผ๋ฆฌ์  ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


์—…๋ฐ์ดํŠธ:

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด gevent ๋˜๋Š” gevent ์ž‘์—…์ž์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

gevent๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  gevent๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ณด๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ทผ๋ณธ ์›์ธ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ณด๊ณ ์„œ๋Š” #1194์™€ ๊ฐ™์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ณด๊ณ ์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค์Œ ์„ค์ •์œผ๋กœ Virtualbox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 100% ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ: ์œˆ๋„์šฐ 10
๊ฒŒ์ŠคํŠธ: ์šฐ๋ถ„ํˆฌ 16.04
์œ ๋‹ˆ์ฝ˜: 19.7.1

๊ธฐ๋ณธ NAT ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ์™€ ๊ฒŒ์ŠคํŠธ ๊ฐ„์— TCP:8000์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. sync ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ์—์„œ localhost:8000 ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋กœ๊ทธ์— ํ‘œ์‹œํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ guest ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์š”์ฒญ์„ ํ•˜๋ฉด ๋กœ๊ทธ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. --worker-class eventlet ์ „ํ™˜ํ•˜๋ฉด ์ถ”์ ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

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

๋Š๋ฆฐ ์—…๋กœ๋“œ์—์„œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œํ•˜๋Š” ๋™์•ˆ(Django ์‚ฌ์ดํŠธ๋กœ) ์ž‘์—…์ž ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ๋„๋‹ฌํ•˜๋ฉด ์—…๋กœ๋“œ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

@lordmauve ์˜ˆ์ƒ๋˜๋Š” ๋™๊ธฐํ™” ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ. ๊ธด ์š”์ฒญ์€ ์ž‘์—…์ž๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๊ฒฐ๊ตญ ์ค‘์žฌ์ž๋Š” ์ž‘์—…์ž๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ธด ์š”์ฒญ์ด ์„ฑ๊ณตํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ž‘์—…์ž ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์€ ์žฌ์ƒ์‚ฐ์„ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ์ผ€์ด์Šค๋กœ ๋‹ค์‹œ ์—ฌ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•  ๊นจ๋—ํ•œ ์กฐ์‚ฌ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. AWS/ECS์˜ ๊ฒฝ์šฐ ๋‚˜์—ด๋œ ๊ตฌ์„ฑ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ #1194๋ฅผ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค(https://github.com/benoitc/gunicorn/issues/1194#issuecomment-371250650).

์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ž‘์—…์ž ํด๋ž˜์Šค ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฆฌ์†Œ์Šค ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Docker Swarm์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์ œํ•œํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๊ฐ€ ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jseidou ์ค‘์žฌ์ž๊ฐ€ ์ด์— ๋ฐ˜์‘ํ•œ๋‹ค๋Š” ์ ์—์„œ

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

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@saabeilin ๋™์ผ ^^

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

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