AWS

Deploy : Django to EC2

끈끈 2023. 5. 21. 15:04

 

Django 기본 세팅

 

먼저, Django 기본 세팅으로 requirements.txt 업데이트

 

pip freeze > requirements.txt

 

 

poetry 가상환경을 사용한 경우, 아래 명령어 입력

 

poetry export -f requirements.txt --output requirements.txt --without-hashes

 

 

 


 

EC2 인스턴스 생성

 

인스턴스 시작

 

이름 - Ubuntu

 

보안그룹 모두 체크

 

키 페어 생성

 

[인스턴스 시작]

 

연결

 

연결

 

[연결]을 누르면 아래와 같은 [EC2 Instance Connect]라는 탭이 새로 뜬다

 

 

Ctrl + Shift + v : 붙여넣기

 

EC2 기본 세팅

 

$ ls : 파일 목록을 보여주는 명령어

$ sudo apt update : 시스템 패키지 관리자 업데이트

$ sudo apt upgrade : 시스템 패키지 최신 버전으로 업그레이드

 

 

 

$ sudo apt install python3-pip python3-dev python3-venv
: python3 개발 환경을 구축하기 위해 필요한 패키지들 설치

> python3-pip : python 패키지 관리자 pip 설치
> python3-dev : python 개발에 필요한 라이브러리 및 헤더 파일 설치
> python3-venv : python 가상환경을 생성하기 위한 패키지 설치

 

 

 

Github Clone 받기

 

$ ssh-keygen -t rsa -b 4096 : SSH 키를 생성하는 명령

> 이 명령은 보안을 강화하기 위해 사용되며 GitHub와 같은 Git 호스팅 서비스를 사용하는 경우 SSH 키를 등록하여 인증하는 데 사용됩니다. SSH 키를 사용하면 매번 사용자 이름과 비밀번호를 입력하지 않고도 로그인하고 코드를 푸시할 수 있으며, 인증 과정에서 추가적인 보안 측면을 제공합니다.
위 명령을 실행하면 RSA 알고리즘과 4096비트 길이의 SSH 키 쌍이 생성됩니다. 이 키 쌍은 공개 키(id_rsa.pub)와 개인 키(id_rsa)로 구성됩니다. 공개 키는 GitHub나 다른 Git 호스팅 서비스에 등록되어 해당 계정과 연결됩니다. 개인 키는 로컬 컴퓨터에 보관되어 프라이빗한 소유이며, 인증 시에 사용됩니다.
따라서, github clone을 사용하고자 하고 SSH 키를 등록하지 않은 경우, ssh-keygen을 통해 SSH 키를 생성하고 GitHub 계정에 공개 키를 등록해야 합니다. 이를 통해 로컬 환경에서 SSH를 통해 GitHub과의 인증이 가능하게 됩니다.

 

 

$ cat /home/ubuntu/.ssh/id_rsa.pub

> cat : 안에 있는 정보를 꺼내오는 명령어

 

 

 

ssh-rsa 부터 ip-172-31-40-101 까지 복사

 

 

Github - Settings

 

 

New SSH key

 

SSH keys / Add new

 

Code Clone SSH

 

$ git clone [SSH 주소]

 

 

 

$ python3 -m venv venv

> 3 붙여줘야 함
> ls 눌러보면 venv 폴더가 생성되어 있음

$ source venv/bin/activate : 가상환경 진입

$ pip install -r requirements.txt : 패키지 설치

 

 

 

내가 만난 문제
pip install -r requirements.txt 버전 문제

 

