NGINX не находит статические файлы в проекте Dockered Django - PullRequest
1 голос
/ 08 марта 2019

Я новичок в использовании Docker и Nginx.Я беру проект, который у меня работает локально, который включает в себя плоские страницы и пару простых приложений, и объединяет его с этим руководством, чтобы использовать Docker, NGINX и Gunicorn .

По некоторым причинам, этоне могу найти мои статические файлы или даже стандартные статические файлы администратора Django.

Ошибка консоли

GET http://0.0.0.0:8000/static/flatpages/CSS/flatpages.css 
net::ERR_ABORTED 404 (Not Found)

Администратор Django Django Admin

local.conf

upstream hello_server {
    server djangoapp:8000;
}

server {

    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://hello_server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        autoindex on;
        alias /opt/services/djangoapp/static/;
    }

    location /media/ {
        alias /opt/services/djangoapp/media/;
    }
}

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 
    "static"),
    '/static/flatpages/',
]  

Среди многих другихвещи, которые я до сих пор пробовал:

  • Использование STATIC_ROOT и STATICFILES_DIRS
    • Насколько я понимаю из документации Django, со статическими файлами в
      нескольких местах мне нужно использовать STATICFILES_DIRS
    • Если я использую STATIC_ROOT и собираю статические данные, администратор Django находит статические файлы, но не находит других.
  • Перемещение по контейнеру приложений в Docker для поиска файловвручную.Я не могу найти их или любой из шаблонов, которые работают.Я нахожу это очень странным.

Пожалуйста, дайте мне знать, если мне нужно уточнить или включить что-нибудь еще.Заранее спасибо за любую помощь, это очень ценится.

Ответы [ 5 ]

0 голосов
/ 02 июля 2019

Ваш статический файл должен находиться в том же каталоге, что и ваша папка, в соответствии с вашей переменной BASE_DIR, проверьте, где collectstatic помещает "static" sir на ваш сервер, и настройте nginx для его обнаружения.

0 голосов
/ 10 марта 2019

Первый sudo nano /etc/nginx/sites-available/default

server {
    listen 80;
    server_name your_ip:8000 www.your_ip:8000;

    root /var/www/html;

     location / {
             proxy_pass http://your_ip:8000;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_set_header X-NginX-Proxy true;

    }

    location /static/admin {
             alias  /path/to/static/admin/;
}
    location /static/ {
             alias  /path/to/static/;
}


   location /media/ {
    autoindex on;
    alias /path/to/media/; 
     }    
}

В settings.py STATIC_ROOT = os.path.join (BASE_DIR, 'static_root')

затем выполните команду collectstatic

скопировать папку администратора из папки static_root и вставить ее в статическую папку

Наконец, запустите service nginx restart

0 голосов
/ 08 марта 2019

Как я понимаю, вам нужно синхронизировать статический том между папками NGINX и Django.Для этого вам нужно обновить ваш докер составить так:

version: '3'

services:

  djangoapp:
    build: .
    volumes:
      - .:/opt/services/djangoapp/src
    networks: 
      - nginx_network

  nginx:
    image: nginx:1.13
    ports:
      - 8000:80
    volumes:
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - ./static:/opt/services/djangoapp/static/  # Syncing your current static directory to the Docker
    depends_on:
      - djangoapp
    networks: 
      - nginx_network

networks: 
  nginx_network:
    driver: bridge
0 голосов
/ 08 марта 2019

сначала, если вы используете nginx или прокси для обслуживания статических файлов. Вы должны загрузить страницу в порт 80, и вы должны показать, как запустить контейнер, в моих случаях, если я передам статический каталог как том (container_path / static), вам нужно только установить location для container_path, потому что nginx будет искать статический каталог в наборе путей, что-то вроде этого:

location /static/ {
        root /opt/services/djangoapp;
    }

и запомните команду collectstatic для сбора статических файлов в статический каталог

0 голосов
/ 08 марта 2019

Если в вашем докер-контейнере находится статическая папка в / opt / services / djangoapp, то ваша конфигурация местоположения / статическая конфигурация все равно должна передавать прокси на сервер django:

location /static/ {
    alias /opt/services/djangoapp/static/;

    proxy_pass http://hello_server;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_redirect default;
}
...