카테고리 없음

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

보안매크로 2024. 6. 22. 17:17

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