ubuntu@ip-172-31-40-101:~/drf_todolist/venv$ cd .. ubuntu@ip-172-31-40-101:~/drf_todolist$ source venv/bin/activate (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$ pip install -r requirements.txt Ignoring asgiref: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring certifi: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring charset-normalizer: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring django-cors-headers: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring django: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring djangorestframework-simplejwt: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring djangorestframework: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring idna: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring pyjwt: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring python-decouple: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring pytz: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring requests: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring sqlparse: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring tzdata: markers 'python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32"' don't match your environment Ignoring urllib3: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$ ^C (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$

현재 출력에서는 Python 버전이 3.11 이상이 필요하며 4.0 미만이 되어야 한다고 명시되어 있습니다.

현재 사용 중인 Python 버전 확인: python --version 명령을 실행하여 현재 사용 중인 Python 버전을 확인합니다.

Python 버전이 3.11 미만인 경우:Poetry를 사용하는 경우, pyproject.toml 파일에서 python 섹션을 찾아 원하는 파이썬 버전으로 수정합니다.가상 환경을 삭제하고 새로운 가상 환경을 만들어야 할 수도 있습니다.

Python 버전이 3.11 이상인 경우:Python 가상 환경을 다시 만들어야 할 수도 있습니다. 현재 가상 환경에는 버전 제한이 있는 패키지가 설치되어 있을 수 있으므로 새로운 가상 환경을 만들어야 합니다.

Poetry를 사용하는 경우, pyproject.toml 파일에서 python 섹션을 찾아 현재 사용 중인 파이썬 버전과 일치하도록 수정합니다.

 

 

$ nano requirements.txt : nano 편집기에서 버전 수정

> nano 편집기 수정 저장하는 법
1. 수정이 완료되면, Ctrl + O 를 눌러 변경사항 저장
2. Enter 키를 눌러 파일 이름 확인
3. Ctrl + X 를 눌러 편집기 종료

 

 

 

같은 방식으로 nano .env를 입력하여 SECRET_KEY를 넣어준 후,

 

$ python manage.py makemigrations

$ python manage.py migrate

python manage.py runserver 0.0.0.0:8000

 

 

 


 

인바운드 규칙에서 8000 포트 추가

 

 

MYSQL 사용시 해당 포트 추가

 

 


 

DisallowedHost at /
Invalid HTTP_HOST header : You may need to add to ALLOWED_HOSTS.

 

 

 

settings.py 수정

 

settings.py:

# 변경
DEBUG = False

# 추가
ALLOWED_HOSTS = [
    "localhost",
    "54.180.101.71", # 본인 EC2의 퍼블릭IP
]

STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = 'static/'

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'

 

 


 

Gunicorn과 Nginx

 

  1.  gunicorn:
    • Django와 같은 웹 애플리케이션을 실행하는 서버
  2. Nginx:
    • 정적 파일 서비스와 프록시 서버 기능을 수행하는 웹 서버
    • 정적 파일 서비스는 웹 사이트의 이미지, CSS, JavaScript와 같은 정적 파일을 빠르게 제공
    • 프록시 서버는 클라이언트 요청을 받아 애플리케이션 서버(예: gunicorn)로 전달
    • 또한 로드 밸런싱과 SSL/TLS 암호화와 같은 기능도 제공

프로덕션 환경에서는 Nginx를 앞단에 위치시켜 정적 파일 제공 및 로드 밸런싱을 담당하고

Nginx는 요청을 애플리케이션 서버(gunicorn)로 전달하여 동적인 처리를 수행함

이렇게 함으로써 보안, 성능 및 확장성을 향상시킬 수 있음

 

Gunicorn

 

$ pip install gunicorn

sudo vim /etc/systemd/system/gunicorn.service

> vim 텍스트 편집기 사용하는 법
i : 편집 모드로 전환
esc : 편집 모드 종료
:wq : 저장하고 종료

 

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

[Service]
User=ubuntu
Group=www-data WorkingDirectory=/home/ubuntu/{루트폴더이름} ExecStart=/home/ubuntu/{루트폴더이름}/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock {프로젝트이름}.wsgi:application

[Install]
WantedBy=multi-user.target

 

 

 

$ sudo systemctl enable gunicorn : 인스턴스 시작시 자동시작

sudo systemctl start gunicorn : 지금 시작

sudo systemctl status gunicorn : 상태

> active (running) 이 떠야 하는데 failed 떠버림

 

내가 만난 문제
루트 폴더 이름 잘못 입력

 

$ sudo vim /etc/systemd/system/gunicorn.service
> 명령어로 편집기 재 진입 후 재 설정

 

 

 

Nginx

 

$ sudo apt install nginx

sudo vim /etc/nginx/sites-available/{프로젝트이름}

 

 

편집기에서 아래 내용 본인에 맞게 입력

 

server {
    listen 80;
    server_name {your_domain_or_ip};

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock;
    }

    location /static {
            root /home/ubuntu/{루트폴더이름}/;
    }

    location /media {
            root /home/ubuntu/{루트폴더이름}/;
    }

}

 

