본문 바로가기
프로그래밍/리눅스

프로그래밍 「 리눅스 편」HTTPS를 사용하여 Ubuntu에 Django 배포

by grapedoukan 2023. 6. 13.
728x90

이 기사에서는 Django Rest Framework 백엔드를 모놀리식 Ubuntu 서버에 배포하는 기본 사항을 간략하게 설명합니다. (좋은 옛날 방식)

먼저 기술 스택을 검토해 보겠습니다.

  • Django — 백엔드 프레임워크
  • AWS EC2/Lightsail — 백엔드를 호스팅하는 VPS 서비스(Ubuntu 20.04 LTS를 실행하는 모든 VPS가 이 가이드에서 작동함)
  • Route53 — 도메인을 백엔드로 라우팅하는 DNS 관리자(이 가이드에서는 모든 DNS 관리 도구가 작동함)
  • Supervisor & Gunicorn — 백엔드의 프로세스 및 작업자 관리자
  • Nginx — 콘텐츠를 대중에게 제공하는 웹 앱

이렇게 배포하는 방법을 배우는 이유는 무엇입니까?

  • 소규모 프로젝트를 위한 매우 간단하고 간단합니다.
  • 기술 스택에 문제가 있는 경우 쉽게 디버그할 수 있습니다.
  • 다른 종류의 배포에 대한 훌륭한 지식 기반
  • CI/CD 구현이 용이하고 스테이징 환경에 유용합니다.

전제 조건:

  • 예를 들어 일종의 VPS 공급자가 있습니다. DigitalOcean과 AWS
  • Route53에 연결된 도메인 또는 DNS 관리자가 있는 도메인이 있습니다
 

1. 서버 설정

이제 코드가 로컬에서 작동하는지 확인했으므로 Lightsail 인스턴스를 생성하여 Django 프로젝트를 호스팅할 수 있습니다. 특히 Lightsail에서는 '인스턴스' 탭으로 이동한 다음 '인스턴스 생성' > 'Linux/Unix' > 'OS Only' > 'Ubuntu 20.04 LTS'로 이동합니다. ssh 키 쌍을 만들고, 다운로드하고, 안전한 위치에 보관합니다. 최소한 $5 서버 요금제가 있는지 확인하십시오. 이제 다음 명령을 사용하여 서버에 연결할 수 있습니다.

ssh -i YOUR_SSH_KEY.pem ubuntu@YOUR_VPS_IP

모든 VPS 공급자를 사용할 수 있습니다. 다음 단계는 모든 Ubuntu 20.04 서버에 적용됩니다

Ubuntu 인스턴스를 업데이트하고 필요한 모든 패키지를 설치할 수 있습니다.

sudo apt -y update && sudo apt -y upgrade
sudo apt-get -y install python3.8-dev build-essential libssl-dev python3.8-venv

#if you are running mysql with your django project make sure to also run
sudo apt-get -y install default-libmysqlclient-dev mysql-client libsqlclient-dev default-libmysqlclient-dev
 

2. Django 설정하기

우리는 본질적으로 하나의 API 엔드포인트가 있는 Django Rest Framework 앱인 내 Github에서 사용할 수 있는 시작점을 사용할 것입니다. (Django 프로젝트를 설정하는 방법을 다시 설명하고 싶지는 않습니다. 수백만 개의 다른 자습서가 있기 때문입니다.) 이것을 컴퓨터에 설치하려면 올바르게 실행하십시오.

# clone and setup starting point
git clone https://github.com/felixluebken/django_tutorials.git
cd django_tutorials
git checkout -b linux_deployment_starting_point origin/linux_deployment_starting_point

# setup virtual env and install dependencies
python3.8 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt

# migrate & run server
cd example_api
python3 manage.py migrate
python3 manage.py runserver

Django 인스턴스가 실행 중이어야하며 다음 명령 (다른 ssh 인스턴스에서)을 실행하고 json 응답을 다시 가져 와서 서버가 실행 중인지 확인할 수 있어야합니다.

curl http://localhost:8000
> {"message":"hello!"}
 

3. Gunicorn & Supervisor 설정

이제 VPS에 코드베이스가 있으므로 프로세스를 실행하고 Nginx에 프록시를 전달하기 위해 무언가를 설정해야 합니다. 가상 환경 내에서 다음을 실행합니다.

pip3 install gunicorn

Gunicorn은 Django의 wsgi.py 사용하여 Django를 Nginx 웹 서버에 연결하는 웹 서버 게이트웨이 인터페이스입니다. Gunicorn이 작동하는지 테스트해 보겠습니다. example_api (manage.py 를 실행하는 곳과 동일) 디렉토리의 가상 환경 내에서 다음을 실행하십시오.

gunicorn --bind 0.0.0.0:8000 example_api.wsgi:application

모든 것이 제대로 설정되면 다음과 같은 출력이 표시됩니다.

Gunicorn이 wsgi를 성공적으로 읽을 수 있다는 것을 알고 프로세스 제어 시스템 구현을 시작하겠습니다. 이를 위해 감독자를 사용합니다. 감독자를 설치하고 필요한 모든 것을 설정해 보겠습니다.

#install supervisor
sudo apt-get install -y supervisor

#create a log directory for gunicorn
sudo mkdir /var/log/gunicorn                      

#write process instructions for our gunicorn process
sudo nano /etc/supervisor/conf.d/gunicorn.conf

이 파일 내에서 다음 선언을 작성할 수 있습니다.

