Dango + uWSGI + Nginx
๐ก uWSGI
Web์๋ฒ๊ฐ ๋ฐ์ ํธ์ถ์ Python ์ดํ๋ฆฌ์ผ์ด์ ์๊ฒ ์ ๋ฌํ๊ณ ์๋ต๋ฐ๊ธฐ ์ํ ํธ์ถ์กฐ์ฝ(Calling Convention)
uWSGI <-> Django
- uWSGI.ini (์ค์ ํ์ผ)
[uwsgi]
# ์ฅ๊ณ ํ๋ก์ ํธ ๊ฒฝ๋ก
chdir = /Users/giljun/gilbert/drf_todo
# wsgi ๋ชจ๋ ๊ฒฝ๋ก
module = drf_todo.wsgi:application
# ๊ฐ์ํ๊ฒฝ ๊ฒฝ๋ก
home = /Users/giljun/opt/anaconda3/envs/django
#
env = DJANGO_SETTINGS_MODULE=drf_todo.settings
# pid๋ฅผ ์ฃฝ์ฌ๋ worker๋ฅผ ์ด๋ ค์ค๋ค.
master = True
#
enable-threads = True
# ์ต๋ ์์ฒญ
max-requests=5000
# ๋ฒํผ ํฌ๊ธฐ
buffer-size=32768
chmod-socket = 666
# ์์ผ
socket = /tmp/drf_todo.sock
# ๋ก๊ทธ
logger = file:/tmp/uwsgi.log
# ํ๋ก์ธ์ค ์์ด๋ ๋ฒํธ๊ฐ ์ ํ
pidfile = /tmp/drf_todo.pid
# ์๋ฒ๊ฐ ์ข
๋ฃ๋๋ฉด ์์ผ, ๋ก๊ทธ, pid๋ฅผ ์ญ์ ํด์ค๋ค.
vacuum=True
๋ ๋ง์ ์ค์ ๋ค์ด ์๋๋ฐ ํ์ํ ์ค์ ์ด ์์ ๋ ์ฐพ์๋ณด๋ฉด์ ํด์ผํ ๊ฒ ๊ฐ๋ค.
์คํ ๋ช
๋ น์ด๋ uwsgi --ini uwsgi.ini
์ด๋ค.
์ถ๊ฐ์ ์ผ๋ก โhttp :
๋ก๊ทธ๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด /tmp ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ์ tail -f uwsgi.log
๋ผ๊ณ ์
๋ ฅํ๋ ๋๋ค.
๐ก Nginx
์ด ๋ถ๋ถ ์ค์ ์ด ๊ต์ฅํ ํ๋ค์๋ค. ์๊ณ ์ค์ ํ๊ณ ์ถ์๋๋ฐ ๋ญ๊ฐ ๋ผ์ ๋ง์ถ ๋๋..?
Nginx <-socket-> [ uWSGI <-> Django ]
- drf_todo.conf
๋ด๊ฐ ๋ง๋ django ํ๋ก์ ํธ์ nginx ์ค์ ํ์ผ์ด๋ค.
sites-available, sites-enabled ํด๋๋ ์์ด์ ์ง์ ๋ง๋ค์๊ณ , ๊ฐ๊ฐ์ ํด๋์ drf_todo.conf๋ฅผ
์์ฑํด์ ์ ์ฅํด๋๋ค. ์ฌ๋ณผ๋ฆญ๋งํฌ๋ฅผ ํด์ค๋ค๋๋ฐ ์ด๋ถ๋ถ์ ๊ณต๋ถ๋ฅผ ๋ ํ๋ฉด์ ์ด์ ๋ฅผ ์์๋ด์ผ๊ฒ ๋ค.
์์น : /opt/homebrew/etc/nginx/sites-enabled
# upstream(proxy) ์ค์
upstream django {
# Nginx์ uWSGI๋ฅผ ์ด์ด์ฃผ๋ ์์ผ.
server unix:///tmp/drf_todo.sock;
}
# configuration of the server
server {
# client๊ฐ ๋ค์ด์ค๋ port
listen 8001;
# client๊ฐ ์คํํ๋ ์๋ฒ์ IP์ฃผ์ or Domain
server_name localhost;
charset utf-8;
# log settings.
access_log /opt/homebrew/Cellar/nginx/1.21.4/log/access.log;
error_log /opt/homebrew/Cellar/nginx/1.21.4/log/error.log;
# max upload size
client_max_body_size 75M;
# Django media ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก (alias๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ง์ง๋ง์ / ๋ฃ๊ธฐ.)
location media/ {
alias /Users/giljun/gilbet/drf_todo/media/;
}
# Django static ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
location static/ {
alias /Users/giljun/gilbet/drf_todo/static/;
}
# media์ static์ ์ ์ธํ ๋ชจ๋ ์์ฒญ์ upstream์ผ๋ก ๋ณด๋ธ๋ค.
location / {
# uwsgi_pass (์์ upstream์ผ๋ก ์ค์ ํ block์ ์ด๋ฆ)
uwsgi_pass django;
# uwsgi_params์ ๊ฒฝ๋ก
include uwsgi_params;
}
}
์์ ์ ์ํ ํ์ผ์ ๋ด ํ๋ก์ ํธ์ nginx ์๋ฒ์ ๋ํ ์ค์ ์ ํด์ค ํ์ผ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ด ์ค์ ํ์ผ (drf_todo.conf)์ nginx๋ฅผ ์คํํ ๋ ์ฝ์ ์ ์๊ฒ
๋ง์ ์ค์ ์ ํด์ฃผ์ด์ผํ๋ค. (์ด ๋ถ๋ถ์์ ์๊ฐ์ ๋ง์ด ํ๋นํ๋ค.)
- niginx.conf
nginx๋ฅผ ๋ค์ด๋ฐ์ผ๋ฉด ์๊ธฐ๋ default ํ์ผ.
์์น : /opt/homebrew/etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
โโโโโโโโโโโโโ ํ๋ก์ ํธ์ nginx์ค์ ์ ์ถ๊ฐํด์ค์ผํ๋ค. โโโโโโโโโโโโโ
include /opt/homebrew/etc/nginx/sites-enabled/drf_todo.conf;
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
์ด๋ ๊ฒ ์ค์ ์ ๋คํ๊ณ itersm์๋ค๊ฐ nginx๋ฅผ ์์ํด์ฃผ๊ณ , uwsgi๋ ์์ํด์คฌ๋ค.
nginx
uwsgi โini uwsgi.ini
๊ทธ๋ฆฌ๊ณ localhos:8001 ๋ก ๋ค์ด๊ฐ๋ ์ฐ๋์ด ์๋๋ฏ ๋ณด์๋ค.
- ) ์ฒ์์ static ํ์ผ ์์น ์ค์ ์ผ๋ก ์๊ฐ์ด ์ซ ๊ฑธ๋ ธ๋๋ฐ
์๋ฅผ ๋ค์ด location /static/ { root /var/www/app/static; }์ ๊ฒฝ์ฐ
๊ฒฝ๋ก๋ var/www/app/static/static์ด ๋๋ค.
๋ฐ๋ฉด, location /static/ { alias /var/www/app/static/;}์ ๊ฒฝ์ฐ
๊ฒฝ๋ก๋ var/www/app/static/์ด ๋๋ค.