当我将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:
我觉得问题就在这里:
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中,我看不出为什么)