Django 타임리프 or 템플릿 사용 X, 정적 디렉토리(/static) 사용 X
DB: Mysql , Dbeaver 연동
서버는 AWS 로 배포하기 !!
https://velog.io/@kyj311/AWS-EC2-알아보기 를 그대로 따라하면 쉽게 생성 가능
인스턴스 상태가 실행중 으로 뜬다면 생성 성공!
1) 아래 밑줄 복사 하기
2) powershell 에서 ssh 접속
따옴표 안에는 키페어(.pem) 위치 넣기
3) ssh 접속 성공 !!
$ git clone “깃 저장소 주소”
이때 발생할 수 있는 에러
fatal: Authentication failed for '...'
원인
: 깃허브 로그인할때 사용하는 비밀번호가 아닌, 토큰 비밀번호를 입력해야함
해결 방법
: github 접속→ setting → Developer Setting → Personal access tokens → Tokens(classic) → generate new token( 토큰생성 ) -> 생성된 토큰을 비밀번호에 붙여넣기
$ cd "프로젝트 폴더"
$ python3.11 -m venv venv
$ source venv/bin/activate
가상환경을 생성할때, python3 이 아닌 3.11버전을 설치하는 이유는 Django 5버전을 사용하고 있기 때문 !!
python3으로 생성하면 Django 5버전이 설치되지 않으니 참고 !!
$ pip install -r requirements.txt
열심히 설치 되는 중...
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.
http://public Ip:8000/admin/
으로 접속접속 성공 !
일반적인 admin 페이지와 ui가 다른 이유
난 프로젝트에서 정적파일을 사용하지 않기 때문에 Nginx설정에서 static과 media 경로를 지정하지 않았기 때문에 Django에서 기본적으로 제공되는 ui가 제공되지 않는 것
⇒ 아래 Nginx 를 설정할때 이해될 것
하지만 내 프론트는 따로있고, 모든 파일은 파이어베이스 Storage와 연동되기 때문에 상관없다 !
이제 접속에 성공했으니 거의 다 배포한 거 같네요 ㅜㅜ
https://velog.io/@gyuls/Django-runserver는-왜-배포-때-쓰면-안될까
개발 환경에서 실행할때 쓰이는 manage.py runserver는 보안에 취약하며 '대량 요청' 이나 '동시 요청' 을 효율적으로 처리할 수 없어요.
이러한 이유로 Django 공식문서에서도 Product 환경에선 사용하지 말라고 당부하고 있네요 !
즉, Django 는 Web Server 가 아닌 Web Framework 이다.
Gunicorn을 사용하면, Python 어플리케이션을 빠르게 처리할 수 있으며, 멀티 쓰레드 를 만들 수 있기 때문에 ‘대량 요청’ 을 효율적으로 처리 할 수 있다.
Nginx는 웹 서버로서 Reverse Proxy 역할을 수행하며, 웹 어플리케이션 서버가 정상적으로 동작하지 않는 경우, Nginx가 에러를 처리하고 대체 페이지를 제공할 수 있다.
⇒ Nginx의 엄청난 장점이라고 생각합니다
DDoS 공격과 같은 보안 문제에 대처 가능하다.
Gunicorn은 Django 애플리케이션을 처리하고, 이를 외부로 노출시키기 위해 Nginx와 같은 웹 서버가 사용되며, Nginx는 정적 파일 서빙, 리버스 프록시, 보안 기능 등을 담당한다.
나 같은 경우는 1,2번 영상을 주로 참고했으며, 3번도 간단히 참고하기 좋은 영상이다.
https://www.youtube.com/watch?v=abyETft3o78&list=PLOemN3LiCpznbiEeM_XH9Lfzi6TM4cm_9&index=7
https://www.youtube.com/watch?v=700HQS7pBpY&list=PLOemN3LiCpznbiEeM_XH9Lfzi6TM4cm_9&index=8
https://www.youtube.com/watch?v=nGoA1R1_pR0&t=666s
[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
$ sudo tail -f /var/log/nginx/error.log
를 통해 에러 로그를 확인 할 수 있다.
왜냐면 <장고 프로젝트 이름>.sock 가 gunicorn실행 시킬 땐 문제가 없어보이는데
Gunicorn이 Django 애플리케이션을 서빙하고 있고, Nginx가 이를 프록시로 사용하고자 할 때
Gunicorn 소켓 경로가 올바르지 않거나 Gunicorn 소켓 파일이 없으면 위의 에러가 발생하기 때문에
결론: 처음부터 Gunicorn 소켓 파일을 정확히 잘 만들어야한다 …..
$ sudo systemctl status gunicorn
$ sudo systemctl status nginx