Web Server <-> WSGI <-> Web Application
Nginx <-> Gunicorn <-> Django
장고는 웹서버가 아니라 Web Application. 장고만 써서 배포하면 20명만 들어와도 터짐.
그래서 Web server를 써야하는데, 장고에서는 Nginx를 사용하는게 보편적.
그리고 Nginx와 Django를 이어주는 매개체인 WSGI는 Gunicorn을 주로 사용함
*Web Application
*WSGI(Web Server Gateway Interface)
*Web Server
$ sudo apt-get update
$ sudo apt-get install gunicorn
설치 과정에서 나오는 설정들은 tab 엔터 해서 모두 OK로 설치
manage.py 가 있는 폴더에서 실행해줌
gunicorn --bind 0:8000 [pj폴더이름].wsgi:application
다시 웹브라우저로 들어가봐도 잘 동작함
그런데 /admin/ 으로 들어가보면?
정적 파일이 제공되고 있지 않기때문 ! → Nginx에서 처리 예정
settings.py에 설정
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "static"
로컬에 했으니 add commit push하고
EC2 가서
git pull
정적파일 한 곳에 모으기
python3 manage.py collectstatic
sudo apt install nginx -y
설치 과정에서 나오는 설정들은 tab 엔터 해서 모두 OK로 설치
cd /etc/nginx/sites-available
이 경로로 이동
sudo vi [설정파일 이름]
강의에선 설정파일 이름을 django로 했음
i 누르면 INSERT모드 되며 입력가능
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location /static {
alias /home/ubuntu/[레포지토리 이름]/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/gunicorn.sock;
}
}
붙여넣는데, 레포지토리 이름엔
자기 레포지토리의 이름 넣기
다 썼으면 esc
키 누르고 -> :wq 엔터
cd ~
해서 home 디렉토리로 돌아가기
레포지토리 이름 모르겠단 사람은 여기서 ls 누르면
요거이야기 하는거임
cd /etc/nginx/sites-enabled
이동
ls 해보면
default 나옴.
아까 파일 추가했던 available에서
실제로 사용할것을 enabled에 바로가기(link)로 넣어줘야함.
sudo ln -s /etc/nginx/sites-available/[설정파일 이름]
강의에선 django로 했으니까 django
default설정 안쓸거니까 지울거임
sudo rm default
ls 해보면 내가 추가한것만 나옴
설정이 올바른지 테스트
sudo nginx -t
이렇게 나오면 일단 문법상 오류는 없다는거
키기
sudo systemctl start nginx
잘 켜졌는지 확인
sudo systemctl status nginx
q 입력하면 나갈 수 있음
끄고싶으면
sudo systemctl stop nginx
킨 상태에서 재시작은
sudo systemctl restart nginx
다시 돌아가서 새로고침 해보면
빙글빙글 돌다가 타임아웃 에러 뜰거임
이유는 AWS에서 8000번은 뚫어줬지만, 80번은 안뚫어줬음
80번 뚫어줄거임
8000번 삭제하고
SSH는 남겨두기
규칙 추가하면 이렇게 생김
유형에서 HTTP선택하면
포트 범위에 자동으로 80 들어감
소스는 Anywhere-IPv4
규칙 저장
짠 이제 암것도 보이진 않지만 nginx연결된게 보임.
sudo vi /etc/nginx/nginx.conf
i 눌러서 INSERT모드로 바꾼 뒤
user를 ububtu로 바꿈
esc
누르고 :wq 엔터
restart
sudo systemctl restart nginx
잘 켜졌는지 확인
sudo systemctl status nginx
끌때는 q
기존엔 포트를 이용해 연결했었는데, 사실 유닉스계열 시스템에선 소켓을 이용하는게 효율적임.
지금은 shell 종료하면 Gunicorn도 종료되어 서비스가 되지 않음.
→ 계속해서 동작하도록 하고 AWS 서버를 재시작해도 동작해야한다!
→ 서비스(service)로 등록 필요!
cd /etc/systemd/system
이동해서
sudo vi gunicorn.service
파일 만들기
home/ubuntu/[레포지토리 이름]
usr/bin/gunicorn 그대로 쓰고
pj명 다르면 바꿔주깅
여기 이름임
INSERT모드 해서 복붙
esc
누르고 :wq
Gunicorn 재시작
sudo systemctl restart gunicorn
동작 상태 확인
sudo systemctl status gunicorn
잘 됨
q 눌러서 나가기
다시 가서 새로고침 하면 잘 나옴
포트번호 없이 잘 들어가짐
admin도 잘 들어가짐 (css 잘됨)
로컬에서 settings.py 디버그 False로 바꾸기
add commit push하고
빌린 서버로 돌아와서
cd ~
홈으로 가서
내 레포지토리와 같은 이름의 파일로 들어가기
그리고
git pull
설정 바꿨으니 gunicorn restart하고
(웹서버는 재시작 안해도 됨. 앞단이라)
sudo systemctl restart gunicorn
다시 돌아가서 새로고침 하면
디버그모드 꺼짐
url 바꿔주고 테스트
잘됨
AWS 껐다 키면 저 주소 바뀌니까 변수처리하면 편함
주황 동그라미 저장 안한거니까 저장해주고
변수명 쓰고 저장
이렇게 바뀜
환경 더 만들고
로컬환경 설정을 같은 변수명인 host로 설정하고 저장해주면
여기서 바꾸면서 편하게 쓸 수 있음
media 파일의 경우 보통 AWS의 S3에다 보관을 함
이거 하려면, S3와 Django 통신하는것도 찾아봐야함
요청 엄청 많이 들어오면 EC2 늘려야하는데,
Nginx, Gunicorn, django 설정 한번 했는데 귀찮잖아
그러니 Doker같은것도 건드려보는거 추천하고
지금 ip주소로 들어가고있는데 도메인 발급받아서 한번 해보기
AWS에서 어렵지않게 라우트53 이용하면 할 수 있음
https도 AWS에서 적용 할 수 있음
이런 기술들을 왜 쓰는지 아는게 중요함.
로컬에서 git push하고 EC2에서 pull하고 Nginx 재시작 하는거 귀찮잖음
github Action이라고 로컬에서 push하고 난 뒤의 액션을 자동화 설정할 수 있는 친구가 있음.
그 과정을 잘 설정하면, 로컬에서 push하자마자 EC2에 자동 업데이트됨(CI/CD)
프로젝트 여러개보단 프로젝트 하나를 오랫동안 하며 기능을 업데이트하는 모습을 보여주는게 좋음.