๐[Django] Ubuntu & Django?
์ฐ๋ถํฌ??
์ฐ๋ถํฌ(Ubuntu)
๋ ๋ฐ๋น์(Debian) ๊ธฐ๋ฐ์ ๋ฆฌ๋
์ค ๋ฐฐํฌํ์ผ๋ก, ๊ฐ์ธ ์ฌ์ฉ์๋ถํฐ ๊ธฐ์
์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๋ฒ์ ์ ๋๋ก ์ดํดํ ์ ์๋ค!
๋ฐ๋น์์ ๋ ๋ญ๋ฐ?
๋ฐ๋น์
์ ์ด์ ๋จธ๋
(Ian Murdock)์ ์ํด ์ค๋ฆฝ๋ ์์ ์ํํธ์จ์ด ๊ณต๋์ฒด์.
๋ฐ๋น์ ํ๋ก์ ํธ๋ GNU/Linux
์ด์ ์ฒด์ ์ ํ ์ข
๋ฅ์ธ ๋ฐ๋น์ GNU/Linux
๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ์ง๋ณด์ํ๋ค.
๋ฐ๋น์ ํ๋ก์ ํธ๋ ์์ ์ํํธ์จ์ด๋ฅผ ์ง์งํ๊ณ , ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค
์ผ๋จ ์ด์ ๋๋ง ์๊ณ ๋์ด๊ฐ์..!
์ฐ๋ถํฌ์ ์ฃผ์ ์ฉ๋
- ๊ฐ์ธ์ฉ ๋ฐ์คํฌํ
- ์ฌ์ฉ์ ์นํ์ ์ธํฐํ์ด์ค์ ๊ด๋ฒ์ํ ์ํํธ์จ์ด ํธํ์ฑ์ผ๋ก ๊ฐ์ธ ์ฌ์ฉ์์๊ฒ ์ ํฉํจ!
- ์๋ฒ ํ๊ฒฝ
- ์์ ์ฑ๊ณผ ๋ณด์์ฑ์ ๋ฐํ์ผ๋ก ์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ๋ฑ ๋ค์ํ ์๋ฒ ์ฉ๋๋ก ์ฌ์ฉ๋จ!
- ํด๋ผ์ฐ๋ ์ปดํจํ
- ์ฐ๋ถํฌ ์๋ฒ๋ AWS, Azure, Google Cloud ๋ฑ์ ์ฃผ์ ํด๋ผ์ฐ๋ ํ๋ซํผ์์ ์ง์๋๊ณ , ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ์ต์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํจ!
- ์ฌ๋ฌผ ์ธํฐ๋ท
- ์ฐ๋ถํฌ ์ฝ์ด๋ฅผ ํตํด IoT ์ฅ์น์๋ ์ต์ ํ๋ ์ด์์ฒด์ ๋ก ์ฌ์ฉ๋๋ค๊ณ ํ๋ค.
์ฐ๋ถํฌ ์ค์น ๋ฐ ์ค์
์ฐ๋ถํฌ ISO ํ์ผ ๋ค์ด๋ก๋
์ฐ๋ถํฌ ๊ณต์ ์น์ฌ์ดํธ์์ ์ต์ ์ฐ๋ถํฌ ๋ฐ์คํฌํ ๋ฒ์ ์ ISO ํ์ผ์ ๋ค์ด๋ก๋ํ ์ ์๋ค!
๋ถํ ๊ฐ๋ฅํ USB ๋๋ผ์ด๋ธ
์ฐ๋ถํฌ ISO ํ์ผ์ ์ฌ์ฉํ ๋ถํ ๊ฐ๋ฅํ USB ๋๋ผ์ด๋ธ(์ต์ 4GB ์ด์)๋ฅผ ์ค๋นํด์ผํจ!
Rufus
๋ถํ ๊ฐ๋ฅํ USB ๋๋ผ์ด๋ธ๋ฅผ ๋ง๋๋ ๋๊ตฌ์.
Rufus ๊ณต์ ์น์ฌ์ดํธ์์ ๋ค์ด๋ก๋ ๊ฐ๋ฅ~!
์ฐ๋ถํฌ ์ ์ํ๊ธฐ
๋ก๊ทธ์ธ
AWS์์ ์ฐ๋ถํฌ ์๋ฒ์ ์ ์ํ๋ ค๋ฉด SSH ํ๋กํ ์ฝ์ ์ฌ์ฉํจ.
์ด๋ฅผ ์ํด AWS ๊ด๋ฆฌ ์ฝ์์์ ์ ๊ณตํ ํค ํ์ด
๋ฅผ ์ฌ์ฉํด ๋ณด์ ์ฐ๊ฒฐ์ ์ค์ ํด์ผํ๋ค!
AWS ๊ธฐ์ค ์ฐ๋ถํฌ ์๋ฒ ์ ์ ๋ฐฉ๋ฒ
AWS ์ธ์คํด์ค์ SSH๋ก ๋ค์ด๊ฐ์!
chmod 400 /path/to/your-key-file.pem
ssh -i "your-key-file.pem" ubuntu@ec2-xx-xxx-xxx-xx.ap-northeast-2.compute.amazonaws.com
- ec2-xx-xxx-xxx-xx๋ EC2์ ํผ๋ธ๋ฆญ IP ์ฃผ์์!
- aws ec2 ๋์๋ณด๋ ๋ค์ด๊ฐ์ ์ธ์คํด์ค ์ฐ๊ฒฐ โ SSH ์ฐ๊ฒฐ ๋๋ฅด๋ฉด ์๋์ SSH ์ ์ ๋ช ๋ น์ด ์ ๊ณตํจ
๋ฐฐํฌ๋ ์ด๋ป๊ฒ?
์๋ฅผ ๋ค์ด, Django ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ค๋ฉด Gunicorn
๊ณผ Nginx
๋ฅผ ๊ฒฐํฉํ์ฌ ๋ฐฐํฌ๋ฅผ ์งํํ๋ค!
Django์์ ๊ฐ๋ฐ ๋ฐ ํ
์คํธ์ ์ฌ์ฉํ๋ runserver
๋ช
๋ น์ด๋ฅผ ํตํ ์๋ฒ๋ ๊ณ ์ฑ๋ฅ์ ์ํ ์ต์ ํ๊ฐ ๋์ด์์ง ์์ ์๋ฒ์!!
์ฌ์ง์ด ๋ฉํฐ ์ค๋ ๋
๋ฐ ๋ฉํฐ ํ๋ก์ธ์ค
๋ฅผ ์ง์ํ์ง ์์, ๊ณ ๋ถํ ํ๊ฒฝ์์ ์์ ์ ์ผ๋ก ๋์ํ์ง ์๋๋ค๋ ๋จ์ ๋ ์๋ค..
๊ฒ๋ค๊ฐ ๋ณด์์ ์ธ ์ธก๋ฉด์์๋ ์ฝ์ ์ด ๋ง๋ค๊ณ ํ๋ค..
๊ทธ๋ผ Gunicorn์ด ๋ญ๋ฐ?
Gunicorn(Green Unicorn)
์ Python WSGI ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ HTTP ์๋ฒ
์!
- WSGI(Web Server Gateway Interface) [WSGI ๊ณต์๋ฌธ์]
- ์ฝ๊ฒ ์๊ฐํ๋ฉด Python Application์ด ์น ์๋ฒ์ ํต์ ํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค๋ก, ํ์ด์ฌ ํ๋ ์์ํฌ๋ก ์ดํดํ ์ ์๋ค.
Gunicorn ํน์ง
- WSGI ์๋ฒ
- ๋ฉํฐ ํ๋ก์ธ์ค ์ง์
- ์ฌ๋ฌ Worker ํ๋ก์ธ์ค๋ฅผ ์คํํด ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค!
- ๊ฐ๋จํ ์ค์
- ํ์ฅ์ฑ
- Worker ํ๋ก์ธ์ค ์๋ฅผ ์กฐ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ฝ๊ฒ ํ์ฅํ ์ ์๋ค!
Nginx๋?
Nginx
๋ ์น ์๋ฒ & ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ Gunicorn ์๋ฒ๋ก ์ ๋ฌํ๊ณ , ์ ์ ํ์ผ์ ์ ๊ณตํ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ง ์ค์ํ ๊ธฐ๋ฅ์ ์ํํ๋ค!
Nginx ํน์ง
- ์ ์ ํ์ผ ์๋น
- ์ ์ ํ์ผ(CSS, JavaScript, ์ด๋ฏธ์ง ๋ฑ)์ ๊ณ ์์ผ๋ก ์ ๊ณตํ ์ ์๋ค.
- Gunicorn์ ๋์ ์ปจํ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ ์ ํ์ผ ์๋น์ Nginx๊ฐ ๋ด๋นํ์ฌ ํจ์จ UP!
- ๋ฆฌ๋ฒ์ค ํ๋ก์
- Nginx๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ Gunicorn์ ์ ๋ฌํ๊ณ , Gunicorn์ผ๋ก๋ถํฐ์ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
- ์ด๋ฅผ ํตํด Guicorn์ ๋ค์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์บ์ฑ, SSL ์ข ๋ฃ ๋ฑ์ ์ญํ ์ ์ํํ ์ ์๋ค!
- ๋ณด์
- Nginx๋ ๋ค์ํ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , Dos ๊ณต๊ฒฉ ๋ฐฉ์ด์ SSL/TLS ์ค์ ๋ฑ์ ํตํด ๋ณด์์ฑ์ ๊ฐํํ ์ ์๋ค!
- ๋ก๋ ๋ฐธ๋ฐ์ฑ
- ์ฌ๋ฌ Gunicorn ์ธ์คํด์ค์ ํธ๋ํฝ์ ๋ถ์ฐ์์ผ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ ์ ์๋ค!
- ๊ณ ์ฑ๋ฅ
๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ
๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค!
์๋ฒ ํ๊ฒฝ ์ค์ ์ ํด๋ณด์!
์์คํ ์ ๋ฐ์ดํธ ๋ฐ ํจํค์ง ์ค์น
sudo apt update
sudo apt upgrade -y
- ์์คํ ํจํค์ง ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๊ณ ๋ชจ๋ ํจํค์ง๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํจ.
sudo apt install python3-pip python3-dev libpq-dev nginx curl -y
- Python ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์ ๊ฐ๋ฐ ํค๋ ํ์ผ, PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์น ์๋ฒ Nginx, ๊ทธ๋ฆฌ๊ณ curl์ ์ค์นํจ.
์๋ฒ ์์์๋ ๊ฐ์ํ๊ฒฝ!
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
source ~/.bashrc
conda create -n env python=3.10
conda activate env
pip install django
- conda ๊ฐ์ํ๊ฒฝ์ผ๋ก ์งํํจ
Django ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ฑฐ๋ ํด๋ก ๋ฐ์!
settings.py
์์ DB ์ค์ ์ ๋ด๊ฐ ์ฌ์ฉํ๋ ค๋ DB๋ก ๋ฐ๊พธ์!
๊ทธ๋ฆฌ๊ณ ALLOWED_HOTS
๋ฅผ ๋ง์ ธ์ค์ผ๋๋ค.
ALLOWED_HOSTS = ['your-ec2-public-dns', 'your-domain.com']
- EC2 ์ธ์คํด์ค์ ํผ๋ธ๋ฆญ DNS ๋๋ IP๋ฅผ ์ถ๊ฐ
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
- ์ ์ ํ์ผ ์ค์ ๋ ํด์ฃผ๊ณ
python manage.py makemigrations
python manage.py migrate
- ๋ค ํ์ผ๋ฉด ๋ง์ด๊ทธ๋ ์ด์
python manage.py createsuperuser
python manage.py runserver 0:8000
- ๊ด๋ฆฌ์ ๊ณ์ ๋ ๋ง๋ค์ด์ฃผ๊ณ ์คํํด๋ณด์!
Gunicorn ์ฌ์ฉ
๋จผ์ gunicorn ์ค์น๋ถํฐ ํด์ผ์ง!
pip install gunicorn
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Nginx๋ ๊ฐ์ด ์ด๋ค ํ์ผ๋๊น!
sudo apt update
sudo apt install nginx -y
nginx -V # ๋ฒ์ ผ ํ์ธ
Nginx ์ค์
sudo /etc/init.d/nginx start
- Nginx ์์ํด๋ณด๊ธฐ!
# nano /etc/nginx/nginx.conf
http {
....
# /etc/nginx/conf.d ๋๋ ํ ๋ฆฌ ์๋ ์๋ .conf ํ์ผ์ ๋ชจ๋ ๋ถ๋ฌ์ด
include /etc/nginx/conf.d/*.conf;
}
default.conf ์์ฑ
# nano /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name pub_ip;
location /{
proxy_pass http://127.0.0.1:8000;
}
}
nano /etc/nginx/conf.d/default.conf
๋ช ๋ น์ด๋ก ํ์ผ์ ์ด๊ณ , ์์ ํ ์ ์ฅํ๋ ค๋ ์๊พธ ์ค๋ฅ ๋ฐ์ํจ- ํ์ผ์ ์ฌ๋ ๋ช
๋ น์ด๋ฅผ
sudo nano /etc/nginx/conf.d/default.conf
๋ก ํ๋ฉด ํด๊ฒฐ๋จ!
sudo service nginx restar
- Nginx ์ฌ์์ ํด๋ณด๊ธฐ!
๋๊ธ๋จ๊ธฐ๊ธฐ