AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지)

AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지)

안녕하세요! 오늘은 AWS EC2에 Django 애플리케이션을 배포하는 실용적인 방법에 대해 알아보겠습니다. 초보자부터 실무 개발자까지 따라할 수 있는 단계별 가이드를 제공합니다.

배포 전 준비사항

  1. AWS 계정 생성
  2. EC2 인스턴스 생성
  3. 도메인 구매 및 설정 (선택사항)
  4. SSL 인증서 준비 (선택사항)

1. EC2 인스턴스 설정

1.1 인스턴스 생성

  1. AWS 콘솔에서 EC2 서비스 선택
  2. "인스턴스 시작" 클릭
  3. Amazon Linux 2 AMI 선택
  4. 인스턴스 유형 선택 (t2.micro로 시작 추천)
  5. 보안 그룹 설정:
    • SSH (22)
    • HTTP (80)
    • HTTPS (443)

1.2 SSH 접속

# 키 파일 권한 설정
chmod 400 your-key.pem

# SSH 접속
ssh -i your-key.pem ec2-user@your-ec2-public-ip

2. 서버 환경 설정

2.1 시스템 업데이트

sudo yum update -y

2.2 필요한 패키지 설치

# 개발 도구 설치
sudo yum groupinstall -y "Development Tools"

# Python 3.9 설치
sudo yum install -y python39 python39-devel

# 기타 필요한 패키지
sudo yum install -y nginx git postgresql-devel

2.3 Python 가상환경 설정

# pip 업그레이드
python3.9 -m pip install --upgrade pip

# virtualenv 설치
python3.9 -m pip install virtualenv

# 프로젝트 디렉토리 생성
mkdir /var/www/myproject
cd /var/www/myproject

# 가상환경 생성 및 활성화
python3.9 -m virtualenv venv
source venv/bin/activate

3. Django 프로젝트 설정

3.1 프로젝트 클론

git clone https://github.com/yourusername/yourproject.git .

3.2 의존성 설치

pip install -r requirements.txt

3.3 환경 변수 설정

# .env 파일 생성
vim .env

# 환경 변수 설정 예시
DEBUG=False
SECRET_KEY=your-secret-key
ALLOWED_HOSTS=your-domain.com,ec2-public-ip
DATABASE_URL=postgres://user:password@localhost:5432/dbname

3.4 데이터베이스 설정

# PostgreSQL 설치 및 시작
sudo amazon-linux-extras install postgresql13
sudo systemctl start postgresql
sudo systemctl enable postgresql

# 데이터베이스 및 사용자 생성
sudo -u postgres psql
CREATE DATABASE yourdb;
CREATE USER youruser WITH PASSWORD 'yourpassword';
GRANT ALL PRIVILEGES ON DATABASE yourdb TO youruser;
\q

4. Gunicorn 설정

4.1 Gunicorn 설치

pip install gunicorn

4.2 Gunicorn 서비스 파일 생성

sudo vim /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ec2-user
Group=nginx
WorkingDirectory=/var/www/myproject
Environment="PATH=/var/www/myproject/venv/bin"
ExecStart=/var/www/myproject/venv/bin/gunicorn \
    --workers 3 \
    --bind unix:/var/www/myproject/myproject.sock \
    yourproject.wsgi:application

[Install]
WantedBy=multi-user.target

4.3 Gunicorn 서비스 시작

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

5. Nginx 설정

5.1 Nginx 설정 파일 생성

sudo vim /etc/nginx/conf.d/myproject.conf
server {
    listen 80;
    server_name your-domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /var/www/myproject;
    }

    location /media/ {
        root /var/www/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/myproject/myproject.sock;
    }
}

5.2 Nginx 시작

sudo systemctl start nginx
sudo systemctl enable nginx

6. SSL 설정 (Let's Encrypt)

6.1 Certbot 설치

sudo yum install -y certbot python3-certbot-nginx

6.2 SSL 인증서 발급

sudo certbot --nginx -d your-domain.com

7. 정적 파일 수집

python manage.py collectstatic --noinput

8. 보안 설정

8.1 방화벽 설정

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

8.2 SELinux 설정

sudo setsebool -P httpd_can_network_connect 1

9. 모니터링 설정

9.1 CloudWatch 에이전트 설치

sudo yum install -y amazon-cloudwatch-agent

9.2 로그 설정

sudo vim /etc/amazon-cloudwatch-agent.json
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/nginx/access.log",
                        "log_group_name": "/aws/ec2/myproject/nginx/access",
                        "log_stream_name": "{instance_id}"
                    },
                    {
                        "file_path": "/var/log/nginx/error.log",
                        "log_group_name": "/aws/ec2/myproject/nginx/error",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

10. 자동화 스크립트

10.1 배포 스크립트

#!/bin/bash

# 프로젝트 디렉토리로 이동
cd /var/www/myproject

# 최신 코드 가져오기
git pull origin main

# 가상환경 활성화
source venv/bin/activate

# 의존성 설치
pip install -r requirements.txt

# 데이터베이스 마이그레이션
python manage.py migrate

# 정적 파일 수집
python manage.py collectstatic --noinput

# Gunicorn 재시작
sudo systemctl restart gunicorn

# Nginx 재시작
sudo systemctl restart nginx

11. 백업 전략

11.1 데이터베이스 백업

#!/bin/bash

# 백업 디렉토리 생성
mkdir -p /var/backups/postgresql

# 백업 수행
pg_dump -U youruser yourdb > /var/backups/postgresql/backup_$(date +%Y%m%d).sql

# S3에 백업 업로드
aws s3 cp /var/backups/postgresql/backup_$(date +%Y%m%d).sql s3://your-backup-bucket/

12. 문제 해결

12.1 로그 확인

# Nginx 로그
sudo tail -f /var/log/nginx/error.log

# Gunicorn 로그
sudo journalctl -u gunicorn

# Django 로그
tail -f /var/www/myproject/logs/django.log

12.2 일반적인 문제 해결

  1. 502 Bad Gateway: Gunicorn이 실행 중인지 확인
  2. Static 파일 404: collectstatic 실행 및 Nginx 설정 확인
  3. 데이터베이스 연결 오류: PostgreSQL 서비스 상태 및 연결 정보 확인

13. 성능 최적화

13.1 Gunicorn 설정 최적화

[Service]
ExecStart=/var/www/myproject/venv/bin/gunicorn \
    --workers 4 \
    --threads 2 \
    --worker-class gthread \
    --bind unix:/var/www/myproject/myproject.sock \
    --timeout 120 \
    yourproject.wsgi:application

13.2 Nginx 캐싱 설정

location /static/ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

location /media/ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

결론

AWS EC2에 Django 애플리케이션을 배포하는 과정을 단계별로 알아보았습니다. 이 가이드를 따라하면 안정적이고 확장 가능한 프로덕션 환경을 구축할 수 있습니다. 추가적인 질문이나 궁금한 점이 있으시면 댓글로 남겨주세요!

댓글