BackEnd/Django

[uWSGI] Django NGINX ์—ฐ๋™

ddonghyeo 2023. 9. 2. 00:09

 

ํ•œ์ฐฝ ์žฅ๊ณ ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ ๋‚˜๋ฉด runserver๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์ง€๋งŒ, ์ง์ ‘ ๋ฐฐํฌ๋ฅผ runserver๋กœ ํ•˜๊ฒŒ๋˜๋ฉด ๋ณด์•ˆ, ์•ˆ์ •์„ฑ, ํšจ์œจ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์ข‹์ง€์•Š๋‹ค.

  • django.core.servers.basehttp 
""" HTTP server that implements the Python WSGI protocol (PEP 333, rev 1.21). Based on wsgiref.simple_server which is part of the standard library since 2.5. This is a simple server for use in testing or debugging Django apps. It hasn't been reviewed for security issues. DON'T USE IT FOR PRODUCTION USE! """

์žฅ๊ณ ์—์„œ๋„ runserver๋ฅผ ํ…Œ์ŠคํŠธ๋‚˜ ๋””๋ฒ„๊น… ์šฉ์œผ๋กœ ์“ฐ๋ผ๊ณ  ๊ถŒ์žฅํ•œ๋‹ค.

 


๋”ฐ๋ผ์„œ, WS์ธ NGINX์™€ uWSGI๋ฅผ ํ†ตํ•ด์„œ ์—ฐ๋™์‹œ์ผœ ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

NGINX์™€ ๊ฐ™์€ WS๋“ค์€ python ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์„ํ•  ๋Šฅ๋ ฅ์ด ์—†๋‹ค.

 

python๊ณผ๊ฐ™์€ ์–ธ์–ด๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋Š” CGI๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ด ๋•Œ WSGI๋Š” ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

๋ณดํ†ต์€ WS + CGI + Django

์—์„œ WSGI๋กœ gunicorn์ด๋‚˜ uWSGI๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ,

gunicorn๋ณด๋‹ค uWSGI๊ฐ€ ํšจ์œจ์ ์ธ ๋ฉด์—์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์„œ uWSGI๋ฅผ ์ด์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.




1. uWSGI ์„ค์ •



uWSGI ์„ค์น˜

$ yum install -y gcc
$ pip install uwsgi

yum ์„ ์ด์šฉํ•ด์„œ gcc๋ฅผ ๋จผ์ € ์„ค์น˜ํ•˜๊ณ , pip์„ ์ด์šฉํ•ด์„œ uWSGI๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


uWSGI ์„ค์ •

์„ค์น˜๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

$ mkdir -p /etc/uwsgi/sites
$ vi /etc/uwsgi/sites/django-project.ini

 

 

์œ„ ํŒŒ์ผ๋ช…์˜ 'django-project'์—๋Š” ๋‚ด๊ฐ€ ์‹œ์ž‘ํ•œ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด๋†“๋„๋ก ํ•˜์ž.

[uwsgi]
project = django-project #ํ”„๋กœ์ ํŠธ ๋ช…
username = ec2-user #์‚ฌ์šฉ์ž
base = / #base ๋””๋ ‰ํ† ๋ฆฌ

### Django Settings
# base directory
chdir = /home/ec2-user/django-project #์žฅ๊ณ  ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ
# python path
home = /usr #ํŒŒ์ด์ฌ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ
# virtualenv path
# virtualenv = /home/env/test #๊ฐ€์ƒํ™˜๊ฒฝ. ์žˆ๋‹ค๋ฉด ์„ค์ •
# wsgi.py path
module = config.wsgi:application #์žฅ๊ณ  ํ”„๋กœ์ ํŠธ ๋‚ด wsgi


master = true
processes = 5 #ํ”„๋กœ์„ธ์Šค ์ˆ˜

uid = ec2-user
socket = /run/uwsgi/django-project.sock #์†Œ์ผ“ ์ „๋‹ฌ ์œ„์น˜
chown-socket = root:nginx
chmod-socket = 660
vacuum = true

logto = /var/log/uwsgi/django-project.log

 

์„œ๋ฒ„ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ์ž‘๋™ํ–ˆ๋‹ค.

 

ํŒŒ์ด์ฌ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ, ์žฅ๊ณ  module ์ด๋ฆ„ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค.

 

โ€ผ๏ธ home์˜ ๊ฒฝ์šฐ python ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.

๋งŒ์•ฝ ํŒŒ์ด์ฌ์ด /usr/bin/python ๊ฒฝ๋กœ์— ์žˆ๋‹ค๋ฉด, /usr ๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด uwsgi๊ฐ€ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ž๋™์œผ๋กœ ๋’ค์— /bin/python์„ ๋ถ™์ธ๋‹ค.

 

 

โ€ผ๏ธ module์˜ ๊ฒฝ์šฐ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ์˜ wsgi.py๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ๋Š” config ์•ฑ ๋‚ด์— wsgi.py๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— config.wsgi:application๋กœ ์„ค์ •ํ•ด์คฌ๋‹ค.

 

uWSGI๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ์‚ฌ์ด ๋‚˜์˜ค๋Š” ๋กœ๊ทธ๋Š” logto์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

mkdir -p /var/log/uwsgi



uWSGI ์„œ๋น„์Šค ์ž‘์„ฑ

uWSGI๊ฐ€ ์„œ๋น„์Šค๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

emperor๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

$ vi /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI service

[Service]

ExecStartPre=/bin/mkdir -p /run/uwsgi

ExecStartPre=/bin/chown root:nginx /run/uwsgi

ExecStart=/home/ec2-user/.local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

 

 

 

$ systemctl daemon-reload
systemctl start uwsgi



์„œ๋น„์Šค๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

 

2. NGINX ์„ค์ •

์ด์ œ ์„ค์น˜ํ•ด๋‘” NGINX๋ฅผ ์„ค์ •ํ•ด์ฃผ์ž.

 vi /etc/nginx/nginx.conf
server{

        listen 8000;

        server_name {์„œ๋ฒ„ ๋„๋ฉ”์ธ ๋˜๋Š” IP};



        location / {

                include uwsgi_params;

                uwsgi_pass unix:/run/uwsgi/django-proejct.sock;

        }

}

์„œ๋ฒ„์— ๋งž๊ฒŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

uwsgi_params๋Š” ํ”„๋กœํ† ์ฝœ ๋ณ€์ˆ˜์ด๋‹ค.

 

ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ include ํ•ด์คŒ์œผ๋กœ์จ ์›น ์„œ๋ฒ„๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ๋ณ€์ˆ˜๋“ค์„ uWSGI์„œ๋ฒ„๊ฐ€ ๋™์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

 

uwsig_pass๋Š” uwsgiํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด์„œ uWSGI์— ์„œ๋ฒ„ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๊ณ , iniํŒŒ์ผ์—์„œ ์ž‘์„ฑํ–ˆ๋˜ unix socket์„ ์‚ฌ์šฉํ•œ๋‹ค.





3. Selinux

vi /etc/sysconfig/selinux
SELINUX=disabled
reboot

well-knownํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์ œํ•ด์ค€๋‹ค.

 

์›๋ž˜๋Š” Selinux๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„๊ถŒํ•œ์„ ์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.





4. ์‹คํ–‰

 systemctl start uwsgi
 systemctl enable uwsgi

uwsgi ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , 8000ํฌํŠธ๋กœ ์ ‘์†ํ•˜๋ฉด ์žฅ๊ณ  ์•ฑ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹คํ–‰๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.