Nginx + Gunicorn + Django 세팅

김도형·2021년 3월 28일

server

목록 보기
1/3

회사에서 필요한 테스트 서버를 구축하기 위해
현재 사용하고 있는 python django를 위한
서버 세팅을 하게 되었습니다.

나의 환경

ec2 - ubuntu 인스턴스 유형 - t2 micro(프리티어 사용가능 추후 변경 가능)
mac os (big sur)
miniconda (가상환경) 참고로 로컬 가상환경은 venv를 사용합니다.
Django 3.1.7
mysql

1. AWS 계정 생성 및 EC2 생성

aws 계정을 만드는 과정은 생략하도록 하고 해당 계정에 ec2를 생성하면 되는데
ec2를 생성할 때 신경 써야 할 부분은 스토리지와 서브넷, ec2 인스턴스 유형입니다.

※ ec2 생성 후 고정적인 ip 설정을 위한 탄력적 ip 생성하기

ec2 보안그룹 설정 시 아래와 같이 설정하면 됩니다.

⚠️ 참고로 ssh 접속은 보안때문에 모든 ip에서 접근이 되면 안되므로 특정 ip만 설정해야 합니다.

서버 접속

인스턴스 생성하면서 받은 pem키를 새로운 디렉토리로 저장한 뒤
파일의 권한을 바꿔줘야 합니다.

# 터미널을 키고, pem 파일을 받아 놓은 위치로 간다.
# 해당 위치에서 아래의 명령어 입력
$ chmod 400 키페어파일이름.pem

권한 변경 후 아래의 명령어로 ssh 접속 가능합니다.

ssh -i 키페어파일이름.pem ubuntu@퍼블릭 ip(탄력적 ip)

ec2 접속할 때마다 위의 긴 명령어를 사용하기에는 부담이 되므로

# 아래의 명령어로 설정 파일을 열고 alias 설정 
$ vi ~/.zshrc

# 설정 후 적용을 위한 
$ source ~/.zshrc 

# pem키가 있는 디렉토리로 이동 후 
ex) $ enter 와 같이 alias로 설정해 준 단축어를 이용해 ec2 접속  

가상환경 miniconda 설정

Linux installers

# 터미널에서 아래에 복사한 링크 붙여넣기 
$ wget https://repo.ananconda.com/minicona/Miniconda3-latest-Linux-x86_64.sh

# 실행권한 주기
$ chmod +x Miniconda3-latest-Linux-x86_64.sh

# 미니콘다 실행시켜서 설치하기
$ ./Miniconda3-latest-Linux-x86_64.sh
# 엔터 와 yes로 모든 과정 건너뛰기

# bash shell 스크립트를 실행해서 로컬 환경과 같게 설정하기
$ source .bashrc
# 이 과정을 거치면 명령어 제일 앞에 (base) 생성

위의 과정에 이어서 가상환경 (미니콘다) 설치

# 패키지 업데이트 및 업그레이드
$ sudo apt-get update
$ sudo apt-get upgrade

# mysql 클라이언트 설치시 에러 안나게 하려면 gcc 설치 필요
$ sudo apt-get install gcc
$ sudo apt-get install libmysqlclient dev

# 가상환경 생성
$ conda create -n [생성하고 싶은 가상환경 이름] python=3.8.5

# 가상환경 활성화
$ conda activate project

Django 세팅하기

원하는 경로에 프로젝트 디렉토리 생성 후
해당 디렉토리에서 git clone 으로 django project 생성하기

# git clone
$ git clone 깃허브에서 복사해온 깃레퍼지토리 주소

# requirements 설정
$ pip install -r requirements.txt
$ pip freeze (설치 여부 확인)

# mysqlclient 설치 오류 시 
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

$ python manage.py runserver 0.0.0.0:8000

위의 명령어를 실행하고 http://탄력적ip 또는 dns주소:8000 로 접속하면

짜잔! 위의 화면이 뜹니다.

하지만 여기서 끝난 게 아니죠 ... 실 서비스를 위해서는 백그라운드로 24시간 돌려야 합니다.

Gunicorn 세팅하기

gunicorn은

웹 서버에서 장고 웹 애플리케이션을 돌려주는 방식

$ pip install gunicorn
$ pip freeze > requirements.txt

※ 로컬서버와 ec2의 환경을 맞춰줘야 한다.

# gunicorn 동작시키기
$ gunicorn --bind=0.0.0.0:8000 프로젝트명.wsgi &
#settings.py 가 있는 폴더명

# gunicorn 동작 확인
$ ps -ef | grep python

Nginx 설치 및 설정

$ sudo apt-get install nginx

# 서버 블록 파일 동기화(?)
$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
# default 대신 다른 이름으로 새로운 파일을 설정해도 상관 없습니다.

$ cd /etc/nginx/sites-available
$ sudo vi default 로 해당 파일로 들어간 후 
server {
	location / {
		include proxy_params;
        proxy_pass http://unix:/tmp/gunicorn.sock;
	}
}

Https 설정

AWS Route53 에서 도메인 구입 및 서버와 연결

certificate Manager에서 Https 설정을 위한 SSL 인증서 받기

메일 인증으로 인증서 검토 완료 후 로드밸런서와 ec2 연결

요청 -> 로드밸런서 -> ec2
위의 과정을 거치기 때문에 도메인 설정에서는 ec2 퍼블릭 ip 가 아닌 로드밸런서의 DNS 이름을 넣어야 합니다.

※ 단, 레코드 유형은 cname으로 해야 합니다.
또한 로드밸런서 설정 시 서브넷과 보안그룹 설정을 잘못하면 503 에러가 발생할 수 있기 때문에 주의 해야 합니다. 참고로 저는 리스너 -> 규칙보기 -> target 그룹을 설정해주지 않아 503에러가 났고 한동안 삽질을 했었습니다..

http로 요청이 들어올 때 https로 리다이렉트 설정은 aws 로드밸런서나
sudo vi /etc/nginx/sites-enable/default 에서 아래와 같이 입력 후 저장하면 적용됩니다.
-> server{
if (http_x_forwarded_proto = 'http') { return 301 https://도메인 주소request_uri;
}
}

⚠️ 모든 nginx 설정을 변경하고 해당 변경사항을 적용하려면

$ sudo nginx -t 로 syntax 테스트 후 에러가 없다면
$ sudo systemctl restart nginx로 nginx 재구동

Gunicorn & Nginx 연동 작업

sudo vi /etc/systemd/system/gunicorn.service 

위의 파일 생성 후 아래와 같이 입력

[unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/프로젝트디렉토리 경로
ExecStart= $ which gunicorn 으로 얻은 경로 \
		--workers 3 \
        --bind unix:/tmp/gunicorn.sock \
        config.wsgi:application
[Install]
WantedBy=multi-user.target

위의 파일을 저장한 후

$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

# 상태 확인
$ sudo systemctl status gunicorn

# 서비스를 새로 등록하거나 수정할 경우 데몬을 리로드 해주어야 합니다. 아래의 과정을 거치면 됩니다.
$ sudo systemctl stop gunicorn
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo systemctl enable gunicorn
$ sudo systemctl status gunicorn
profile
같이 일하고 싶은 개발자 되기

0개의 댓글