Nginx не обслуживает статические файлы и файлы, загруженные пользователем, в Django Kubernetes
Здравствуйте, я работаю на kubernetes и не могу получить статические файлы или документы пользователя. Это работает за nginx ingress все запросы и django работает как ожидалось. Но не могу понять, почему изображения и другие документы не могут быть получены по url. Приложение устанавливается с помощью helm charts и функциональность кажется нормальной, кроме обслуживания файлов.
FROM python:3.8.12-alpine3.15
ADD ./requirements.txt /app/requirements.txt
RUN set -ex \
&& apk add --no-cache --virtual .build-deps postgresql-dev build-base linux-headers jpeg-dev zlib-dev\
&& python -m venv /env \
&& /env/bin/pip install --upgrade pip \
&& /env/bin/pip install --no-cache-dir -r /app/requirements.txt \
&& runDeps="$(scanelf --needed --nobanner --recursive /env \
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
| sort -u \
| xargs -r apk info --installed \
| sort -u)" \
&& apk add --virtual rundeps $runDeps \
&& apk del .build-deps
ADD ./ /app
WORKDIR /app
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
RUN apk add nginx
RUN rm /etc/nginx/http.d/default.conf
COPY helm/nginx.conf /etc/nginx/nginx.conf
ENTRYPOINT ["sh", "helm/run.sh"]
run.sh
nginx -g 'daemon on;'
gunicorn main_app.wsgi:application --bind 0.0.0.0:8080 --workers 3
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
# default_type application/octet-stream;
access_log /var/log/nginx/access.log;
upstream django {
server 0.0.0.0:8080;
}
server {
include /etc/nginx/mime.types;
listen 8000;
location /static {
autoindex on;
alias /app/static/;
}
location / {
proxy_pass http://django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /uploads{
autoindex on;
alias /app/uploads/;
}
# location ~* ^/[^/]+\.(?:gif|jpg|jpeg|pdf)$ {
# root /app/;
# try_files $uri =404;;;;
# }
}
}
Файл настроек Django выглядит следующим образом:
STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = '/static/'
# media folder setting
MEDIA_URL = '/uploads/'
MEDIA_ROOT = BASE_DIR / 'uploads'
Если я перехожу на /admin url файлы обслуживаются, но я получаю эту ошибку в js файле:
Uncaught SyntaxError: Unexpected token '<'
Чтобы разобраться в этом, нужно было проделать чертовски большую работу. Следующие изменения в nginx.conf сработали.
location your_ingresspath_here/static {
autoindex on;
alias /app/static/;
}