Nginx로 Django 정적 파일 제공

훌륭한 Django 애플리케이션을 개발했으며 이제 배포할 시간입니다.

훌륭한 선택인 NGINX를 사용하고 있지만 Django 프로젝트에는 실제로 정적 파일에 대한 구성이 있습니다.
Django 애플리케이션이 NGINX를 통해 실행된다는 점을 감안할 때 NGINX를 통해 정적 파일을 구성하고 제공하는 것이 중요합니다.

Django 정적 파일 구성



Django 정적 파일에 익숙하지 않은 경우 내가 작성한 작은 기사를 읽을 수 있습니다.

다음은 간단한 프로젝트를 위한 Django 구성입니다.

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
STATIC_ROOT =  os.path.join(BASE_DIR, 'staticfiles')


배포 프로세스에서 python manage.py collectstatic 명령이 실행되었는지 확인하는 것이 중요합니다. 이 명령을 사용할 때 Django는 앱에서 모든 정적 파일을 찾아 STATIC_ROOT 경로에서 수집한 다음 staticfiles 에서 수집합니다.

NGINX 웹서버 구성 파일




sudo nano /etc/nginx/sites-enabled/django-app.conf

django-app.conf 파일 내에서 Django 프로젝트의 정적 파일 위치를 추가해야 합니다.

location /static/{
    autoindex on;
    alias /home/app/django-app/staticfiles/; // => the path to the static folder
}


그런 다음 NGINX 서버를 다시 로드하면 됩니다.

이 솔루션은 약간 길며 자동화되지 않았습니다. 대부분의 경우 Docker 를 사용하고 다른 시스템에서 다른 시스템으로 코드를 이동하고 컨테이너를 시작합니다.

NGINX 및 Docker로 정적 파일 제공



Django 애플리케이션의 동일한 설정을 사용하여 정적 파일을 제공하기 위해 동일한 구성을 포함하는 파일docker-compose.yaml을 작성해 보겠습니다.

기본적으로 두 가지 서비스가 필요합니다.
  • 장고 애플리케이션.
  • 그리고 NGINX 서버.

  • 다음은 Dockerfile의 첫 번째 모습입니다. 이Dockerfile는 Django 애플리케이션 서비스의 이미지로 빌드되어 사용될 것입니다.

    # pull official base image
    FROM python:3.10-alpine
    
    # set work directory
    WORKDIR /app
    
    # set environment variables
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    RUN apk update \
        && apk add gcc python3-dev
    
    # install python dependencies
    COPY requirements.txt /app/requirements.txt
    RUN pip install --upgrade pip
    RUN pip install --no-cache-dir -r requirements.txt
    
    
    # copy project
    COPY . .
    


    다음은 정적 파일의 예입니다.

    version: '3.9'
    services:
      nginx:
        container_name: core_web
        restart: on-failure
        image: nginx:stable
        volumes:
          - ./nginx/nginx.dev.conf:/etc/nginx/conf.d/default.conf
          - static_volume:/staticfiles
        ports:
          - "80:80"
        depends_on:
          - api
      api:
        container_name: core_app
        build: .
        restart: always
        env_file: .env
        ports:
          - "5000:5000"
        command: >
          sh -c " python manage.py migrate &&
              gunicorn CoreRoot.wsgi:application --bind 0.0.0.0:5000"
        volumes:
         - .:/app
         - static_volume:/staticfiles
    
    volumes:
      static_volume:
    


    또한 정적 파일 요청을 staticfiles 폴더로 라우팅하도록 Nginx 구성 파일을 업데이트합니다.

    
    upstream webapp {
        server core_app:5000;
    }
    server {
    
        listen 80;
        server_name localhost;
    
        location / {
            proxy_pass http://webapp;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
        }
    
        location /static/ {
           autoindex on;
           alias /home/app/django-app/staticfiles/;
        }
    }
    


    그리고 우리는 끝났습니다. :)

    무언가를 추가하고 싶거나 의견이 있으십니까? 댓글 섹션에서 이에 대해 논의해 보겠습니다.

    bloggu.io을(를) 사용하여 게시된 기사. 무료로 사용해 보세요.

    좋은 웹페이지 즐겨찾기