Django AWS 배포과정(React-Django)_완료

쳔서·2023년 12월 31일
0

Django 타임리프 or 템플릿 사용 X, 정적 디렉토리(/static) 사용 X
DB: Mysql , Dbeaver 연동


Frontend 인 React 는 이미 netlify에 배포해놓은 상황..

서버는 AWS 로 배포하기 !!



1. AWS EC2에서 인스턴스 생성

https://velog.io/@kyj311/AWS-EC2-알아보기 를 그대로 따라하면 쉽게 생성 가능

인스턴스 상태가 실행중 으로 뜬다면 생성 성공!


위의 사이트에 이어서 . . .


2. 인스턴스 연결- SSH 클라이언트

1) 아래 밑줄 복사 하기

2) powershell 에서 ssh 접속
따옴표 안에는 키페어(.pem) 위치 넣기

3) ssh 접속 성공 !!



3. Git에서 Django 프로젝트 가져오기

$ git clone “깃 저장소 주소”

이때 발생할 수 있는 에러

fatal: Authentication failed for '...'

  • 원인
    : 깃허브 로그인할때 사용하는 비밀번호가 아닌, 토큰 비밀번호를 입력해야함

  • 해결 방법
    : github 접속→ setting → Developer Setting → Personal access tokens → Tokens(classic) → generate new token( 토큰생성 ) -> 생성된 토큰을 비밀번호에 붙여넣기



4. venv 생성 및 활성화

$ cd "프로젝트 폴더"

$ python3.11 -m venv venv

$ source venv/bin/activate

가상환경을 생성할때, python3 이 아닌 3.11버전을 설치하는 이유는 Django 5버전을 사용하고 있기 때문 !!

python3으로 생성하면 Django 5버전이 설치되지 않으니 참고 !!


5. requirements.txt 에 있는 의존성 모두 설치

$ pip install -r requirements.txt


열심히 설치 되는 중...




1. Mysql 연동- RDS 생성

RDS 생성 부분은 https://ziszini.tistory.com/137 를 참고하여 그대로 따라하면 된다.

사이트에선 Mysql workbencher를 사용하지만 나는 Dbeaver를 사용한다.

이때, 퍼블릭 엑세스는 “예” 로 선택하기 !!


생성 완료 !!



개발이 완료된 프로젝트를 배포하는 것이기때문에 dbeaver에서 사용하던 원래 테이블과 데이터들을 새로 만든 AWS RDS 데이터베이스에 모두 옮겨주었다.


간단히 한번에 옮기는 방법!!

1) cmd 에서 실행

$ mysqldump -u [USERNAME] -p [PASSWORD] [DB_NAME] > dump.sql

이때 db_name은 복사하려는 db 이름

2) c드라이브의 사용자이름 디렉토리에서 dump.sql 메모장으로 열기
3) 모두 복사→ dbeaver sql에 모두 붙여놓고 한번에 실행





서버 실행 시키기

$ python manage.py runserver 0.0.0.0:8000


  • https://public ip:8000/admin/ 했더니 에러 발생

    You're accessing the development server over HTTPS, but it only supports HTTP.

  • 원인
    : SSL 인증서를 발급 받지 않았기때문에 https가 지원되지 않는다는 뜻.

  • 해결 방법
    : https 를 http로 바꾸어 http://public Ip:8000/admin/ 으로 접속

접속 성공 !



일반적인 admin 페이지와 ui가 다른 이유

난 프로젝트에서 정적파일을 사용하지 않기 때문에 Nginx설정에서 static과 media 경로를 지정하지 않았기 때문에 Django에서 기본적으로 제공되는 ui가 제공되지 않는 것

⇒ 아래 Nginx 를 설정할때 이해될 것

하지만 내 프론트는 따로있고, 모든 파일은 파이어베이스 Storage와 연동되기 때문에 상관없다 !



이제 접속에 성공했으니 거의 다 배포한 거 같네요 ㅜㅜ



마지막으로, 서버를 실행 시킬 때 보안 및 성능 이슈가 있는 runserver 대신 Gunicorn + Nginx를 이용하여 배포를 완료시키면 끝!!

Gunicorn , Nginx 란?

