[Django] Django REST Framework 앱을 Google Cloud Platform에 배포하기 (2) - Nginx + Gunicorn + HTTPS

정재경·2021년 10월 29일
0

Django

목록 보기
2/2
post-thumbnail

시작하기 전 준비물

  1. 배포하기 1번 글까지 완료된 상태
  2. Web Application Server, Proxy Server, HTTPS 개념

지금까지는 개발용 서버를 켜서 배포를 했다면, 실제로 배포용 서버를 설정하고 배포해보자. 이 글은 개념설명이 빠진 실제 배포 과정만 다룰꺼다.

배포과정

  1. Nginx 설치
  2. DNS 등록
  3. Gunicorn 으로 WSGI 서버 실행
  4. Nginx로 웹 서버 실행 후 Gunicorn으로 라우팅
  5. systemctl 등록
  6. Certbot 설치 후 인증서 등록

Nginx 설치


$> sudo apt-get install nginx

DNS 등록

원하는 DNS 서비스에서 DNS를 등록할 수 있다. 그냥 일반 IP로 돼있는 주소에는 HTTPS 인증서 적용이 안되므로, HTTPS 적용을 위해선 도메인과 DNS 서비스가 필요하다. 나의 경우 무료 DNS 서비스인 DuckDNS를 사용했다.

"원하는 도메인" 자리에 자기가 원하는 도메인을 적고, current ip 아래에 우리가 생성한 Ubuntu 서버의 외부 ip를 적으면 DNS 연결이 된다.

그러면 사용자가 내도메인.duckdns.org에 요청을 보내면 그 요청이 그대로 내 서버 외부 IP로 전달이 된다.

Gunicorn 실행

이제는 서버를 실제로 설정하고 실행할 차례이다. 우선 Gunicorn을 먼저 실행하자.

나의 경우에는 django와 gunicorn을 비롯한 모든 패키지들을 가상환경에 설치했기 때문에, 가상환경의 경로에서 gunicorn을 실행해야 했다.

이 내용을 /etc/systemd/system/gunicorn.service 에 작성하자.

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=therealjamesjung
WorkingDirectory=/home/therealjamesjung/JIM_backend/
Environment="MY_SECRET_KEY=mysecretkey"
Environment="DB_PASSWORD=mydbpassword"
ExecStart=/home/therealjamesjung/.local/share/virtualenvs/JIM_backend-6gYhw2_b/bin/gunicorn \
        --workers 3 \
        JIM.wsgi

[Install]
WantedBy=multi-user.target

이 것은 systemctl으로 gunicorn이라는 서비스를 등록해서, 서버가 항상 켜져있도록 하는 설정파일이다. 하나하나 설정해보자

  1. Unit/Description - 서비스 설명이다. systemctl status 할 때 나오는 메세지를 처리한다. gunicorn daemon으로 하자.
  2. Unit/After - 이 서비스를 시작하기 전 실행되어야 하는 것들의 목록이다. network.target으로 하자.
  3. Service/User - 내 유저명을 적자.
  4. WorkingDirectory - 내 django 파일의 경로를 적어주면 된다.
  5. Environment - gunicorn을 실행할 때 적용할 환경변수를 적으면 된다. 로컬 환경변수를 가져오면 좋겠지만, 여기에 적어줘야 작동한다. settings.py 에 SECRET_KEY = os.environ.get('MY_SECRET_KEY') 을 적용하고 싶은 값을 여기에 적으면 된다. 나의 경우 PostgreSQL에 접속할 비밀번호도 여기에 작성했다.
  6. ExecStart - 어떤 명령을 실행할지 지정해주는 곳이다. 앞서 얘기한 것 처럼 나는 패키지들이 가상환경에 설치돼있기 때문에, 가상환경의 경로에 있는 gunicorn을 지정해줬다. 나의 경우에는 그 경로가 /home/therealjamesjung/.local/share/virtualenvs/django-app-venv/bin/gunicorn 이였는데, 자신의 경로를 잘 찾아서 확인하자! 잘 모르겠으면 가상환경을 실행한 다음 which gunicorn 하면 경로를 알려준다. 그 아래 --workers 3는 자신이 원하는 설정으로 해주면 되고, 실행하려는 django 앱의 wsgi 파일을 지정해주면 된다.
  7. Install - systemctl enable의 target에 대한 설정이다. multi-user.target으로 하자.

이 내용을 저장한 다음 이 명령어들을 해주자.

$> sudo systemctl start gunicorn
$> sudo systemctl enable gunicorn

start는 방금 설정파일을 실행한다는 것이고, enable은 서버가 꺼졌다가 켜져도 알아서 실행하게 만든다.

Nginx 설정

거두절미하고 바로 본론으로 가자
이 내용을 /etc/nginx/sites-enabled/django-app.conf 에 작성하자.

server {
        server_name therealjamesjung.duckdns.org;


        location /static/ {
                root /home/therealjamesjung/django-app;
        }

        location / {
                include proxy_params;
                proxy_pass http://127.0.0.1:8000;
        }		
}
  1. django-app.conf 의 파일 이름은 원하는대로 해도 된다.
  2. server_name - 아까 설정해준 DNS의 도메인 주소를 써주면 된다. 거기에서 오는 요청을 Nginx 서버가 처리하겠다는 뜻이다.
  3. location /static/ - django app의 static 파일들이 저장되는 위치를 지정해주면 된다. REST API만 사용한다면 크게 필요는 없을 수도 있지만, admin 페이지 같은걸 개발할 때 활용한다면, 이게 없으면 CSS 파일이 없어서 깨져보인다.
  4. location / - /로 들어오는 요청을 처리하는 내용이다. proxy 서버로서 작동하기 때문에 모든 요청을 gunicorn 서버가 듣고있는 http://127.0.0.1:8000 으로 라우팅해준다.

이 내용을 저장한 다음 이 명령어들을 해주자.

$> sudo systemctl restart nginx

자 이제 마법을 부릴 시간이다. https://therealjamesjung.duckdns.org 으로 접속하면 우리가 알던 페이지가 나온다!

추가적으로

1번 글을 따라왔다면, 방화벽에서 8000포트를 열어줬을 것이다. 하지만 이제는 기본 HTTP/HTTPS 포트인 80번과 443번으로 들어오는 요청을 Nginx가 처리하기 때문에, 8000번 포트를 열고 8000번 포트로 접근할 필요가 없어졌다. gunicorn으로 서버를 열때도 0.0.0.0이 아닌 localhost로 실행한 이유도 이 떄문이다. 그래서 해당 방화벽 설정을 삭제해줘도 된다. 잘 모르겠고 일단 배포가 우선이라면 그냥 그대로 따라하고 방화벽 설정도 지우자!

Reference

Gunicorn Docs
Nginx Docs
Certbot 관련 포스팅
Certbot Docs
Digital Ocean 포스팅
systemd 관련 포스팅

profile
You'll see what I've become.

0개의 댓글