[program:gunicorn]
directory=/home/ubuntu/django_tutorials/example_api
command=/home/ubuntu/django_tutorials/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/django_tutorials/example_api/app.sock example_api.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stout_logfile=/var/log/gunicorn/gunicorn.out.log

[group:guni]
programs:gunicorn

이 구성 파일을 분해하려면 다음을 수행합니다.

  • directory — Django 프로젝트의 루트 디렉토리를 지정합니다.
  • command — venv를 사용하여 3명의 작업자와 함께 Django 프로세스를 실행합니다.
  • AutoStart — 수퍼바이저가 이 프로세스를 자동으로 시작합니다.
  • AutoRestart — 감독자가 다시 시작할 때 이 프로세스를 자동으로 시작합니다.
  • stderr_logfile — 오류에 대한 디폴트 출력 파일
  • stdout_logfile — 표준 출력에 대한 디폴트 출력 파일

이제 파일을 저장하고 실행하십시오.


#reread supervisor config files
sudo supervisorctl reread
> guni: available

#update supervisor process
sudo supervisorctl update
> guni: added process group

#restart supervisor
sudo supervisorctl restart all

#if you ever need to stop and restart supervisor you can just run
sudo supervisorctl start all
sudo supervisorctl stop all

모든 것이 작동하는지 확인하려면 django_tutorials/example_api로 내용을 나열하십시오. 해당 디렉터리 내에 app.sock 파일이 표시되어야 합니다

 

대! 지금까지 우리가 한 모든 것을 검토해 보겠습니다. 코드베이스를 VPS에 성공적으로 복제하고, Gunicorn과 함께 작동하도록 wsgi를 설정하고, Gunicorn을 통해 Django wsgi를 실행하도록 감독자를 구성했습니다.

다음 단계는 Gunicorn 소켓을 Nginx 웹 서버에 연결하는 것입니다.

 

4. Nginx 구성

먼저 Nginx를 설치하고 서버를 구성하겠습니다.

sudo apt-get install -y nginx

#edit the default Nginx config
sudo nano /etc/nginx/sites-available/default

이 파일에서 모든 것을 제거하고 다음을 작성하려고합니다.

server {
        listen 80;
        server_name api.example_api.com;

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/django_tutorials/example_api/app.sock;
        }
}

참고할 사항:

  • server_name 구성하려는 적절한 도메인이 포함되어 있는지 확인합니다. 원하는 하위 도메인을 도입 할 수 있습니다
  • listen 80은 포트 80(HTTP)에서 수신 대기하도록 지정합니다.
  • location 속성은 Nginx에 들어오는 연결을 보낼 소켓을 알려줍니다.

Nginx 설정을 완료하려면 구성 파일을 테스트하고 서비스를 다시 시작해야합니다.

#test nginx configuration file
sudo nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful

#restart nginx service
sudo service nginx restart

... 그리고 우리는 살아 있습니다! 로컬 컴퓨터에서 이것을 실행하여 이를 확인할 수 있습니다

curl YOUR_VPS_IP
> {"message":"hello!"}

4. Certbot을 통한 HTTPS

API 끝점을 인증하려면 먼저 도메인을 VPS의 공용 IP 주소로 가리켜야 합니다. 이렇게 하려면 다음과 같은 A 레코드를 만듭니다.

어떤 DNS 관리자를 사용하든 동일한 옵션이 있습니다.

사용하는 DNS 관리자에 따라 레코드가 전파될 때까지 기다려야 합니다. 다음과 같은 방법으로 전파 상태를 확인할 수 있습니다 https://www.whatsmydns.net/

도메인 아래에 올바른 IP 주소가 표시되면 웹 사이트를 인증해 보겠습니다.

#setup snap
sudo snap install core; sudo snap refresh core

#install certbot
sudo snap install --classic certbot

#create required systematic links
sudo ln -s /snap/bin/certbot /usr/bin/certbot

#certify your site
sudo certbot --nginx

마지막 명령은 인증서 업데이트를 위한 전자 메일을 입력하고 원하는 도메인을 확인하는 등 몇 가지 단계를 수행합니다. 원하는 도메인이 VPS의 공개 IP 주소를 가리키지 않으면 작동하지 않습니다.

마지막 단계는 모든 HTTPS가 이 포트를 통과하므로 포트 443이 일반에 공개되도록 하는 것입니다. Lightsail에서는 다음과 같이 표시됩니다.

다른 VPS 서비스에 대해 유사한 옵션이 있을 가능성이 큽니다.

모든 것을 테스트 할 수 있습니다.

curl api.example_api.com
> {"message":"hello!"}

그리고 그게 다야! Django 앱을 Linux 서버에 성공적으로 배포했습니다!

 

결론

이것이 Ubuntu에 Django 서버를 배포하는 기본 단계였습니다. 모든 환경 비밀을 숨기고 Django 설정에 일부 보안 구성을 적용하기를 원하기 때문에 거의 프로덕션 등급이 아니라는 점에 유의하는 것이 중요합니다. 이 문서에서는 프로덕션 등급 백엔드를 배포할 때 주의해야 할 기본 사항에 대해 간략하게 설명합니다 https://medium.com/dev-genius/securing-backend-deployments-9e57b93b93a0

이와 같이 배치하는 것은 시간의 시험을 견뎌낸 '좋은 구식' 방식입니다. 간단하고 간단하며 제어가 용이합니다. 소규모 응용 프로그램에 대해 이러한 종류의 배포를 권장합니다. 자세한 내용은 여기에서 확인할 수 있습니다 https://m.signalvnoise.com/the-majestic-monolith/

728x90