virtualenv์์ ์คํ๋๋ ํฉ๋ฆฌ์ ์ผ๋ก ๊ฐ๋จํ Django ์ฌ์ดํธ๊ฐ ์์ต๋๋ค. ./manage.py runserver๋ฅผ ์ฌ์ฉํ ๋๋ ์ ์คํ๋์ง๋ง gunicorn์ผ๋ก ์คํํ๋ ค๊ณ ํ๋ฉด ์ถ๊ฐ ์ค๋ช ์์ด ์์ ์ ๋ถํ ์คํจ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
tijs<strong i="6">@python</strong>:~/projects/hoogtij.net$ sudo ./runscript.sh
2012-04-25 14:02:08 [12681] [INFO] Starting gunicorn 0.14.1
2012-04-25 14:02:08 [12681] [INFO] Listening at: http://127.0.0.1:8001 (12681)
2012-04-25 14:02:08 [12681] [INFO] Using worker: sync
2012-04-25 14:02:08 [12696] [INFO] Booting worker with pid: 12696
2012-04-25 14:02:08 [12697] [INFO] Booting worker with pid: 12697
2012-04-25 14:02:08 [12698] [INFO] Booting worker with pid: 12698
Traceback (most recent call last):
File "/home/tijs/.virtualenvs/hoogtij/bin/gunicorn_django", line 8, in <module>
load_entry_point('gunicorn==0.14.1', 'console_scripts', 'gunicorn_django')()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/app/djangoapp.py", line 129, in run
DjangoApplication("%prog [OPTIONS] [SETTINGS_PATH]").run()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 129, in run
Arbiter(self).run()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 184, in run
self.halt(reason=inst.reason, exit_status=inst.exit_status)
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 279, in halt
self.stop()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 327, in stop
self.reap_workers()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 413, in reap_workers
raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋๋ก ๊ฐ์ผ ํฉ๋๊น?
gunicorn์ด virtualenv ๋ด๋ถ์ ์ค์น๋์ด ์์ต๋๊น ์๋๋ฉด ์ธ๋ถ์ ์ค์น๋์ด ์์ต๋๊น?
๋ด๋ถ์. ์ง๊ธ์ฏค์ด๋ฉด ๋๋ถ๋ถ์ ์ค์ ์ ๋ฒ๋ฆด ๋ gunicorn์ด ์์๋๊ธฐ ๋๋ฌธ์ ์ฑ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํด๋น ์ถ๋ ฅ์ ๋ณผ ๋ ๋ฌด์์ด โโ์คํจํ๋์ง ์ ์ ์๋ค๋ ๊ฒ๋ฟ์ ๋๋ค.
"--debug --log-level debug"๋ก ์๋ํ์ญ์์ค. ์ถ๊ฐ ์ ๋ณด๊ฐ ์๋์ง ํ์ธํ์ธ์.
์ด๊ฒ์ ๋ด๊ฐ ๋๋ ค์ํ๋ ๋๋ฒ๊ทธ ๋ก๊ทธ ์์ค์ ์ถ๋ ฅ์ ๋๋ค.
:์ค๋งํ:
์์ง ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. "Booting worker" ๋ฉ์์ง ๋ค์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ "Exception in worker process"๊ฐ ํ์๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์์ ์ด ์กฐ๊ธ ๋์์ง๋ง ์ ์ ์๊ณ ๋ญ๊ฐ ์๊ฐํด๋ผ ์ ์์ ๊ฒ์
๋๋ค.
๊ณ ๋ง์, ๋ด๊ฐ ์ค์ค๋ก ์์๋ด๋ฉด ์๋ ค์ค๊ฒ. ๋๋ ์ด์ ์ค๋ฅ๊ฐ ๋ค์ ๋ฐ์ํ ๋๊น์ง settings.py๋ฅผ ํตํด ์์ ํ๊ณ ์์ต๋๋ค. ์ฌ๋ ์ค์ฟจ ๋๋ฒ๊น :)
@benoitc log.exception
์ด ์๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ด ์๋ฏธ๊ฐ์๋ ๊ฒฝ์ฐ ํ์ด์ฌ ์ผ๋ฟ์ด๋ฏ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค.
๊ฑฐ๊ธฐ์ ๋ ์ ์ ํ ๋๋ฒ๊ทธ ์ฌ์ด๋. ๊ฑฐ๊ธฐ์ ์ง์ง ์ถ๊ฐ๋ ์ญ์ถ์ ์ ๋๋ค :)
์ฌ์ค ๋๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์๊ณ ๋ก๊ทธ ํ์ผ์ ๋ํ ์ฐ๊ธฐ ๊ถํ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ก๊ทธ ํ์ผ(stderr ๋ฐ stdout)์ ๊ณต๊ฐ์ ์ผ๋ก ์ฐ๊ธฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋ฉด ์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ๋ด๊ฐ supervisord์์ gunicorn์ ์ฒ์ ์์ํ ๋ gunicorn์ด ์ธ๊ณ๋ฐ๊ธฐ ์ ์ ๋ฃจํธ ์๋์ ๋ก๊ทธ ํ์ผ์ด ์์ฑ๋๋์ง์ ๋ํ ์ง๋ฌธ์ ํ๊ฒ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ก๊ทธ ํ์ผ์ด Supervisord๊ฐ ์๋ gunicorn์ ์ํด ์์ฑ๋๋๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
์ด๋ป๊ฒ gunicorn์ ์์ํฉ๋๊น? ๋ง์ง๋ง ๋จธ๋ฆฌ๋ก ์ฌํํฉ๋๊น?
๋๋ ๊ฐ๋ ์์ ํจ๊ป ๊ทธ๊ฒ์ ์์ํฉ๋๋ค. ๋ค์์ Supervisord์ ๋ํ ๋ด gunicorn ๊ตฌ์ฑ์ ๋๋ค.
[ํ๋ก๊ทธ๋จ:์ฌ๋ผ์ด์ค์น]
๋๋ ํ ๋ฆฌ = /opt/src/slicephone/webapp/webapp/
๋ช
๋ น = /opt/src/slicephone/webapp/scripts/gunicorn.sh
stdout_logfile = /opt/logs/supervisord.stdout.log
stderr_logfile = /opt/logs/supervisord.stderr.log
๊ทธ๋ฆฌ๊ณ ์ค์ gunicorn ์คํฌ๋ฆฝํธ(๋ด๊ฐ gunicorn ์ฌ์ฉ์/๊ทธ๋ฃน์ ๋ก๊ทธ ํ์ผ์ ํฐ์นํ๊ณ chownํ๋ ๋ฐฉ๋ฒ ์ฐธ๊ณ ):
์ธํธ -e
DATASTORE_SOFTWARE="XXXXX"
ACCESS_LOGFILE=/opt/logs/gunicorn.slice.access.log
ERROR_LOGFILE=/opt/logs/gunicorn.slice.error.log
๋ก๊ทธ ํ์ผ=/opt/logs/gunicorn.slice.log
LOGDIR=$(๋๋ ํ ๋ฆฌ ์ด๋ฆ $LOGFILE)
WEBAPPDIR=$(๋๋ ํฐ๋ฆฌ ์ด๋ฆ $0)/../
NUM_WORKERS=3
DEBUG_FLAGS="--debug --๋ก๊ทธ ์์ค ๋๋ฒ๊ทธ"
USER=www-data
๊ทธ๋ฃน=www-data
cd $WEBAPPDIR/webapp
ํ
์คํธ -d $LOGDIR || mkdir -p $LOGDIR
์์ฝ WebAppDir: $WEBAPPDIR
echo "์ฌ์ฉ์: $USER"
echo "๊ทธ๋ฃน: $GROUP"
$ACCESS_LOGFILE $ERROR_LOGFILE $LOGFILE ํฐ์น
chown -R $USER:$GROUP $ACCESS_LOGFILE $ERROR_LOGFILE $LOGFILE
๋ด๋ณด๋ด๊ธฐ DATASTORE_SOFTWARE=$DATASTORE_SOFTWARE ; exec /opt/virtenvs/django_slice/bin/gunicorn_django $DEBUG_FLAGS -w $NUM_WORKERS --user=$USER --group=$GROUP --log-level=debug --log-file=$LOGFILE --access-logfile= $ACCESS_LOGFILE --error-logfile=$ERROR_LOGFILE
์ต์ ํค๋์ ๋ํ ์ข์ ์ง๋ฌธ์ ๋๋ค. pip freeze๋ 0.14.1๋ก ํ์๋ฉ๋๋ค(.2๊ฐ ์ต์ ๋ฒ์ ์ด ์๋๊ฐ์?)
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๊น? ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค.
๋ค ํด๊ฒฐํด์ผ ํฉ๋๋ค. ์ด๋ค ๋ฒ์ ์ gunicorn์ ์คํํ๊ณ ์์ต๋๊น? ์ฌํํ ์ ์๋๋ก ๊ตฌ์ฑ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ๊ฐ์ฌ ํด์.
@panyam 0.14.3์ผ๋ก ์๋ ํ์ต๋๊น?
@benoitc ์ฃ์กํฉ๋๋ค ์น๊ตฌ
๋ช ํํํ๊ธฐ ์ํด ๋๋ ์ด๊ฒ์ด gunicorn ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. @anyeguyue - ์ด๊ฒ์ ํ์ธํ๋ ๊ฐ์ฅ ์ข์ ๊ณณ์ ๊ฐ๋ ์ ๋ก๊ทธ ๋๋ gunicorn ๋ก๊ทธ(์ผ๋ฐ์ ์ผ๋ก /var/log/gunicorn/....์ ์์)๋ฅผ ์ดํด๋ณด๊ณ ๊ฑฐ๊ธฐ์ "๊ถํ ๊ฑฐ๋ถ๋จ" ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ฒซ ๋ฒ์งธ 'python manage.py syncdb'๋ก ํด๊ฒฐ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํด๋น ์ค์ ๋ฌธ์ ๋ฅผ ์์ ํ ํ gunicorn์ด ์๋ํ์ต๋๋ค(nginx๋ฅผ ๋ค์ ์์ํ ํ).
์ด ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค. gunicorn_django ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค์ ๋ด ๊ฐ์ ํ๊ฒฝ ํ์ด์ฌ ๊ฒฝ๋ก์ ๊ฒฝ๋ก์ธ "#!/opt/django/env/mysite/bin/python"์ด์์ต๋๋ค. "#!/usr/bin/env python"์ผ๋ก ๊ต์ฒดํ์ฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ง๋ง ๋ ๋ค ๋์ผํ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง PYTHONPATH ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์คํจํ ๊ฒ์ ๋๋ค.
@anyeguyue ๋๋ gunicorn 0.14.5 ๋ฐ Django 1.4์์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ง๋ง ๋ ๋์ ์ฆ์์ด ์์ต๋๋ค. gunicorn_django -b 0.0.0.0:8000
์คํ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค. ์์ ์ฌํญ์ ์๋ํ๊ณ ๋งค์ฐ ๋ถ๋ช
ํฉ๋๋ค. ํญ์ /usr/bin/env
which python
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค! ๊ฐ์ฌ ํด์.
@asimihsan, ๋์์ด ๋์ด์ ๊ธฐ์ฉ๋๋ค
๋๋ ๋ํ์ด ๋ฌธ์ ๊ฐ ์์๋ค. ๋ด ์ฝ๋์์ ์๋ชป๋ ๊ฐ์ ธ์ค๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋๋ฒ๊ทธํ๋ ค๋ฉด gunicorn_django --preload๋ฅผ ์คํํด ๋ณด์ญ์์ค. ๊ทธ๋ฌ๋ฉด ์ฌ๋ฐ๋ฅธ ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์๊ฒ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก django ์์ฒด์ ์๋ ๋ฌธ์ ์
๋๋ค.
venv๋ฅผ ํ์ฑํํ๊ณ ./manage.py runserver๋ฅผ ์คํํ์ญ์์ค.
์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ธํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
:+1: @fergalmoran ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค(PIL์ ๋ฌธ์ ์์ต๋๋ค).
๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํด ์๋๋ฐ... ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@pythdasch ์ฌ๊ธฐ์์ ์ด์ผ๊ธฐํ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ ๊ฒฝ์ฐ ์ ํฐ์ผ์ ์ด๊ฑฐ๋ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋๋ฒ๊น ์ ๋์ธ ์ ์์ต๋๋ค.
#gunicorn ์์ @pythdasch์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ @pythdasch , ํ์ธํ ์ ์์ต๋๊น?
Berker ๋๋ถ์ ํ์ธํ์ต๋๋ค :)
๋ด wsgi๋ ๋ด manage.py์ ๊ฐ์ ํด๋์ ์์ผ๋ฏ๋ก ํ๋ก์ ํธ๊ฐ ์๋ wsgi:application ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด์ผ ํ์ต๋๋ค. wsgi:์์ฉ ํ๋ก๊ทธ๋จ
(wsgi์ ๋ํ ์๋ชป๋ ๊ฒฝ๋ก์์ต๋๋ค. ์ด ๊ฒฝ์ฐ project.wsgi:application ๋์ wsgi:application์ด์ด์ผ ํจ)
@tilgovi ๋ค ์ฃ์กํฉ๋๋ค irc ์ฑ๋ gunicorn์ ๊ฐ์ ํด๊ฒฐํ์ต๋๋ค :)
์ด์ gunicorn 0.18 ๋ฐ ๋ค์ ํธ์ถ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
gunicorn 'app:create_app()' --name X --workers 5 --user=apprunner --group=apprunner --bind='0.0.0.0:5000' --log-config=resource/config/di/logging.conf --timeout=360 --debug --log-level debug
๋ด Flask ์์ฉ ํ๋ก๊ทธ๋จ์ ImportError ๋๋ฌธ์ด์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์์ ์๊ฐ ๋ถํ ์ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ gunicorn์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ญ์ถ์ ์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ฌธ์ ๋ฅผ ํ์ธํ๋ ค๋ฉด Flask ์ฑ์ โโ์๋์ผ๋ก ์์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ค์ ์ญ์ถ์ ์ ํ์ํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ข์ ๊ฒ์ ๋๋ค. IMO ๋ค์์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ ์๋ณธ ํธ๋ ์ด์ค๋ฐฑ์ ํ์ํ ์ ์๋ ๊ฒฝ์ฐ ์ค์ ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ํด gunicorn์ ์ฌ์ฉํ๋ ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ง์ ์คํํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด Gunicorn์ ์ด๋ฏธ ImportError์ ๊ฐ์ ์์ธ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
$ gunicorn a:app --error-logfile=- --access-logfile=-
[2014-12-10 17:13:31 +0000] [12176] [INFO] Starting gunicorn 19.2.0
[2014-12-10 17:13:31 +0000] [12176] [INFO] Listening at: http://127.0.0.1:8000 (12176)
[2014-12-10 17:13:31 +0000] [12176] [INFO] Using worker: sync
[2014-12-10 17:13:31 +0000] [12181] [INFO] Booting worker with pid: 12181
[2014-12-10 17:13:31 +0000] [12181] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/home/berker/projects/gunicorn/gunicorn/arbiter.py", line 517, in spawn_worker
worker.init_process()
File "/home/berker/projects/gunicorn/gunicorn/workers/base.py", line 117, in init_process
self.wsgi = self.app.wsgi()
File "/home/berker/projects/gunicorn/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/berker/projects/gunicorn/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/home/berker/projects/gunicorn/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/berker/projects/gunicorn/gunicorn/util.py", line 355, in import_app
__import__(module)
File "/home/berker/projects/testdjango/a.py", line 1, in <module>
from flask import Flask
ImportError: No module named flask
๋ฐ ๊ธฐํ ์ข ๋ฅ์ ์ค๋ฅ ๋ฉ์์ง:
$ gunicorn a:app --error-logfile=- --access-logfile=-
[2014-12-10 17:18:52 +0000] [12294] [INFO] Starting gunicorn 19.2.0
[2014-12-10 17:18:52 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:52 +0000] [12294] [ERROR] Retrying in 1 second.
[2014-12-10 17:18:53 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:53 +0000] [12294] [ERROR] Retrying in 1 second.
[2014-12-10 17:18:54 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:54 +0000] [12294] [ERROR] Retrying in 1 second.
๋ค์๊ณผ ๊ฐ์ด ์ฑ์ ์คํํ๋ ค๊ณ ํ ๋๋ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
gunicorn app:application -b localhost:3000
๋ฌธ์ ๋ app.py
ํ์ผ ์ธ์๋ app
๋ผ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค. ํ์ด์ฌ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พผ ํ์ ์๋ํ์ต๋๋ค.
@brouberol ์ง๊ธ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. Flask ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ธ์ค๊ธฐ ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์ผ๋ถ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ Gunicorn์ ์ญ์ถ์ ์ ๊ธฐ๋กํ์ง ์์ง๋ง Flask์ ๋ด์ฅ ์๋ฒ๋ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ์ Gunicorn์ด ์ค๋ฅ ๋ก๊ทธ์ ๋ ์์ธํ ์ ๋ณด ์์ด ์์ ์๋ฅผ ๋ถํ ํ์ง ๋ชปํ ๊ฒฝ์ฐ ๋จผ์ Flask์ ๋ด์ฅ ์๋ฒ๋ฅผ ์๋ํ๋ ๊ฒ์ ๋๋ค.
--preload๋ก guncorn์ ์คํํ๋ฉด ์ค๋ฅ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ ์๊ฒ๋ Django runserver
์ ์๋ํ์ต๋๋ค. gunicorn.conf.py
ํ์ผ์์ Django settings
๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ฌธ์ ์์ต๋๋ค. ํด๋น ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์๊ฒ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก django ์์ฒด์ ์๋ ๋ฌธ์ ์ ๋๋ค.
venv๋ฅผ ํ์ฑํํ๊ณ ./manage.py runserver๋ฅผ ์คํํ์ญ์์ค.
์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ธํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.