본문 바로가기

Web Server/Nginx

[Nginx] django에서 nginx static file serve 하기

1. 문제점

docker로 django와 nginx서버를 띄우고 80번 포트로 접속을 하면 404 에러가 뜨면서 화면이 나오지 않는다.

위와 같은 문제는 django 앞에 nginx가 있는 리버스 프록시 아키텍처 구조인데, nginx쪽에서 static 파일을 django에게 요청을 받지 못한 문제점이다.

즉, nginx 컨테이너 안에 django 파일이 없다는 뜻이다. 

 

해결하기 위해서는 django static file을 nginx에 볼륨 마운트를 해주어야 한다.

 

 

2. 해결방법

(1) collectionstatic

먼저 다른 static 파일이 있다고도 가정했을 때, django의 static 파일과 다른 static file을 한 경로에 모을 필요가 있다.

 

# settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
    BASE_DIR / "static"
]
python manage.py collectionstatic

위처럼 설정 파일에서 static 경로를 정하고, 명령어로 모든 static 파일을 'static'이라는 폴더에 모아놓는다.

 

 

(2) docker-compose.yml

nginx:
    image: nginx:latest
    container_name: nginx
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./staticfiles/:/static
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf
        - ./nginx/certs/:/etc/nginx/certs/
    networks:
        - docker
    depends_on:
        - django

볼륨을 보면 로컬의 staticfiles 경로를 도커 컨테이너 /static 경로로 마운트해주었다.

 

 

(3) nginx.conf

server {
    listen 80;
    server_name localhost;

    include mime.types;

    location /static/{
        alias /static/;
    }

    location / {
        proxy_pass http://django:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

location /static/ 부분을 추가하였다.

 

nginx 웹 서버에서 /static/을 연결하는 Url이 호출되었을 때, nginx 컨테이너 내부의 /static/ 파일을 이용하라는 코드이다.

 

 

위의 설정을 다 하면 80번 포트로도 django뿐만 아니라 모든 static 파일을 serve 받을 수 있다.

'Web Server > Nginx' 카테고리의 다른 글

Nginx 개념 및 configuration  (0) 2022.11.12
Nginx vs Apache  (0) 2022.10.25