[Gunicorn] 프로젝트 배포 시 gunicorn WSGI 서버 사용하기

ifyouseeksoomi·2020년 9월 29일
1

Web, Server, Git, etc.

목록 보기
9/9
post-thumbnail

EC2 RDS Gunicorn 연동

세션(강의) 노트

EC2 인스턴스에 로컬로 작성한 프로젝트를 배포하는 준비 과정
(== 개인 PC에서 개발한 것과 마찬가지로 EC2 서버에 비슷한 개발환경을 설치하는 과정)

1. SSH 환경에 Miniconda 설치

  1. pem 파일이 있는 폴더로 이동 --> pem 파일을 이용하여 SSH로 EC2에 접속 (ssh -i [pem파일이름] [SSH서버주소] --> EC2 서버 접속 완료
  2. 이후 전체 플로우는: miniconda 설치, 패키지 업그레이드, 최소한의 패키지만 설치. 하나씩 환경설정할 것.
  3. miniconda 설치 스크립트 (각자의 OS에 맞는 것으로) 다운로드 우클릭 후 주소 복사 --> 터미널로 데려와서 wget [복사한주소] --> 이후 ls 시, 미니콘다 설치 완료 확인 가능 (ex. Miniconda3-latest-Linux-x86_64.sh)
  4. chmod +x [Miniconda3-latest-Linux-x86_64.sh]
  5. 이후 바로 ./Miniconda3-latest-Linux-x86_64.sh 실행 시켜서 미니콘다 설치
  6. 나오는 것에 다 yes
  7. 모두 설치한 후에는 source .bashrc 입력 --> 명령 라인 가장 앞에 (base)가 생김

2. APT get 명령어를 이용한 패키지 업데이트, 업그레이드 --> GCC 설치, mysql Client 설치

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc
sudo apt-get install libmysqlclient-dev

3. Conda를 이용하여 프로젝트를 위한 가상환경 설정

conda create -n [conda이름] python=3.8
conda activate [conda이름]
git clone [repo주소]
이후 ls 시, 잘 클론 되었음.

주의할 점은 이 때, 클론된 프로젝트 속의 requirements.txt를 가상환경에 모두 설치해줘야하는 것.
한 번에 requirements 내용 모두 설치하는 명령어는
pip install -r requirements.txt
이후 pip freeze로 패키지 모두 설치되었는지 확인

4. 내 프로젝트에 my_settings.py 작성 및 settings.py에 EC2 서버의 퍼블릭 아이피를 설정해준 후 서버 돌려보기

퍼블릭 아이피 확인: AWS EC2 접속 후, running중인 EC2 인스턴스 클릭 --> IPv4 퍼블릭 주소 확인 가능

복사하여, settings.py의 ALLOWED_HOSTS에 붙여넣기
(ex. ['*', 'IPv4서버주소', 'IPv4서버주소:8000']

프로젝트의 root directory에 my_settings.py 생성하여,
DATABASES, SECRET_KEY 설정
이 때 DATABASES에 들어가는 디테일은 RDS에 연동된 DB 디테일

(ex.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '--보안--',
        'USER': '--보안--',
        'PASSWORD': '--보안--',
        'HOST': '[SSH주소(RDS엔드포인트)]',
        'PORT': '3306',
    }
}
>
SECRET = {
    'secret': '--보안--',
}

[참고] 로컬환경에서의 RDS 접속 명령어
mysql -u root -h [RDS엔드포인트주소] -p 후 패스워드 입력

이후 python manage.py runserver로 서버 돌려 확인
(혹시 이 때 TimeZone setting error 시, 'Asia/Seoul' 잘 쓰여져 있는지 다시 한 번 확인)
python manage.py runserver 0:8000을 써야 퍼블릭 아이피 사용하는 것

이후 포스트맨으로 다시 한 번 확인
퍼블릭 아이피/[작성한 엔드포인트 주소] 호출하여 확인

여기까지만 해도 호출은 원활하게 이루어지지만,
장고에서의 기본 manage.py runserver 명령어는 단일 스레드로 동작
--> 개발 및 테스트로는 적당하지만, 리퀘스트가 많을 수 있는 운영환경에서는 적합 X

따라서, 멀티쓰레드를 지원하는 웹 애플리케이션 서버 프로그램인 구니콘을 설치하여 배포하는 것이 좋다

5. 구니콘 설치

구니콘 역시 설치 방법은 pip install gunicorn
구니콘 설치 이후에도 SSH 세션이 끊어져도 서버를 동작시켜주기 위해 nohup이라는 툴을 써서, 구니콘을 백그라운드로 동작시켜주도록 한다.

gunicorn --bind=0.0.0.0:8000 [프로젝트명].wsgi 명령어는 백그라운드로 돌리지 않고 그냥 돌리는 것
nohup gunicorn --bind=0.0.0.0:8000 [프로젝트명].wsgi & 명령어는
장고의 웹 애플리케이션을 지정해주는 역할을 하는 wsgi를 다시 적어 백그라운드로 돌리는 명령어
(&는 백그라운드로 동작하는 명령)

ps ef | grep python 이 ps 명령어는 구니콘이 잘 실행되는지, PID는 몇인지 알 수 있게 해주는 명령어
이후에는 포스트맨으로 다시 한 번 호출하여 호출이 잘 되는지 확인 필수

주의점!
gunicorn을 계속 띄워 두지 말고
포스트맨으로 확인이 모두 끝난 후에는 kill [확인한PID번호]로 구니콘을 종료하도록 한다.

이후 nohup gunicorn --bind=0.0.0.0:8000 [프로젝트명].wsgi 명령어 입력 시,
구니콘이 정상종료된 것을 확인할 수 있다.

profile
묻고 더블로 가는 중인 백엔드 개발자입니다.

1개의 댓글

comment-user-thumbnail
약 1시간 전

머리에 구니콘이 쏙쏙! 들어옵니다!

답글 달기