설표의 장고




장고) 장고 프로젝트 배포하는 방법(웹사이트 오픈하기)





( 수정됨)


환경

OS : Windows 10

주요 파일 경로

(로컬 기준)
mysite/
|- pip.txt
|- config/
    |- settings/
        |- prod.py

웹서버 이용시 주의해야할 점

서버를 해킹당하는 경우 요금 폭탄을 맞을 수 있습니다.
요금 상한선이 없는 다른 서버들도 해당하는 사항이긴 하지만요.

https://www.google.com/search?q=라이트세일+요금폭탄+해킹

인스턴스 생성하기

링크로 대체합니다.

"forum.seolpyo.com" 도메인으로 접속 가능한 웹사이트 오픈한다는 것을 가정하고 진행하겠습니다.

※ forum.seolpyo.com를 실제로 운영하지는 않습니다. "https://django.seolpyo.com/" 사이트가 이미 제가 운영하고 있는 Django로 만들어진 사이트니까요.

서버에 ssh 연결하기

링크로 대체합니다.

SSH 설치와 사용방법

apt 업데이트와 업그레이드

처음에는 깡통 수준의 서버이므로 기본적인 업데이트를 수행해줍니다. 이 작업에 5분에서 15분 정도의 시간이 소요됩니다.

$ sudo apt update && sudo apt upgrade -y

설치된 파이썬 확인

파이썬이 기본으로 설치되어있긴 하니 버전을 확인해봅시다.
보통 "python" 또는 "python3"로 설정되어있습니다.

~$ python -V
Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
~$ python3 -V
Python 3.10.6

파이썬 설치방법

설치되어있는 파이썬 버전이 마음에 들지 않는다면 원하는 버전을 설치해야합니다.
다음은 python 3.10 버전을 설치하는 명령입니다.

~$ sudo apt install python3.10 -y

파이썬 버전 확인방법

다시 한 번 설치된 파이썬의 버전을 확인해 설치가 되었는지 점검합니다.

~$ python3 -V
Python 3.10.12

설치 가능한 파이썬 버전 확인하는 방법

상황에 따라 서버에 원하는 파이썬 버전이 존재하지 않을 수 있습니다.
이 경우 먼저 확인해봐야 하는데, 파이썬 3.12 버전을 설치할 수 있는지 확인하려면 다음 명령어를 입력하면 됩니다.

~$ sudo apt update
~$ apt search ^python3.12

가상환경 생성하기

가상환경 생성을 위한 패키지를 설치합니다. 파이썬 3.10 버전을 사용하므로 python3.10-venv를 설치합니다.

~$ sudo apt install python3.10-venv -y

가상환경 생성

로컬 환경과 마찬가지로 django라는 이름의 가상환경을 생성합니다.

~$ python3 -m venv django

가상환경 실행방법

윈도우와는 다르게 리눅스에서는 "bin"이라는 디렉토리에 "activate" 파일이 위치합니다.

~$ . ~/django/bin/activate

장고 파일을 보관할 디렉토리 생성

장고 프로젝트 파일을 보관할 디렉토리를 생성합니다.

(django) ~$ mkdir ~/django/mysite

재부팅

1차적인 준비가 되었으니 서버를 재부팅합니다.

(django) ~$ sudo reboot

도메인 연결방법

고정 IP 연결하기

인스턴스에 고정 IP를 연결하는 방법은 링크로 대체합니다.

도메인 연결하기

서버 인스턴스 ip 주소로 도메인 주소를 연결합니다. 연결방법은 링크로 대체합니다.

파일 업로드

서버가 재부팅되는 것을 기다리며 로컬에서 파일을 업로드할 준비를 합니다.

prod.py 수정하기

prod.py의 ALLOWED_HOSTS 목록에 "forum.seolpyo.com"을 추가합니다.

# config/settings/prod.py

from .local import *

DEBUG = False
ALLOWED_HOSTS = ['forum.seolpyo.com'] # 접속 가능한 도메인 추가
STATICFILES_DIRS = []
STATIC_ROOT = BASE_DIR / 'static'

가상환경 실행하기

윈도우에서 작업한 내용을 백업하기 위해 가상환경을 실행합니다.

pip 백업

pip freeze 명령으로 설치된 파이썬 패키지를 python.txt 파일에 기록합니다.
명령어는 "pip freeze > {저장 경로}"입니다.

제 경우에는 다음과 같이 입력했습니다.(django) C:\django\mysite>pip freeze > C:/django/mysite/pip.txt

파일질라를 통해 파일 전송

장고 프로젝트 파일을 앞서 생성한 "mysite" 디렉토리로 전송합니다.

파일질라 설치와 사용방법은 링크로 대체합니다.

전송한 파일들은 다음과 같은 경로에 위치하게 됩니다.

ubuntu
|- django/
    |- mysite/
       |- pip.txt
       |- db.sqlite
       |- manage.py
       |- config/
       |  |- settings.py
       |  ...
       |- media/
       |- static/
       |- templates/
       ...
