슈코딩

[AWS] Django 프로젝트 배포 feat. Gunicorn, Nginx 본문

개발일지/Issues

[AWS] Django 프로젝트 배포 feat. Gunicorn, Nginx

Roshu 2022. 6. 13. 22:45

AWS 페이지 인스턴스 시작

1. 상단 콘솔에 EC2 입력 후 EC2 페이지에 접속

2. 인스턴스 선택 

3. 인스턴스 시작 후 운영체제 Ubuntu LTS 버전 및 스펙 t2.micro (프리티어 무료버전) 선택

 

4. 검토 단계 보안그룹 편집( 인바운드 규칙 수정 ) 및 시작 

보안그룹 편집 후 모습

 

5. 새로운 키페어 생성 

6. 인스턴스 확인 및 연결

생성된 인스턴스 모습
cmd로 생성한 인스턴스에 연결한 모습

인스턴스 연결은 블로그 참조 

https://kyumin1020.tistory.com/44?category=1030319

 

[AWS] Windows cmd, powershell로 인스턴스 연결하기

이번에 장고로 만든 추천시스템 프로젝트를 배포하면서 웹에서 CLI 환경으로 접속해서 배포를 했었는데, 웹에서 하면 불편한점이 여러가지 있었다. 일단 nginx의 default 파일을 수정을 하는데, 방

kyumin1020.tistory.com

 

주의할점 [참고] 튜터님 강의자료

 

 

CLI 환경 배포 작업 

 

1. 가상환경 세팅 miniconda 설치 순서대로 진행

미니콘다 다운로드: wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
미니콘다 설치: bash Miniconda3-latest-Linux-x86_64.sh
가상환경 실행: source ~/.bashrc 
가상환경 생성: conda create -n django python=3.8
생성한 가상환경 접속 : conda activate django
(base) . (django) 가 뜨면 잘된것

 

2. 필요한 패키지 설치

설치목록 확인: pip list

설치: pip install 패키지이름(django)

 

3. Django 프로젝트 git clone

깃클론 : git clone https://github.com/깃허브이름/레파지토리이름.git 

 

WSGI

WSGI(Web Server Gateway Interface) Callable Object 라는 녀석을 통해 Web Server 가 요청에 대한 정보를 Application 에 전달한다.

Callable Object 는 Function 이나 Object 의 형태가 될 수 있으며, Web Server 는 Callable Object 를 통해 2가지 정보를 전해주어야 한다.

  • HTTP Request 에 대한 정보(Method, URL, Data, ...)
  • Callback 함수

WSGI Middleware

Web Service 를 개발하다 보면 공통적으로 필요한 기능들이 있는데, Authentication, Routing, Session, Cookie, Error Page 보여주기, ... 와 같은 기능들이다.

WSGI Middleware 는 Middleware 라는 이름처럼 Web Application 의 실행 전과 후에 이러한 기능들을 추가해주며, 그 자체로도 WSGI Application 이다.

Design Pattern 의 Decorator Pattern 을 생각하면 이해가 쉽다. 양파 껍질 처럼 Web Application 을 감싸고 있는 구조이다.

  • uWSGI, Gunicorn, Werkzeug 과 같은 라이브러리들이 WSGI Middleware의 기능을 가진 라이브러리이다.

 

4. Gunicorn 및 패키지 설치 

프로젝트에 사용된 패키지와 gunicorn을 설치한다.

설치 : pip install gunicorn, sklearn, pandas, mysqlclient

 

#mysqlclient pip 로 설치 에러 

OSerror가 발생시 해결방법

Python3 과 MySQL development 헤더와 라이브러리를 설치해야 한다.

-> sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

 

 

5. local settings.py ( my_settings.py ) 업로드 with FileZilla

사용자 ubuntu 주의 (ubuntu가 아닐시 서버연결 불가능)

 

my_settings.py 업로드

 

6. gunicorn 작동확인을 위해 실행 

실행 : gunicorn --bind 0:8000 TenTaku.wsgi:application

nohup 실행 : nohup gunicorn --bind 0:8000 TenTaku.wsgi:application &

 

정적파일을 제외한 동적파일들이 서빙되는지 확인 할 수 있다.

 

 

Nginx

정적 요청을 처리해줄 수 있는 서버 

대표적인 웹 서버 프로덕트 : 아파치 톰캣, Nginx 등이 있다.

 

7. Nginx 설치 

업데이트: sudo apt update

apt 패키지 리스트가 업데이트 되어있지 않아서 최신 버전을 못가져올 수 있음.

설치: sudo apt install nginx

 

8. Nginx 설정 

nginx의 설정은 하단 경로내 'default'에 위치하고 있다. 

파일이동: cd /etc/nginx/sites-available/

default 파일 수정: sudo vi default

저장후 나가기:   :wq

 

default파일내 'server' 블록을 수정한다.

server {
        listen 80 default_server; 
        listen [::]:80 default_server; // 80번 포트로 외부 접속을 받겠다는 의미!

        server_name 3.34.124.209; // AWS EC2 퍼블릭 IP

        location /static {
                alias /home/ubuntu/10Taku/static;
        } // 정적 요청 처리 (static 폴더)

        location / {
        proxy_pass http://0:8000;
        } // 동적 요청 처리 (Gunicorn)
}

문법 오류 여부 확인: sudo nginx -t 
재실행: sudo service nginx restart 

설정을 한뒤엔 재실행을 해줘야 한다.
상태 확인: sudo service nginx status

 

서버 종료 

 

PID 확인 :  netstat -tnlp

서버 종료 : sudo kill -9 4987

 

 

 

# 에러 사항 Nginx 

이렇게 위에 한것처럼 하였는데, static 파일경로에 대한 권한문제가 발생하였다.

엔진엑스 로그확인하는 코드
경로 이동: cd /var/log/nginx 
로그확인 실행: tail -f *

 

해결방법: 

#1권한을 주는 코드를 사용해봤지만 그럼에도 먹히질 않음.
권한부여: chmod 777 ./* -R

 

#2static파일 엑세스권한이 없어서 파일을 Nginx가 엑세스가능한 파일로 복사

경로이동: cd /var

파일이동: cd www

파일복사: sudo cp -R /home/ubuntu/10Taku/static ./

 

이후에 Nginx alias 경로 수정후 더블체크

더블체크: ls -l /var/www/static/

 

경로가 맞는걸 확인하고 문법검사 -> Nginx를 재실행 -> status도 확인한다.

그리고 서버를 다시실행하니 잘나오는 모습을 볼 수 있었다.

 

#원인

nginx의 권한으로 static 파일을 바라볼 권한이 없었다. <Permission denied>

그래서 nginx가 접근 할 수 있는 /var/www 경로로 static 파일을 이동해서 

nginx가 바라볼 수 있게 설정 해줘서 된것이다. nginx같은 설정을 할때 / 있고 없고 때문에 되다 안되다 하기

때문에 섬세하게 봐야한다. 또한 파일권한, 보안 설정 등 다 찾아봐야한다. 왠만한건 chmod 777 권한을 주면

되긴 하지만 안되는경우를 정확하게 알려면 linux의 권한에 대한 이해도가 있어야해서 이부분에 관한건 

나중에 공부를 해야 될것같다.

 

 

 

 

 

Comments