기존의 EC2를 여러개 만들고 이들에게 ELB가 트레픽을 분산시켜주는 과정에서 가장 큰 불편한점? 이라고 하면 당연히 EC2인스턴스를 5개면 5개 10개면 10개, 100개면 100개를 일일히 다 만들어 주어야 했다는 점입니다. 당연히 이를 AMI즉 이미지를 만들어서 그 안의 파일들과 그 환경을 통해 새로운 인스턴스를 만들 수 있었습니다.
하지만 배포를 하고 python manage.py runserver 0.0.0.0:8000을 계속 해주어야 했고, 이를 100개 다 일일히 해주는 일이란 너무 불편하지 않을 수 없습니다. 그런데 웹서버 요즘 유명한 NginX같은 것은 그냥 파일형태로 저장되면 이 자체가 그냥 웹으로 보여지는 것이라고 보면 됩니다.
그래서 Nginx, Gunicorn, Supervisor이 셋을 통해서 자동으로 NginX파일, Python폴더만 있으면 자동으로 배포되게끔 할 수 있습니다.
WSGI란
결론부터 말씀드리면 Gunicorn은 WSGL(Web Server Gateway Interface)의 일종이고, Django로 서버 배포를 하기 위해서 필요로 하는 존재입니다. WSGI는 CGI(Common Gateway Interface)의 일종으로 CGI는 정적인 웹에서 동적인 웹으로 발전함에 따라 각기다른 프로그래밍 언어가 사용되어 "공통적인 형태"로 주고받기 위해 만든 규약입니다. 따라서 웹 서버가 클라이언트 요청을 받으면 CGI에 의해 일관된 형태로 해석되어 WAS에서 처리할 수 있는 것입니다.
실습
우선 기존의 방식대로 AWS EC2인스턴스를 하나 만들었습니다.
그리고 ssh로 들어가서 아래 명령어를 하나씩 쳐줍니다.
$sudo apt update
$sudo apt-get install python3-pip
$sudo pip3 install gunicorn
$sudo apt-get install supervisor
$sudo apt-get install nginx
$sudo pip3 install django
$django-admin startproject django_nginx
이렇게 django project하나를 만들고 마지막으로 settings.py의 allowed host에 "*"를 하나 추가해 줍니다.
그 다음에는 configure 파일을 바꾸어 줄 겁니다. /etc/supervisor/conf.d에서 django.conf를 만들어서 아래와 같이 수정해 주도록 하겠습니다.
[program:gunicorn]
directory=/home/ubuntu/django_nginx
command=/usr/local/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/django_nginx/app.sock django_nginx.wsgl:applic
ation
autostart=true
autorestart=true
stderr_logfile=/logs/gunicorn.err.log
stdout_logfile=/logs/gunicorn.out.log
간단히 기본 설정을 하고 아래와 같은 명령어를 또 쳐줍니다. 이 코드에 대한 간단한 의미는 /ubuntu/django_nginx안에서 진행할 것이다. 그 아래는, django_nginx.wsgi:application에 있는 소켓을 사용하겠다는 의미이고, 자동 재시작도 자동으로 하겠다는 의미입니다. 그리고 다양한 로그파일들의 위치도 지정해 줍니다.
$mkdir /logs
$sudo supervisorctl reread
$sudo supervisorctl update
$cd /etc/nginx
$cd sites-available
$sudo touch django.conf
$sudo vim django.conf
를 하고 django.conf을 아래와 같이 작성합니다.
server {
listen 80;
server_name *.compute.amazonaws.com;
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/django_nginx/app.sock;
}
}
여기서 server_name에 *이 들어간 이유는 나중에 auto scaling을 할 떄 골치아파지는 경우를 배제하기 위함입니다. 그리고 location /에 대해서 proxy를 app.sock과 연결시켜 주었습니다.
$sudo ln django.conf /etc/nginx/sites-enabled/
$sudo service nginx restart
마지막으로 위 코드를 하고 nginx를 재시작 해주면 public IPv4주소로 들어가게 되면 아래와 같은 화면을 확인할 수 있을 겁니다.
그 다음에 이 인스턴스에 대한 이미지를 만들어 보겠습니다.
그리고 이 이미지를 활용하여 새 EC2인스턴스를 만들어 보겠습니다.
이에 대한 nginx_image_instance라는 인스턴스를 새로 만들어 주고 public IPv4로 들어가면 아래와 같은 화면이 나옵니다.
정상 작동하는 것을 확인하실 수 있습니다.