업로드 파일

서버에 SSH 연결하기

이제 다시 서버에 SSH로 접속하고 파이썬 가상환경을 실행합니다.

pip 패키지 복구하기

pip install -r 명령어로 파일에 기록된 패키지를 설치할 수 있습니다.

(django) ~$ pip install -r ~/django/mysite/pip.txt

collectstatic

collectstatic을 통해 웹사이트에 필요한 파일들을 static 폴더에 모아줍니다.
로컬에서 collectstatic을 한 적이 있었더라도 혹시 누락된 파일이 있을지 모르니 진행합니다.
다음 명령어를 입력하고, "Type 'yes' to continue, or 'no' to cancel:" 라는 메세지창이 나타나면 "yes"를 입력합니다.

(django) ~$ python ~/django/mysite/manage.py collectstatic --settings=config.settings.prod

gunicorn 설치하기

장고 배포에 필요한 gunicorn 파이썬 패키지를 설치합니다.

(django) ~$ pip install gunicorn

mysite.env 생성

다음 명령어를 입력해 mysite.env 파일을 생성합니다.

(django) ~$ nano ~/mysite.env

다음 내용을 입력하고, "Ctrl" + "X"키를 눌러 저장합니다. 
화면 하단에 "Save modified buffer?"라는 문구가 나오면 "y" 입력 후 엔터 키를 입력하면 됩니다.

# ~/mysite.env

DJANGO_SETTINGS_MODULE=config.settings.prod

mysite.service 파일 생성

다음 명령어를 입력해 mysite.service 파일을 작성합니다.

(django) ~$ sudo nano /etc/systemd/system/mysite.service

다음 내용을 입력하고 저장합니다.
저장 과정은 mysite.env와 같습니다.

# /etc/systemd/system/mysite.service

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

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/django/mysite
EnvironmentFile=/home/ubuntu/mysite.env
ExecStart=/home/ubuntu/django/bin/gunicorn \
--workers 2 \
--bind unix:/tmp/mysite.sock \
config.wsgi:application

[Install]
WantedBy=multi-user.target

자동 실행 설정

다음 명령어를 입력하고, "Active"라는 단어가 포함되었는지 확인합니다.
확인 후 "Ctrl" + "c"키를 입력하면 터미널 입력 화면으로 돌아올 수 있습니다.

~$ sudo systemctl start mysite.service
~$ systemctl status mysite.service

다음과 같이 "Active" 항목에 "active (running)"이 표시되어야 합니다.

mysite.service - gunicorn daemon
     ...
     Active: active (running)
     ...

Active란 단어가 확인되었다면면 다음 명령어 입력합니다.
서버가 부팅될 때 장고 프로젝트를 자동으로 실행하는 명령어입니다.

~$ sudo systemctl enable mysite.service

nginx 설치

서버에 nginx를 설치합니다.

~$ sudo apt install nginx -y

nginx 설정파일 작성하기

nginx 설정파일 작성을 위해 다음 명령어를 입력합니다.

~$ sudo nano /etc/nginx/sites-available/mysite

다음 내용을 입력하고, 저장합니다.
"Ctrl" + "x"키를 입력한 다음, "Save modified buffer?"라는 문구가 나오면 "y" 입력 후 엔터 키를 입력하면 됩니다.

"sever_name"은 예시를 위해 "django.seolpyo.com"이라는 도메인 주소를 입력했습니다.
실제로 할 때는 자신이 사용할 도메인 주소를 입력해야 합니다.

# /etc/nginx/sites-available/mysite

server {
  listen 80;
  charset utf-8;
  server_name forum.seolpyo.com;
  # server_name {url domain 주소};
  location = /favicon.ico { access_log off; log_not_found off; }
  location /static {
    alias /home/ubuntu/django/mysite/static;
  }
  location /media {
    alias /home/ubuntu/django/mysite/media;
  }
  location / {
    include proxy_params;
    proxy_pass http://unix:/tmp/mysite.sock;
  }
}

다음 명령을 입력합니다.

~$ sudo rm /etc/nginx/sites-enabled/default
~$ sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
~$ sudo systemctl restart nginx

다음 명령어를 입력해, Active 항목이 active인지 확인합니다.

~$ systemctl status nginx

접속해보기

브라우저를 열고 연결한 도메인으로 접속해보면 장고 프로젝트가 작동하는 것을 확인할 수 있습니다.
ssl 인증서를 설치하지 않았으니 "http://{도메인 주소}"를 입력해야 접속이 가능할 수 있습니다.

다음은 "http://forum.seolpyo.com"으로 접속한 이미지입니다.
아직 설정 문제로 인해 css가 제대로 적용되지 않는 문제가 있습니다.
이 문제의 해결방법은 다음 글에서 알아보도록 하겠습니다.

도메인으로 접속하기


이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!


공감 : 0