Nginx에서는 미디어 경로를 따로 설정해주지 않으면 Django media url이 정상적으로 작동하지 않는다.
나의 경우 2개의 설정을 모두 적용해야 이미지가 정상적으로 보였다.
1. 미디어 경로 설정
Nginx의 설정 파일에 미디어 관련 url을 지정하는 방법이다.
나는 서비스를 프론트엔드(client), 백엔드(server), db, nginx 4개의 컨테이너로 분리했다.
따라서 nginx 서버의 루트 url은 프론트엔드의 빌드 파일을,
api 아래는 백엔드 api를 설정하고,
api로 요청이 들어오면 8000번 포트로 넘겨주도록 파일을 설정했다.
따라서 이미지에 대한 요청도 모두 8000번 포트로 넘겨주어야 한다.
nginx/default.conf
upstream api {
server server:8000; # 백엔드 서버의 이름이 server
}
server{
listen 8080;
server_name localhost;
# ignore cache frontend
location ~* (service-worker\.js)$ {
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
expires off;
proxy_no_cache 1;
}
location / {
root /var/www/client; # 프론트엔드 빌드 파일명 client
try_files $uri $uri/ /index.html;
}
location /media/ {
proxy_pass http://api$request_uri;
proxy_set_header Host $http_host;
}
location /api/ {
proxy_pass http://api$request_uri;
proxy_read_timeout 300s;
}
access_log /var/log/nginx/80_access.log;
error_log /var/log/nginx/80_error.log;
location /media/ 를 추가했다.
나는 이미지를 장고 서버에서 관리하고 있었기 때문에, 이미지들이 전부 장고에 있었다.
코드를 보면, 똑같은 8000번 포트로 url을 넘겨주고 있다!
2. Django setting의 디버깅 설정
두 번째 해결방법은, 장고의 settings.py에서 DEBUG=True로 설정하는 것이었다!
실서버를 돌릴 때는 보통 DEBUG를 False로 설정한다.
왜냐면 대부분 자세한 에러 메시지를 숨기기 위해서이다.
다만... 백엔드 서버에서 이미지를 가져오기 위해서는 DEBUG 값을 True로 설정해야 했었다.
도대체 무슨 상관이지... 아 진심으로 원인 모르겠다.
그런데 내가 다른 설정 다 건들지 않고 DEBUG 설정만 차이를 뒀을 때,
분명 False에서는 404에러를 뱉어냈었다.
어차피 백엔드 서버가 메인으로 굴러가지는 않기 때문에
굳이 False로 하지 않아도 되긴 하지만.. 에러까지 뱉는 이유는 잘 모르겠다.
여튼, True로 설정하면 이미지 url이 잘 와서 이미지 로딩이 정상적으로 된다.
'Computer Science > Troubleshooting' 카테고리의 다른 글
[Docker, Shell] command "install/r" not found (0) | 2022.09.18 |
---|---|
[Gunicorn] gunicorn worker timeout (0) | 2022.09.09 |
[Docker-compose, MySQL] M1 환경에서 MySQL 이미지 이용하기 (0) | 2022.09.01 |
[MySQL, Django, Docker compose] MySQL ERROR 2002 (2) | 2022.08.30 |
[MySQL, Docker] MySQL ERROR 2002/2003/2005 (0) | 2022.08.28 |