Docker nginx django gunicorn не обслуживает статические файлы в продакшене
Пытаюсь развернуть сайт с помощью nginx + gunicorn + docker + django. Но ngingx не обслуживает статические файлы. Ниже приведены конфигурации:
Структура проекта Django
файл настроек production.py
STATIC_URL = "/static/"
"""STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)"""
STATIC_ROOT = "/app/forex/static/admin/"
Файл докера для nginx
FROM nginx:1.19.0
COPY ./default.conf /etc/nginx/conf.d/default.conf
конфигурацииnginx
upstream django {
server website:8000;
}
server {
listen 80;
client_max_body_size 100M;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
proxy_pass http://django;
}
location /media/ {
alias /app/media/;
}
location /static/ {
alias /app/forex/static/admin/;
}
}
Докерный файл Gunicorn
FROM python:3
ADD requirements.txt /app/requirements.txt
ADD . /app
WORKDIR /app
EXPOSE 8000:8000
RUN pip install --upgrade pip && pip install -r /app/requirements.txt
RUN python manage.py collectstatic --no-input --settings=forex.settings.production
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "forex.wsgi:application", "DJANGO_SETTINGS_MODULE=forex.settings.production"]
docker-compose.yml
services:
website:
build:
context: .
dockerfile: Dockerfile.app
env_file:
- env
container_name: website_container_8
nginx:
build: ./nginx
volumes:
- static:/app/forex/static/admin/
ports:
- "80:80"
depends_on:
- website
volumes:
static:
ПЕРЕД контейнером nginx, он не копирует статические файлы.
Что мне нужно изменить, чтобы это заработало?
Вы можете решить, как хранить статические файлы в продакшене. Например, Amazon S3 или CloudFront. Первое, что нужно сделать, это создать аккаунт в Amazon Web Services, затем перейти в службу хранения S3 и создать новый bucket, позже вы развернете активы в этом bucket.
После всех настроек измените файл settings.py:
settings.py
AWS_ACCESS_KEY_ID = '****'
AWS_SECRET_ACCESS_KEY = '****'
AWS_STORAGE_BUCKET_NAME = '****'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'yoursite/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
Наконец, выполните:
python manage.py collectstatic
Вы можете изменить файл nginx.conf. Например:
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 1024;
epoll_events 512;
accept_mutex on;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream django {
server web:8000;
}
server {
listen 80;
listen [::]:80;
server_tokens off;
client_max_body_size 20m;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl ;
listen [::]:443 ssl;
server_name example.com www.example.com;
root /app/static/;
charset utf-8;
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_http_version 1.1;
proxy_redirect off;
proxy_pass http://django;
}
Последнее, вам следует пересмотреть dockerfile и удалить python manage.py collectstatic.
Ваши файлы находятся в контейнере вашего сайта, вам нужно поделиться ими с контейнером nginx:
services:
website:
build:
context: .
dockerfile: Dockerfile.app
env_file:
- env
container_name: website_container_8
volumes:
- static:/app/forex/static/admin/ #<-- you want to share this
nginx:
build: ./nginx
volumes:
- static:/app/forex/static/admin/ #<-- with this folder
ports:
- "80:80"
depends_on:
- website
volumes:
static: #<-- you can do it through this