当前位置: 首页 > 知识库问答 >
问题:

Nginx无法在digital ocean上提供django静态或媒体文件

沈乐邦
2023-03-14

当我将dockerised django应用程序部署到digital ocean时,我在提供静态文件和媒体文件方面遇到问题。我在这里读过很多类似的问题,但到目前为止,没有一个答案对我有效。

大致按照这个指南,,https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/#nginx,我现在的状态是,我可以使用以下命令在本地启动docker容器,并让nginx完美地服务于静态/媒体文件:

sudo docker-compose -f docker-compose-prod.yml down -v
sudo docker-compose -f docker-compose-prod.yml up -d --build
sudo docker-compose -f docker-compose-prod.yml exec web python manage.py collectstatic --no-input --clear

我现在正试图在数字海洋水滴上得到同样的结果。在远程服务器上,我运行与上面完全相同的命令启动服务。除了访问任何静态或媒体文件的能力之外,一切都按预期工作。例如,每当我访问{我的数字海洋ip}/静态/管理/css/nav_sidebar.css时,我都会遇到404错误。每当我看到chrome试图获取我的自定义css时,请求就显示为“已取消”(然后如果我访问已取消请求的网址路径,我会看到同样的404)。

我的代码可以在这里看到:https://github.com/PaulGilmartin/personal_website可能与本讨论相关的部分:

nginx。形态

upstream personal_website {
    server web:8000;
}

server {

    listen 80;

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

    location /static/ {
        alias /var/www/personal_website/static/;
    }

    location /media/ {
        alias /var/www/personal_website/media/;
    }

}

settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

我特别困惑的是,完全相同的命令在本地完全工作。这让我认为远程服务器上的404s是一种基于权限的症状,但我不认为这是怎么回事,因为在我的Dockerfile.prod我小心翼翼地把一切都交给非root用户。

任何帮助都将不胜感激,因为我对这个问题的想法越来越少了!

编辑:这是我的docker撰写文件:

version: '3.7'


services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.prod
    command: gunicorn personal_website.wsgi:application --bind 0.0.0.0:8000 --timeout 120
    volumes:
      - static_volume:/var/www/personal_website/static
      - media_volume:/var/www/personal_website/media
    env_file:
      - ./.env.prod
    expose:
      - 8000
    ports:
      - "80:8000"
    depends_on:
      - db
  db:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/var/www/personal_website/static
      - media_volume:/var/www/personal_website/media
    ports:
      - 1337:80
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:
  media_volume:

共有1个答案

杨志强
2023-03-14

我觉得问题就在这里:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

此路径实际上应该与nginx相同:

/var/www/personal_website/static/

因此,您可以尝试以下方法:

>

  • 尝试在Django设置中硬编码静态根:

    STATIC_ROOT='/var/www/personal_website/静态/'

    Do bash进入Django运行的容器:docker exec-it

    还要检查nginx容器内部是否也看到了包含静态文件的正确卷

    我有相当相同的问题和硬编码路径静态和媒体解决了这个问题

    更新:我已经克隆了这个项目,对我来说,它没有拾取静态文件。所以我在docker-compose-prod.yml做了以下改变,它变得有效了:

    >

    ports:
       - "80:8000"
    

    不需要它,因为web(Django)不应该从外部访问。仅在暴露端口8000上的Docker内部

    将nginx的开放端口设置为80:

    ports:
       - 80:80
    

    我不知道DigitalOcean使用哪个端口来承载站点,但默认值是80。

  •  类似资料:
    • 问题内容: 这是我的项目文件夹 这是我index.js中的静态文件配置 这是我的index.html 这是我的nginx配置 但是我在所有脚本上都得到404。另一个奇怪的是,这些文件上的mime-type设置为 我在这里做错了什么? 我有一个项目,该项目具有相同的项目结构,并且具有相同的配置,但它适用于此项目,在这种情况下不起作用。 问题答案: 您无需配置Nginx 和 Express即可提供静态

    • 问题内容: 我正在为Django使用apache + mod_wsgi。 并且所有css / js / images都通过提供。 出于某种奇怪的原因,当其他人/朋友/同事尝试访问该网站时,jquery / css不会为他们加载,因此页面看上去很混乱。 我的html文件使用这样的代码- 我的nginx配置是这样的 有一个目录,其中有相应的&目录。 奇怪的是,当我访问它们时页面显示正常。 我已经清除了

    • 我一直在处理将一个站点从Apache迁移到Nginx的过程,我快要失去理智了。虚拟主机不想提供静态资源(css、js等),我似乎不知道为什么。服务器块看起来像这样: 我错过了什么?我知道这是因为我对Nginx缺乏经验,但任何建议都将不胜感激。 谢谢 更新 这似乎与我以前遇到麻烦的化名有关。如果我将我的文档根指向别名位置(),并尝试呈现没有别名的静态内容,它会呈现良好的效果。一旦我在网址中输入别名.

    • 问题内容: 我正在使用,我的django应用的结构如下 的是 在我尝试使用它为: 但是它没有加载并给出错误 我跑去收集所有静态文件。 为什么要加载CSS文件?是否缺少任何配置? 请提出建议。 问题答案: 根据文档正确的方式来加载静态文件是 这会工作

    • 问题内容: 我是新手,并且已经学习了很多天,我已经开始使用django建立一个小型网站,并尝试通过在文件中安排所有必要的设置来提供文件。但不幸的是,我的代码无法提供CSS文件,我的意思是提供CSS文件的概念无法正常工作。我在Google上搜索了很多东西,并浏览了django主要文档教程,并根据它们进行了更改,但仍然无法正常工作,因此将我的整个代码粘贴到了下面 项目文件夹的结构 我的一些settin

    • 我不能通过nGinx提供静态文件,而是得到404。我可以看到错误(如error.log所示),我只是不知道如何修复它。 网址。派克 settings.py (收集了一个静态文件,所有静态文件现在都在“staticfiles/”中) nginx配置 基础html 这是日志 错误日志 (静态/添加在静态url中,我看不出为什么)