Django

[Django] AWS 배포 → Gunicorn, Nginx 설치 및 설정

monster route 2024. 9. 8. 21:03

 

Django, AWS 배포 (Deploy) 이어서...

 

 

gunicorn 설치 및 설정하기

 

 

 

설치과정에서 나오는 설정들은 tab해서 모두 OK로 설치하면 된다.

$ sudo apt-get update
$ sudo apt-get install gunicorn

 

 

Gunicorn 실행

 

manage.py가 있는 프로젝트 폴더에서 실행해준다.

gunicorn --bind 0:8000 api_pjt.wsgi:application

다시 웹브라우저로 들어가봐도 잘 동작하는 것을 볼 수 있다.

 

 

 

그런데 /admin/ 으로 들어가면?

정적 파일이 제공되지 않고 있지 않기 때문이다 → Nginx에서 처리 예정

 

정적 파일 다루기

 

정적파일 설정 및 한 곳으로 모으기

 

settings.py에 static 파일들이 위치할 경로와 url을 지정해준다.

# settings.py
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "static"

 

 

  • 코드변경 → commit → puth 이후 EC2에서 pull !
  • 정적파일 한 곳에 모으기
python3 manage.py collectstatic

 


 

Nginx 설치 및 설정하기

 

sudo apt install nginx -y

중간에 멈추어서 물어보는 구간에서는 엔터를 이용해서 모두 넘겨주며 설치

 

 

/etc/nginx/stites-available 이동해서 설정을 등록해준다.

cd /etc/nginx/sites-available

 

 

내 설정 파일 생성

sudo vi django
server {
        listen 80;
        server_name *.compute.amazonaws.com;
        charset utf-8;
		    client_max_body_size 128M;

        location /static {
                alias /home/ubuntu/edu-django-test/static;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/tmp/gunicorn.sock;
        }
}

esc → :wq 입력 후 Enter로 빠져나오기

 

📕 listen 80
·  80 포트로 들어오면 웹 서버를 만날 수 있음
·  HTTP의 기본 포트는 80 포트 (www.aidenlim.dev:80 == www.aidenlim.dev)

 

 

설정 파일 적용 하기

  • 작성한 django 설정 파일을 Nginx에게 등록해주는 과정이 필요
  • sites-available 에 설정 목록을 만들어두고 sites-enabled 에서 실제로 적용하는 구조
cd /etc/nginx/sites-enabled
sudo rm default # 기본 설정 삭제
sudo ln -s /etc/nginx/sites-available/django

sudo nginx -t # 설정이 올바른지 테스트

 

 

nignx 유저 정보 바꿔주기

sudo vi /etc/nginx/nginx.conf

i 입력해 INSERT 모드 들어가 바꿔주고 esc 나온후 :wq 이용해 반영

 

 

Nginx 실행

sudo systemctl start nginx

Nginx 실행

sudo systemctl stop nginx

Nginx 중지

sudo systemctl restart nginx

Nginx 재시작

 

 

80 포트 열어주기

 

 

 

이제 포트번호 없이 내 ip 주소로 바로 들어가면 Nginx 설정을 만날 수 있다!


 

Gunicorn 서비스 설정 및 실행

 

이전에는 아래의 명령어를 이용해서 Gunicorn을 실행했다.

gunicorn --bind 0:8000 api_pjt.wsgi:application

 

·  이 방식은 포트를 이용해서 연결하는 방식이지만, 유닉스 계열 시스템에는 소켓을 이용하는 것이 효율적인 방법이다.

  (소켓으로 연결하면 좋구나 정도로만 생각해두자!)

 

·  더구나 지금은 Shell을 종료하면 Gunicorn도 종료된다.

  → 계속해서 동작해야 하고, AWS 서버를 재시작해도 동작해야한다.

  → 서비스(service)로 등록이 필요하다.

 

 

  • gunicorn 서비스 파일 생성
cd /etc/systemd/system
sudo vi gunicorn.service

 

  • 예시 코드이므로 이대로 입력하면 안되고 내 경로를 입력해야 한다.
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=<manage.py가 위치한 디렉토리 pwd>
ExecStart=<gunicorn이 설치된 가상환경 위치> \
        --workers 2 \
        --bind unix:/tmp/gunicorn.sock \
        <wsgi.py가 있는 디렉토리 이름>.wsgi:application

[Install]
WantedBy=multi-user.target
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/edu-django-test
ExecStart=/usr/bin/gunicorn \
        --workers 2 \
        --bind unix:/tmp/gunicorn.sock \
        api_pjt.wsgi:application

[Install]
WantedBy=multi-user.target

 

 

 

다시 ip 주소로 들어가보면 👀

 

정적 파일도 잘 적용됐다!

 


배포 마무리

개발 모드 종료하기

settings.py

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

 

commit → push & EC2 pull !

 

 

Gunicorn 재시작

sudo systemctl restart gunicorn
sudo systemctl status gunicorn

 

 

동작 상태 확인

 

이제는 내부 정보가 보이지 않는다.

 

 

Postman 동작 확인

 

  • 마지막으로 postman 동작을 확인해보자

 

 

  • 환경 변수로 등록해서 사용해보기

 

 

끄으으읕!!🚀