본문 바로가기
카테고리 없음

[AWS Linux] Nginx 설치 및 Django와의 연동

by 보안매크로 2024. 6. 22.
728x90

Amazon Linux에서는 yum 패키지 관리자를 사용하여 패키지를 설치해야 합니다. 다음은 Amazon Linux에서 Nginx와 필요한 패키지를 설치하고 Django와 연동하는 방법입니다.

1. Nginx 설치

sudo yum update -y
sudo yum install nginx -y

2. Gunicorn 설치

Django 애플리케이션을 서빙하기 위해 Gunicorn을 설치합니다. Gunicorn은 Python WSGI HTTP 서버로, Nginx와 함께 사용할 수 있습니다.

pip install gunicorn

3. Django 프로젝트 설정

Django 프로젝트의 설정 파일(settings.py)을 수정하여 정적 파일을 제공할 수 있도록 설정합니다.

# settings.py
 
import os
 
# 기존 설정들...
 
# 정적 파일 설정
STATIC_URL = '/static/' # 정적 파일에 접근할 기본 URL 경로를 설정
 
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # collectstatic 명령어로 모든 정적 파일을 모을 디렉토리를 지정
# BASE_DIR은 프로젝트의 기본 디렉토리 경로입니다.
# STATIC_ROOT는 모든 앱의 정적 파일을 모아 배포 준비를 할 디렉토리를 지정합니다.
# python manage.py collectstatic 명령어를 실행하면, 모든 정적 파일이 이 디렉토리에 복사됩니다.
 
# 보안 설정 (HTTPS)
# HTTP_X_FORWARDED_PROTO 헤더를 사용하여 클라이언트의 원래 프로토콜(http 또는 https)을 확인하고, Django가 이를 인식하여 HTTPS로 처리하도록 합니다.
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
 
# 이 설정이 True로 설정되면, Django는 모든 HTTP 요청을 HTTPS로 자동 리디렉션합니다. 이를 통해 모든 통신이 암호화된 HTTPS를 통해 이루어지도록 보장
SECURE_SSL_REDIRECT = True
 
# 이 설정이 True로 설정되면, CSRF(Cross-Site Request Forgery)보호를 위한 쿠키가 HTTPS 연결을 통해서만 전송됩니다. 이를 통해 CSRF 공격으로부터 애플리케이션을 보호
CSRF_COOKIE_SECURE = True
 
# 이 설정이 True로 설정되면, 세션 데이터를 저장하는 쿠키가 HTTPS 연결을 통해서만 전송됩니다. 이를 통해 세션 하이재킹 공격을 방지할 수 있습니다.
SESSION_COOKIE_SECURE = True

4. Django 애플리케이션 마이그레이션 및 정적 파일 수집

python3 manage.py migrate
python manage.py collectstatic
 
 
- 명령어 설명

python manage.py migrate

이 명령어는 데이터베이스 스키마를 설정하거나 업데이트합니다. 즉, Django 모델을 기반으로 데이터베이스 테이블을 생성하거나 변경합니다.

  • 역할: 데이터베이스 마이그레이션을 적용하여, 모델의 변경 사항을 데이터베이스에 반영합니다.
  • 실행 시간: 모델을 변경한 후, 새 앱을 추가한 후, 프로젝트를 처음 설정할 때 실행합니다.
  • 명령어 실행 과정:
    • Django는 migrations 디렉토리에 있는 마이그레이션 파일을 확인합니다.
    • 필요한 마이그레이션을 데이터베이스에 적용합니다

python manage.py collectstatic

이 명령어는 Django 프로젝트의 모든 정적 파일(static files)을 한 곳으로 모아줍니다. 이는 배포 환경에서 정적 파일을 효율적으로 서빙하기 위해 필요합니다.

  • 역할: 각 앱과 프로젝트의 static 디렉토리에 있는 모든 정적 파일을 모아 설정된 STATIC_ROOT 디렉토리로 복사합니다.
  • 실행 시간: 프로젝트를 배포할 때, 정적 파일을 변경한 후 실행합니다.
  • 명령어 실행 과정:
    • Django는 각 앱의 static 디렉토리를 검색하여 모든 정적 파일을 찾습니다.
    • 설정된 STATIC_ROOT 디렉토리로 모든 정적 파일을 복사합니다.

5. Gunicorn 설정 및 실행

Gunicorn을 사용하여 Django 애플리케이션을 실행합니다. 다음 명령어를 사용하여 Gunicorn을 백그라운드에서 실행합니다.

gunicorn --workers 3 --bind unix:/home/ec2-user/your_project/your_project.sock your_project.wsgi:application --daemon
 
ex) gunicorn --workers 3 --bind unix:/var/www/fintechproject/Server/DjangoServer/DjangoServer.sock DjangoServer.wsgi:application --daemon

6. Nginx 설정

Nginx 설정 파일을 수정하여 Django 애플리케이션과 연동합니다. 아래 설정은 HTTPS를 사용하고, HTTP 요청을 HTTPS로 리디렉션하는 설정입니다.

  1. Nginx 설정 파일 열기:
    sudo nano /etc/nginx/conf.d/your_project.conf
  2. Nginx 설정 추가: 아래 내용을 설정 파일에 추가합니다. your_domain_or_IP, your_project 및 기타 경로를 실제 값으로 변경하세요.
    server {
        listen 80;
        server_name your_domain_or_IP;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name your_domain_or_IP;

        ssl_certificate /etc/ssl/certs/your_certificate.crt;
        ssl_certificate_key /etc/ssl/private/your_private_key.key;

        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/ec2-user/your_project;
        }

        location / {
            include proxy_params;
            proxy_pass http://unix:/home/ec2-user/your_project/your_project.sock;
        }
    }
  3. Nginx 설정 테스트 및 재시작: Nginx 설정을 테스트하고, 문제가 없으면 재시작합니다

sudo nano /etc/nginx/proxy_params

내용추가
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Nginx 설정 파일 수정

이미 추가되어 있는 설정을 확인하고, 필요 시 수정합니다.

Nginx 설정 파일 열기

 
sudo nano /etc/nginx/conf.d/your_project.conf

파일 내용이 다음과 같아야 합니다:

server {
    listen 80;
    server_name your_domain_or_IP;

    location / {
        proxy_pass http://unix:/var/www/fintechproject/Server/DjangoServer/DjangoServer.sock;
        include proxy_params;
    }
}
 
 

인증서 생성해야함 -240619

sudo nginx -t
sudo systemctl restart nginx
728x90