인프런 커뮤니티 질문&답변

우태경님의 프로필 이미지

작성한 질문수

풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]

flask 백엔드 서버와 gunicorn 설정하기1

Flask 사용 시 static 파일에 접근 불가능

작성

·

319

0

[Section14] Docker를 활용하여 Flask기반의 web을 배포하려고 합니다.

파일은 아래와 같이 구성되어 있습니다.

  • homepage

    • docker-compose.yml

    • home

      • Dockerfile

      • flask_app

        • app.py

        • templates

          • index.html

        • static

          • images

        • wsgi.py

      • requirements.txt

    • flask

    • nginx

      • nginx.conf

수업내용에서 배운대로 하면 templates는 로드에 성공하는데 static에 있는 이미지들은 업로드에 실패했다고 뜹니다.

로컬에서는 제대로 작동하는 파일을 그대로 옮겨서 사용했는데 무엇이 문제인지를 모르겠습니다.

docker-compose logs를 확인하면

proxyserver | 2024/02/06 01:39:32 [error] 30#30: *8 open() "/etc/nginx/html/static/images/html.png" failed (2: No such file or directory), client: 203.237.124.159, server: , request: "GET /static/images/html.png HTTP/1.1", host: "52.79.173.37", referrer: "http://52.79.173.37/util/search"

이런식으로 이미지 파일 경로가 없다고 뜨는데, Dockerfile에서 WORKDIR로 설정해놓은 곳에 파일 전체를 그대로 COPY 했는데, templates안에 있는 index.html은 정상작동하고, static에 있는 이미지들은 안 불러지는 걸까요?

답변 1

0

안녕하세요. 답변 도우미입니다.

문제의 원인은 Nginx가 정적 파일(static images)을 제공하기 위한 경로 설정에 오류가 있는 것으로 보입니다. docker-compose.yml 파일과 Dockerfile, 그리고 nginx.conf 설정을 모두 정확히 확인하지 않고는 확실한 해결책을 제공하기 어렵지만, 일반적으로 발생할 수 있는 몇 가지 문제와 해결 방법을 안내드리겠습니다.

1. Nginx 정적 파일 경로 설정 오류: Nginx 설정에서 정적 파일을 제공할 위치가 올바르게 지정되지 않았을 수 있습니다. 로그 메시지에서 Nginx가 /etc/nginx/html/static/images/html.png 경로에서 파일을 찾으려고 시도하는 것으로 보이는데, 이는 일반적으로 기대하는 경로가 아닙니다.

2. 정적 파일 볼륨 마운트 문제: Docker-compose 설정에서 Flask 애플리케이션의 static 디렉터리가 Nginx 컨테이너 내의 올바른 위치에 마운트되지 않았을 수 있습니다. Nginx는 정적 파일을 직접 제공하기 위해 이러한 파일에 접근할 수 있어야 합니다.

3. Dockerfile COPY 명령문: Dockerfile에서 COPY 명령을 사용하여 애플리케이션 파일을 이미지에 복사할 때, static 디렉터리가 포함되도록 해야 합니다. 하지만 문제는 COPY 명령이 올바르게 실행되더라도, Nginx가 이러한 파일을 올바르게 찾을 수 있도록 설정되어야 한다는 점입니다.

### 해결 방법

1. Nginx 설정 검토: nginx.conf 파일에서 정적 파일을 제공하는 부분의 경로를 검토하세요. 다음과 같이 설정되어 있어야 합니다:

```nginx

location /static/ {

alias /path/to/your/flaskapp/static/;

}

```

여기서 /path/to/your/flaskapp/static/는 Flask 애플리케이션 내의 static 디렉터리의 절대 경로로 변경해야 합니다. Docker 컨테이너 내부에서의 경로여야 합니다.

2. Docker-compose 볼륨 설정 확인: docker-compose.yml 파일에서 Nginx 컨테이너가 Flask 애플리케이션의 static 디렉터리에 접근할 수 있도록 볼륨을 마운트하는 부분을 확인하세요. 예를 들어:

```yaml

services:

nginx:

volumes:

- ./flask_app/static:/path/to/nginx/html/static

```

이 설정은 호스트 시스템의 flask_app/static 디렉터리를 Nginx 컨테이너의 /path/to/nginx/html/static 위치에 마운트합니다. 이 경로는 앞서 Nginx 설정에서 사용한 경로와 일치해야 합니다.

3. 파일 시스템 권한 확인: 컨테이너 내에서 Nginx 프로세스가 정적 파일에 접근할 수 있는지 확인하세요. 파일 시스템 권한이나 소유권 문제로 인해 접근할 수 없는 경우가 있습니다.

위의 점들을 검토해보시면 좋을 것 같습니다.

감사합니다.