NGINX在Dockered Django项目中找不到静态文件

时间:2019-03-07 23:08:09

标签: python django docker nginx gunicorn

我是使用Docker和Nginx的新手。我正在参加一个在本地工作的项目,其中包括纯平版纸和几个简单的应用程序,并将其与this guide to utilise Docker, NGINX and Gunicorn结合使用。

由于某种原因,它找不到我的静态文件,甚至找不到标准的Django admin静态文件。

控制台错误

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

Django Admin 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 Admin确实会找到 静态文件,但找不到其他文件。
  • 浏览应用程序Docker容器以手动查找文件。一世 无法找到它们或任何有效的模板。我找到这个 很奇怪。

请让我知道是否需要澄清或包含其他内容。在此先感谢您的帮助,非常感谢。

5 个答案:

答案 0 :(得分:0)

假设您的docker容器上的静态文件夹位于/ opt / services / djangoapp中,那么您的位置/ static配置仍应代理传递给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;
}

答案 1 :(得分:0)

据我了解,您需要在NGINX和Django文件夹之间同步静态卷。为此,您需要像这样更新Docker组成:

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

答案 2 :(得分:0)

首先,如果您使用nginx lika代理来提供静态文件,则必须将页面加载到端口80中,并且必须显示如何运行容器,在我的情况下,如果我像卷一样传递静态目录(container_path /静态),您仅需要将位置设置为container_path,因为nginx将在路径集中搜索静态目录,如下所示:

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

并记住运行collectstatic命令将静态文件收集到静态目录

答案 3 :(得分:0)

首先,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文件夹复制admin文件夹并将其粘贴到静态文件夹

最后,运行service nginx restart

答案 4 :(得分:0)

根据BASE_DIR变量,您的静态文件应与文件夹位于同一目录中,检查是否有collectstatic将“静态”先生放在您的服务器上,并配置nginx来定位它。