Today I Learned
EC2 배포
sudo apt update
sudo apt upgrade
git clone 깃허브주소(퍼블릭)
cd 루트폴더
sudo apt install python3-pip python3-dev python3-venv
python3 -m venv venv
source venv/bin/activate (tap 사용)
pip install -r requirements.txt
여기서 python manage.py runserver 하기전에
gitignore 때문에 깃허브에 업로드 되지 않은
.env파일을 생성해줘야하는데
1번 방법은 vim을 이용해서 파일을 생성한 다음, 복사/붙여넣기를 하는 것이고,
2번 방법은 scp를 이용해서 로컬에서 원격지로 파일전송을 하는 것이다.
=> 파일 안의 내용이 길어질수록 2번의 방법이 효율적!
그래서 scp를 사용해서 파일을 전송하기로 했다.
scp를 사용하려면 EC2 인스턴스를 생성할 때
key pair를 사용해야 한다.
$ scp -i C:/Users/user/Downloads/newkeypair.pem .env ubuntu@52.78.239.141:/home/ubuntu/recipe_soup
$ scp [키 경로] [.env파일(또는 전송할 파일)] [원격지ID]@[원격지IP]:[보낼 경로]
명령어를 입력했을 때
.env 100% 404 35.6KB/s 00:00
위와 같이 뜬다면 전송 성공한 것!
ubuntu에서 ls를 눌러도앞에 .이 붙은 파일이라면 안보일 수가 있음
ls -a와 같이 ls 뒤에 '-a'를 붙여주면 숨겨진 파일또한 볼 수 있음
다음은 EC2에 올려진 settings.py의
ALLOWED_HOSTS를 설정 해주면 된다.
cd 루트 파일 -> vim settings.py
ALLOWED_HOSTS = [ ' 원격지 IP ' ]
(save후 나가기 esc - :wq)
migrate 후 runserver 0.0.0.0:8000
브라우저에서 확인 할 때도 원격지 IP:8000과 같이 입력해주면
django 연결 첫 화면이 보인당
====================
gunicorn 설정하기
gunicorn을 사용하는 이유?
- WSGI : 파이썬 웹 어플리케이션이 웹 서버와 통신하기 위한 인터페이스
구니콘은 파이썬의 WSGI로 웹 서버(Nginx)로 부터 서버 사이드의 요청을 받으면 WSGI를 통해서 Django로 전달해준다.
Nginx를 사용하는 이유?
- 로드밸런서, reverse proxy server 등의 역할을 수행하기 위해
Nginx와 Gunicorn을 함께 사용해서 서버를 배포하였을 때,
요청과 응답 처리과정은 어떤 흐름일까?
1. 클라이언트가 웹 서버에 HTTP요청을 보냄
2. Nginx서버는 클라이언트로부터 요청을 받음. 프론트엔드 서버로서 동작하는 Nginx는 설정에 따라 정적파일인지 동적 요청인지 판단한다.
3. 정적 파일인 경우에 Nginx는 파일을 직접 반환하고, 동적 요청인 경우에는 Gunicorn으로 요청을 전달
4. Nginx는 Gunicorn과 연결된 역방향 프록시로 동작한다.
5. Gunicorn은 웹 어플리케이션 서버로 동작, Nginx로부터 받은 요청을 처리 : 요청 병렬 처리, 응답 생성
6. Gunicorn이 웹 앱 코드를 실행하여 필요한 로직등을 처리하고 HTML, JSON등을 생성
7. 응답을 Nginx로 전달 -> Nginx가 클라이언트로 반환
8. 클라이언트는 받은 HTTP응답을 처리, 웹 브라우저에게 콘텐츠 표시
nginx 설정하기
colletic static 까지 완료 한 다음
git pull origin main 해주면 된다.
python manage.py loaddata 로 json파일의 더미데이터 로드 해주고 DB설정이나 세팅들 바꿔주면 됨 !
마이그레이션 오류가 나서 애를 먹었다..
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'.
=> 마이그레이션 히스토리에서 충돌이 발생함..
이미 마이그레이션된 DB테이블과 충돌이 발생한 것
DB설정이 따로 되지 않은 상태의 Django는 sqlite3이고 우리는 MySQL을 연동하였기 때문에 충돌이 발생했다.
시도 : 각 앱의 migrations의 모든 pycache와 initial.py들을 삭제했다. (실패 !)
=> DB세팅을 여러가지로 바꿔보았음 (다 실패)
해결 : 기존 RDS를 삭제하고 새로운 RDS로 연결해서 해결
runserver로 에러 확인하고,
restart gunicorn으로 업데이트 항목들 반영
'내일배움캠프 > 내일배움캠프 TIL' 카테고리의 다른 글
내일배움캠프 TIL 60일차 - poetry (0) | 2023.06.05 |
---|---|
내일배움캠프 TIL 59일차 (0) | 2023.06.01 |
내일배움캠프 TIL 57일차 - curl과 OPTIONS? (0) | 2023.05.30 |
내일배움캠프 TIL 56일차 - 머신러닝 프로젝트 KDT 회고록 (1) | 2023.05.29 |
내일배움캠프 TIL 55일차 - 배포에서 RDS(MySQL)사용하기 (0) | 2023.05.29 |