올 한해 동안 테스트용으로 여러개의 Django 용 EC2 인스턴스를 만들면서 했던 삽질들 정리
작성할 내용의 99%는 구글링과 ChatGPT에서 얻은 내용이므로 컴플라이언스 이슈 없습니다
1. 기본 구조
데이터엔지니어링을 위한 테스트용 웹서버를 구축하는 간단한 구조입니다
- AWS EC2 서비스로 생성한 인스턴스를 사용합니다
- Django app의 view.py 에서 간단한 기능을 수행합니다 (주로 HTTP 요청 처리)
- NGINX 와 Gunicorn 으로 웹서버를 구축합니다
- AWS의 Route53와 Application Load Balancer 를 이용해서 HTTPS 인증서와 서브도메인을 할당합니다
2. EC2 인스턴스에 패키지 설치
2.1. Ubuntu + NGINX + Django + Gunicorn 설치
EC2 인스턴스를 생성할 때 OS를 선택할 수 있는데, 저는 기본적으로 Ubuntu LTS 를 선호합니다.
LTS(Long Term Support)는 Ubuntu 버전중에서 안정적인 버전이므로 특정기능을 테스트할 때 편리하게 사용할 수 있습니다
현재는 22.04 버전이 가장 최신버전입니다.
오래된 소스코드 및 라이브러리에 의존성이 있는 특수한 경우가 아니라면, 지나치게 오래된 버전을 고집하는 것도 지양합시다
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pip nginx
pip install django gunicorn
Ubuntu 에는 버전에 맞는 파이썬이 설치되어있지만, 그 외 패키지들은 직접 설치해주어야합니다
pip 와 nginx 를 apt 로 설치해주고, Django, Gunicorn 를 pip 로 설치해줍니다.
단일 테스트용 EC2 서버에서는 가상환경을 설정할 필요가 없으므로 가상환경 설정은 생략합니다.
### Django Project
django-admin startproject my_project .
### Install test
python ~/my_project/manage.py runserver 0.0.0.0:8000
Django 프로젝트 생성에 대한 자세한 설명은 생략합니다
오류메시지가 없다면 설치가 잘 되었겠지만~
그냥 넘어가면 허전하니까 Django 설치를 확인하는 runserver 0.0.0.0:8000 를 테스트로 실행해줍시다!
브라우저의 localhost:8000 에서 Django 의 웰컴메시지를 볼 수 있습니다 :D
이 때, 아래와 같이 django-admin 을 찾을 수 없다는 에러가 발생한다면 PATH 설정이 되어있지 않은 상태입니다
>> WARNING: The script django-admin is installed in '/home/ubuntu/.local/bin' which is not on PATH.
PATH 설정을 하기위한 간단한 방법입니다
## SHELL 확인
echo $SHELL
>> /bin/bash
## 편집 열기
sudo nano ~/.bashrc
## 경로추가 - 다음의 내용을 추가해주세요
export PATH="$HOME/.local/bin:$PATH"
## reload
source ~/.bashrc
먼저 SHELL 을 확인하기 위한 간단한 코드를 실행하면 bash 라고 응답을 받습니다
bashrc 파일을 열고 Django가 설치된 /bin 디렉토리를 PATH 에 추가합니다
2.2. Gunicorn 설정
### Edit gunicorn configure
sudo nano /etc/systemd/system/gunicorn.service
### 아래의 내용을 적어줍니다
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/workspace
ExecStart=/home/ubuntu/.local/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/workspace/my_project/my_project.sock my_project.wsgi:application
[Install]
WantedBy=multi-user.target
### Gunicorn 실행
sudo systemctl daemon-reload
sudo systemctl enable gunicorn.service
sudo systemctl start gunicorn.service
### 상태 확인
systemctl status gunicorn
gunicorn.service 에 위의 내용을 적어서 저장합니다
EC2 우분투 인스턴스에서 유저는 'ubuntu' 이므로, User = ubuntu 로 설정해줍니다.
worker 갯수는 적당히 3으로 설정하고, gunicorn 이 실행될 때 생기는 socket 위치를 설정합니다.
모든 경로는 각자의 개발환경에 맞게 잘 수정해주어야 오류가 나지않습니다.
start gunicorn.service 를 실행하면 설정된 경로에 .sock 파일이 생깁니다
2.3. NGINX 설정
### Edit configure
sudo nano /etc/nginx/sites-available/my_project
### 아래의 내용을 적어줍니다
server {
listen 80;
server_name {서버 주소};
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/ubuntu/workspace/my_project;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/workspace/my_project/my_project.sock;
}
}
server_name 에는 웹서버 주소를 적어줍니다. IP주소 형식일 수도 있고, 서브도메인 주소일 수도 있겠죠.
Gunicorn 설정에서 만든 .sock 파일과 경로가 일치하는지 다시 확인해줍니다.
그리고 일반적인 EC2 환경에서 502 Permission Error 가 생기므로 반드시 수정해주어야 할 부분이 있습니다.
connect() to (생략)/my_project.sock failed (13: Permission denied) while connecting to upstream,
### 권한을 가진 유저 확인하기
ls -la workspace/my_project/my_project.sock
>> srwxrwxrwx 1 ubuntu www-data 0 Mar 2 07:50 workspace/my_project/my_project.sock
### Edit configure
sudo nano /etc/nginx/nginx.conf
### User 를 www-data 에서 ubuntu 로 바꾸어줍니다
nginx.conf 파일에 기본 유저가 www-data 로 설정되어있지만
.sock 파일에 접근 권한을 가진 EC2 루트유저의 이름은 ubuntu 이므로 권한 오류가 발생합니다
이것 때문에 꽤나 고생했네요
2.4. Django 테스트
장고에대해 쓰는 글은 아니지만 설정확인을 위한 간단한 방법을 만듭니다
### app 만들기
django-admin startapp my_app
각자의 개발환경에서 적절하게 디렉터리를 맞추고 startapp 으로 앱을 만들어줍니다
개발 메모에서 실제 프로그램 구조를 지우면서 글을 작성하다보니 urls.py 설정은 생략합니다.
ALLOWED_HOSTS=['*']
ALLOWED HOST 에러가 뜰 것이니 settings.py 에 모든 호스트를 허락해줍니다
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world this is test')
view.py 에 테스트용 코드를 적어주고나서 HTTP 요청을 보내면 'hello workd this is test'라는 응답을 받습니다
2.5. (선택) Redis 로 캐시 저장하기
만약 Django 캐시를 사용하는 상황이라면,
위에서 Gunicorn worker 를 3으로 설정하다보니 각각의 worker가 다른 캐시를 가지고 있게 됩니다.
즉 웹사이트를 새로고침할때마다 다른 캐시 결과를 보여주는 문제가 생깁니다.
이 문제를 풀 간단한 해결방법으로 Redis 를 사용합니다
sudo apt-get install redis-server
pip install django-redis
### settings.py 에 다음의 내용을 추가
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1", # Adjust as needed
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
###
redis-server 와 django-redis 를 설치한 뒤에 장고의 settings.py 에 캐시에 대한 내용을 추가로 작성해주면
간단하게 모든 Gunicorn worker 가 동일한 캐시를 가집니다!
'데이터 사이언스 or 엔지니어링 > 응용을 위한 기술들' 카테고리의 다른 글
WSL-pyspark 실습 환경 설정 (0) | 2022.04.04 |
---|---|
Container와 Docker란 ? (0) | 2022.03.06 |