https://jay-ji.tistory.com/66

https://velog.io/@gyuls/Django-runserver는-왜-배포-때-쓰면-안될까

개발 환경에서 실행할때 쓰이는 manage.py runserver는 보안에 취약하며 '대량 요청' 이나 '동시 요청' 을 효율적으로 처리할 수 없어요.


이러한 이유로 Django 공식문서에서도 Product 환경에선 사용하지 말라고 당부하고 있네요 !

즉, Django 는 Web Server 가 아닌 Web Framework 이다.

- Gunicorn 을 사용하는 이유

Gunicorn을 사용하면, Python 어플리케이션을 빠르게 처리할 수 있으며, 멀티 쓰레드 를 만들 수 있기 때문에 ‘대량 요청’ 을 효율적으로 처리 할 수 있다.

- Nginx 를 사용하는 이유

  1. Nginx는 웹 서버로서 Reverse Proxy 역할을 수행하며, 웹 어플리케이션 서버가 정상적으로 동작하지 않는 경우, Nginx가 에러를 처리하고 대체 페이지를 제공할 수 있다.

    ⇒ Nginx의 엄청난 장점이라고 생각합니다

  2. DDoS 공격과 같은 보안 문제에 대처 가능하다.



Gunicorn은 Django 애플리케이션을 처리하고, 이를 외부로 노출시키기 위해 Nginx와 같은 웹 서버가 사용되며, Nginx는 정적 파일 서빙, 리버스 프록시, 보안 기능 등을 담당한다.




Gunicorn & Nginx 설정


나 같은 경우는 1,2번 영상을 주로 참고했으며, 3번도 간단히 참고하기 좋은 영상이다.

1. Gunicorn 설정하기

https://www.youtube.com/watch?v=abyETft3o78&list=PLOemN3LiCpznbiEeM_XH9Lfzi6TM4cm_9&index=7

2. Nginx 설정하기

https://www.youtube.com/watch?v=700HQS7pBpY&list=PLOemN3LiCpznbiEeM_XH9Lfzi6TM4cm_9&index=8

3. gunicorn & naginx 설정하기

https://www.youtube.com/watch?v=nGoA1R1_pR0&t=666s



Gunicorn 에러

[crit] 151651#151651: *2 connect() to unix:/home/ubuntu/awsTest/backend.sock failed (2: No such file or directory) while connecting to upstream

  • 원인
    : backend.sock 파일이 없거나 잘못된 경로인 것

  • 해결 방법
    : 나같은 경우는 파일이 생성되지 않아서 생긴 에러임으로, /etc/systemd/system/gunicorn.service 파일의 ExecStart 라인을 찾아서, --bind 옵션을 사용하여 UNIX 소켓 파일을 정의한다.

    예) -bind unix:/path/to/your/project/<장고 프로젝트 이름>.sock




마지막으로,
$ sudo systemctl restart gunicorn
//재시작하기

<장고 프로젝트이름>.sock 파일이 생겼는지 확인한다.

$ ls

위의 에러는 Gunicorn와 Nginx 를 실행시킬때 발생한 에러로,
$ sudo tail -f /var/log/nginx/error.log

를 통해 에러 로그를 확인 할 수 있다.



저 에러를 처음부터 잘 봤으면 시간을 덜 소비했을텐데 … ㅜㅜ


왜냐면 <장고 프로젝트 이름>.sock 가 gunicorn실행 시킬 땐 문제가 없어보이는데

Gunicorn이 Django 애플리케이션을 서빙하고 있고, Nginx가 이를 프록시로 사용하고자 할 때
Gunicorn 소켓 경로가 올바르지 않거나 Gunicorn 소켓 파일이 없으면 위의 에러가 발생하기 때문에




결론: 처음부터 Gunicorn 소켓 파일을 정확히 잘 만들어야한다 …..




Gunicorn & Nginx 상태 확인


$ sudo systemctl status gunicorn

$ sudo systemctl status nginx

아래와 같이 Active가 모두 runnig으로 뜨면 성공 !!




이제 배포가 완료되었고, 서버가 잘 동작하는지 테스트 해볼 것이다.



성공 ㅜㅜ

0개의 댓글