슈코딩
[AWS] Django 프로젝트 배포 feat. Gunicorn, Nginx 본문
AWS 페이지 인스턴스 시작
1. 상단 콘솔에 EC2 입력 후 EC2 페이지에 접속
2. 인스턴스 선택
3. 인스턴스 시작 후 운영체제 Ubuntu LTS 버전 및 스펙 t2.micro (프리티어 무료버전) 선택
4. 검토 단계 보안그룹 편집( 인바운드 규칙 수정 ) 및 시작
5. 새로운 키페어 생성
6. 인스턴스 확인 및 연결
인스턴스 연결은 블로그 참조
https://kyumin1020.tistory.com/44?category=1030319
주의할점 [참고] 튜터님 강의자료
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가 아닐시 서버연결 불가능)
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의 권한에 대한 이해도가 있어야해서 이부분에 관한건
나중에 공부를 해야 될것같다.
'개발일지 > Issues' 카테고리의 다른 글
[Django] HTTP error code 401, 403, 404, 405, 415, 500 (0) | 2022.07.25 |
---|---|
[SQL] json 파일 MySQL DB에 저장하기 feat.Django (1) | 2022.06.16 |
[MySQL] 장고 프로젝트 DB연결 (0) | 2022.06.10 |
[정규 표현식] 회원가입 기능 (0) | 2022.05.25 |
[Git hub] The requested URL returned error: 403 (0) | 2022.05.23 |