$ sudo ln -s /etc/nginx/sites-available/{프로젝트이름} /etc/nginx/sites-enabled/
> Nginx 사이트 구성 파일 활성화

$ sudo nginx -t : Nginx 설정 파일 테스트

$ sudo systemctl restart nginx : Nginx 서비스 재시작

$ sudo systemctl status nginx : Nginx 서비스 상태 확인

 

 

 

권한 문제

 

$ tail -f /var/log/nginx/error.log : Nginx 웹 서버의 오류 로그 파일 확인

$ namei -nom /home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock : 파일 정보 출력

$ chmod 755 ~/{루트폴더이름}/

$ chmod 755 ~

> chmod(change mode) : 리눅스 및 유닉스 시스템에서 파일 및 디렉토리의 퍼미션(권한)을 변경하는 명령
사용법: chmod [퍼미션 숫자] [파일 또는 디렉토리]
읽기, 쓰기, 실행 권한(7)
그룹 및 기타 사용자에게 읽기 및 실행 권한(5)

 

 

$ python manage.py collectstatic : static 파일 복사

$ python manage.py makemigrations

$ python manage.py migrate

$ python manage.py createsuperuser

 

 

어드민 페이지 확인! 은 Not Found

 

 

[warn] 4038#4038: conflicting server name "your_domain_or_ip" on 0.0.0.0:80, ignored

 

server_name {your_domain_or_ip};

 

이것을 변경하지 않아서 생긴 문제였다;

 

설정 후 다시 어드민 페이지 확인 OK!

 

 


 

할일

더보기
  • 프론트엔드를 AWS S3 강의를 참고해서 배포해주세요
  • EC2 서버에 AWS Load Balancer 강의를 참고해서 로드밸런서를 달아주세요
  • Route53 강의를 참고해서 도메인을 달아주세요
  • HTTPS를 달아주세요!

 

Admin CSRF 해결방법

더보기

settings.py:

CSRF_TRUSTED_ORIGINS = [
    '아이피 또는 도메인',
]

 

gunicorn 설정파일

ForwardedAllowIPS=* 추가

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

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/{루트폴더이름}
ExecStart=/home/ubuntu/{루트폴더이름}/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock {프로젝트이름}.wsgi:application
Environment="DJANGO_SETTINGS_MODULE={프로젝트이름}.settings"
RuntimeDirectory=gunicorn
ForwardedAllowIPS=*

[Install]
WantedBy=multi-user.target

 

nginx설정파일

proxy_set_header Referer $http_referer; 추가

server {
    listen 80;
    server_name {your_domain_or_ip};

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock;
        proxy_set_header Referer $http_referer; 
    }

    location /static {
        root /home/ubuntu/{루트폴더이름}/;
    }

    location /media {
        root /home/ubuntu/{루트폴더이름}/;
    }
}

 

완료 후 필수

sudo service gunicorn restart
sudo service nginx restart

 

'AWS' 카테고리의 다른 글

aws  (0) 2023.05.29
AWS RDS DB 연동하기  (1) 2023.05.23
AWS의 모든 것 1강  (2) 2023.05.07
AWS Elastic Beanstalk 애플리케이션 생성 설정  (0) 2023.05.03
AWS 비밀번호 표시 없애기  (1) 2023.05.03