ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 2023.05.12
    내일배움캠프 2023. 5. 12. 19:44

    장고 프로젝트 EC2로 배포하기!

    먼저 EC2 인스턴스를 생성해주자.

    후에 ssh 연결을 하고

    sudo apt update
    sudo apt upgrade

    입력하여 패키지들을 업데이트를 해주자

    sudo apt install python3-pip python3-dev python3-venv

    파이썬 관련 패키지들도 설치해주고

     

     

    장고의 settings.py를 수정해줘야 한다.

    DEBUG = False
    
    STATIC_URL = "static/"
    STATIC_ROOT = BASE_DIR / "static"
    
    MEDIA_URL = "media/"
    MEDIA_ROOT = BASE_DIR / "media"
    
    ALLOWED_HOSTS = [
    	'EC2 퍼블릭 ip'
    ]

    ALLOWED_HOSTS 에는 본인 EC2 퍼블릭 ip를 넣어주자

     

    깃허브로 푸시하고

    EC2에서 클론할 준비를 해보자

    ssh-keygen -t rsa -b 4096

    ssh 키젠을 생성하자

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

    입력하면 ssh-rsa 로 시작하는 긴 문자들이 보일 것이다. 전부 복사해서

    깃허브 Settings -> SSH and GPG keys -> New SSH key

    Key 란에 붙여넣고 Add SSH key 눌러주면 완료

     

    그 후엔 깃허브 레포지토리 ssh 주소로 클론이 가능하다.

     

    클론 후엔 가상환경 세팅해주고

    의존성 패키지 설치해주고

    장고 마이그레이션도 해주자

    python manage.py collectstatic

    어드민 페이지 관련해서 css 파일도 모아주기 위해 위 코드를 입력하자

     

    Gunicorn과 Nginx

    1. gunicorn:
      • gunicorn은 Django와 같은 웹 애플리케이션을 실행하는 서버입니다.
      • 여러 개의 동시 요청을 처리하기 위해 여러 프로세스를 사용합니다.
      • 안정적인 실행과 빠른 응답 속도를 제공합니다.
      • 주로 프로덕션 환경에서 Django 애플리케이션을 실행하는 데 사용됩니다.
    2. Nginx:
      • Nginx는 웹 서버로, 정적 파일 서비스와 프록시 서버 기능을 수행합니다.
      • 정적 파일 서비스는 웹 사이트의 이미지, CSS, JavaScript와 같은 정적 파일을 빠르게 제공합니다.
      • 프록시 서버는 클라이언트 요청을 받아 애플리케이션 서버(예: gunicorn)로 전달합니다.
      • 또한 로드 밸런싱과 SSL/TLS 암호화와 같은 기능도 제공합니다.
      • Nginx는 보안, 성능 및 부하 분산을 위해 주로 프로덕션 환경에서 사용됩니다.

    간단히 말하자면, gunicorn은 Django 애플리케이션을 실행하는 서버이고, Nginx는 정적 파일 서비스와 프록시 서버 기능을 가진 웹 서버입니다. 프로덕션 환경에서는 Nginx를 앞단에 위치시켜 정적 파일 제공 및 로드 밸런싱을 담당하고, Nginx는 요청을 애플리케이션 서버(gunicorn)로 전달하여 동적인 처리를 수행합니다. 이렇게 함으로써 보안, 성능 및 확장성을 향상시킬 수 있습니다.

     

    라고 권기현 튜터님이 알려주셨다.

     

     

    Gunicorn 세팅

     

    먼저 설치부터

    pip install gunicorn
    sudo vim /etc/systemd/system/gunicorn.service
    [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

     

     

    Nginx 세팅

     

    먼저 설치부터

    sudo apt install nginx
    sudo vim /etc/nginx/sites-available/drf_project
    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/{루트폴더이름}/;
        }
    
    }

    마찬가지로 해주자

    • listen 80;: Nginx가 80번 포트에서 HTTP 요청을 수신합니다.
    • server_name your_domain_or_ip;: 실제 도메인 이름이나 IP 주소로 **your_domain_or_ip**을 대체하세요.
    • location / 블록은 Django 애플리케이션에 대한 요청을 처리합니다.
    • **include proxy_params;**는 필요한 프록시 매개변수를 포함합니다.
    • **proxy_pass <http://unix>:/path/to/your/django/project/myproject.sock;**는 요청을 지정된 Unix 소켓이나 TCP 주소로 전달합니다. 여기서 Django 애플리케이션이 실행 중인 위치를 지정하세요.
    • location /static 블록은 정적 파일에 대한 요청을 처리합니다.
    • **root /home/ubuntu/{루트폴더이름}/;**는 정적 파일이 위치한 루트 디렉토리를 지정합니다. **{루트폴더이름}**을 실제 루트 폴더 이름으로 대체하세요.
    • 이러한 location 블록을 구성함으로써 Nginx는 다른 URL 경로에 대한 요청을 처리하고 적절한 내용을 제공합니다. 루트 URL ("/")에 대한 요청은 Django 애플리케이션으로 전달되며, "/static" 및 "/media"에 대한 요청은 지정된 디렉토리에서 제공됩니다.

    라고 기현튜터님이 말씀하십니다.

     

    sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

    예비로 작성한 파일을 실제 작동할 곳으로 옮겨주기 윈도우의 바로가기랑 비슷함

    sudo nginx -t

    nginx 문법 검사

    sudo systemctl restart nginx
    sudo systemctl status nginx

     

     

    권한 문제 발생시

    tail -f /var/log/nginx/error.log
    
    namei -nom /home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock
    
    chmod 755 ~/django_deploy/
    chmod 755 ~

    chmod는 리눅스 및 유닉스 시스템에서 파일 및 디렉토리의 퍼미션(권한)을 변경하는 명령입니다. "chmod"은 "change mode"의 약자입니다. chmod 명령은 파일 또는 디렉토리의 소유자, 그룹 및 기타 사용자에 대한 읽기, 쓰기 및 실행 권한을 설정하거나 변경합니다.

    chmod 명령은 숫자 모드 또는 기호 모드를 사용하여 권한을 설정합니다.

    숫자 모드: 숫자 모드는 퍼미션을 3비트 단위로 표현하며, 각 비트는 읽기(4), 쓰기(2) 및 실행(1) 권한을 나타냅니다. 이러한 권한의 조합으로 3비트 숫자를 생성하여 퍼미션을 설정합니다.

    • 사용법: chmod [퍼미션 숫자] [파일 또는 디렉토리]

    예를 들어, **chmod 755 filename**은 파일 **filename**에 대해 소유자에게 읽기, 쓰기, 실행 권한(7), 그룹 및 기타 사용자에게 읽기 및 실행 권한(5)을 부여합니다.

    라고 또 기현튜터님이 말씀하십니다.

     

     

    후에 로드밸런서 연결 리스너 설정 -> Route 53 a name alias 연동

    으로 도메인과 https 까지 완료

    어드민 페이지 로그인 안되는 문제는 아직 해결하지 못했다.

    '내일배움캠프' 카테고리의 다른 글

    TIL 2023.05.15  (0) 2023.05.15
    WIL 내일배움캠프 9주차  (0) 2023.05.12
    TIL 2023.05.11  (0) 2023.05.11
    TIL 2023.05.10  (0) 2023.05.10
    TIL 2023.05.09  (6) 2023.05.09
Designed by Tistory.