코딩공부/Server

[CI/CD] Django Jenkins 자동 배포하기 - ngnix, gunicorn으로 Django 서버 기동하기 (5)

integerJI 2022. 5. 27. 13:25

본 게시글은 Django 및 Aws Ec2의 기초 지식을 알고 있는 전재 하에 처음부터 빠르게 진행됩니다.

 

해당 프로젝트를 통하여 Docker를 이용해 Jenkins 서버를 구축, Django 프로젝트를 Github와 Webhock으로 연결하여 자동 빌드하는 CI/CD 만들기가 목표입니다!


nginx를 통해 요청을 받으면 "nginx 데이터 요청 -> django server가 nginx에게 데이터 처리 및 반환 -> 사용자에게 노출" 이 처리를 연동하기 위해 gunicorn이 사용되고 django 프로세스를 계속해서 모니터링 및 관리를 해줍니다. 


[CI/CD] Django Jenkins 자동 배포하기 - Django 프로젝트 생성 (1) : https://integer-ji.tistory.com/379
[CI/CD] Django Jenkins 자동 배포하기 - Ec2 Ubuntu 22.04 설치 (2) : https://integer-ji.tistory.com/380
[CI/CD] Django Jenkins 자동 배포하기 - Ec2 모바엑스텀 접속하기 (3) : https://integer-ji.tistory.com/381

[CI/CD] Django Jenkins 자동 배포하기 - Aws Ec2 Django 프로젝트 배포하기 (4) : https://integer-ji.tistory.com/383

 

Django 기초 시작 : https://integer-ji.tistory.com/81

Aws Ec2 프로젝트 배포 기초 시작 : https://integer-ji.tistory.com/300

모바엑스텀(MobaXterm) 설치하기 : https://integer-ji.tistory.com/374

 

개발 환경 : Window10

개발 언어 : Python - 설치 : https://integer-ji.tistory.com/64

개발 툴 : VS Code  - 설치 : https://integer-ji.tistory.com/65

개발 Terminal : Git Bash - 설치 : https://integer-ji.tistory.com/66


1. gunicorn 설치

pip install gunicorn

 

가상환경을 실행해준 뒤 gunicorn을 설치하여 줍니다.

 

 

2. nginx 설정

cd /etc/nginx/sites-available/

sudo vi awsProject.com

 

nginx 설정 파일을 만들기 위해 sites-available 폴더로 이동합니다. 

 

이동 후 관리자 명령어 sudo를 통하여 awsProject.com 설정 파일을 만들어 줍니다. 

(*.com 파일의 이름은 상관 없지만 프로젝트의 이름으로 해야 안헷갈립니다.

 

 

server {
	listen 80;
	server_name 13.124.123.225; // Aws Ec2의 퍼블릭 IPv4 주소
	
	location = /favicon.ico { access_log off; log_not_found off; }

	/*########### static 폴더, media 폴더를 명시합니다.
    저는 이번 강의 시간에는 필요가 없어 적지 않았습니다.
	location /static {
		alias /home/ubuntu/프로젝트명/static;
	}

	location /media {
		alias /home/ubuntu/프로젝트명/media;
	}
	##################*/

	location / {
		include proxy_params;
		proxy_pass http://127.0.0.1:8000;
	}
}

 

해당 스크립트는 80번 포트에서 nginx인 web server가 동작하게 ip 주소를 명시하여 줍니다. 

 

/favicon.ico으로 끝나는 url은 log에 기록하지 않으며 

 

이번 프로젝트를 반영 하며 필요는 없는 static, media 파일들은 따로 수집을 하지 않았습니다. 

 

해당 부분은 빼주시고 넣어주시면 될 것 같아요

 

마지막으로 request는 현재 server 내부에서 동작하는 8000번 포트로 django server 서버를 실행 시켜줄 수 있게 gunicorn으로 전달하는 설정입니다.

 

 

2-1. 링크 설정

cd ../sites-enabled/

sudo rm -rf default

sudo ln -s /etc/nginx/sites-available/awsProject.com default

ll 명령어 (ls -al 단축어)를 입력 하면 default라는 파일은 파일이 아닌 symbolic link 입니다.

 

지금은 default를 실행 하면 /etc/nginx/sites-available/default그 작동이 되지만

 

이것을 지우고 방금 만든 awsProject.com을 실행하게 바꿔줍니다. 

 

추가로 빨간색으로 나온다면 올바르지 않는 명령어 이니 확인 후 다시 입력해 주세요.

 

 

 

2-2. nginx 재시작

# ngnix 시작
sudo service nginx start

# ngnix 재시작
sudo service nginx restart

# ngnix 정지
sudo service nginx stop

# ngnix 상태 확인
sudo service nginx status

nginx의 symbolic link를 수정 하였으니 nginx를 재시작 해주어여 합니다. 

 

status 확인 후 restart를 해줍니다.

 

 

3. gunicorn 시작 백그라운드로 시작

현재는 runserver라는 명령어를 통하여 django server을 실행 하였지만 그렇게 실행할 경우 터미널을 종료하는 순간 django server도 꺼지게 됩니다.

 

따라서 gunicorn을 사용하여 django server을 백그라운드로 실행을 시키고 nginx의 web server와 django server을 통실할 수 있게 만들어 줄겁니다. 

 

 

# django server 백그라운드 실행
gunicorn awsProject.wsgi --bind 0:8000 --daemon

# django server 소스 변경 시 자동 reload
gunicorn awsProject.wsgi --bind 0:8000 --daemon --reload

저는 daemon 명령어를 추가하여 백그라운드에서만 실행되게 하였습니다. 

 

이제 퍼블릭 ip에 접속하여 보면

 

 

4. 포트번호 없이 항시 기동

gunicorn을 통해 nginx web server와 django server가 통신하여 django 페이지를 노출 시켜 줍니다.

 

 

5. gunicorn 서버 끄는 방법

ps -ef | grep gunicorn

kill -9 pidnum

gunicorn 실행 프로세스 번호를 확인한 뒤 kill을 해주면 됩니다!