使用 Docker、nginx 和 gunicorn 提供 Django 静态文件
Posted
技术标签:
【中文标题】使用 Docker、nginx 和 gunicorn 提供 Django 静态文件【英文标题】:serving Django static files with Docker, nginx and gunicorn 【发布时间】:2018-11-14 02:17:40 【问题描述】:我正在为我们设置一个带有Docker
、nginx
和gunicorn
的Django 2.0
应用程序。
它正在运行服务器,但静态文件不起作用。
这是settings.py
的内容
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_my_project')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'static_root')
在开发过程中,我将静态文件放在 static_my_project
中,运行时 collectstatic
复制到 static_cdn/static_root
目录结构是这样的
app
|- myapp
|- settings.py
|- static_my_project
|- static_cdn
|- static_root
|- config
|- nginx
|- nginx.conf
|- manage.py
|- Docker
|- docker-compose.yml
正在运行
docker-compose up --build
在运行collectstatic
时,它会给出将复制静态文件的路径
koober-dev | --: 运行 collectstatic 库伯开发 | 库伯开发 |您已请求在目的地收集静态文件 我的应用开发 |设置中指定的位置: 我的应用开发 | 我的应用开发 | /app/static_cdn/static_root 我的应用开发 | 我的应用开发 |这将覆盖现有文件! 我的应用开发 |您确定要这样做吗? 我的应用开发 | 我的应用开发 |输入“yes”继续,或输入“no”取消: 我的应用开发 | 0 个静态文件复制到“/app/static_cdn/static_root”,210 个未修改。
config/nginx/nginx.conf 文件包含以下设置
upstream web
ip_hash;
server web:9010;
server
location /static
autoindex on;
alias /static/;
location /
proxy_pass http://web;
listen 10080;
server_name localhost;
docker-compose.yml
version: '3'
services:
nginx:
image: nginx:latest
container_name: "koober-nginx"
ports:
- "10080:80"
- "10443:43"
volumes:
- .:/app
- ./config/nginx:/etc/nginx/conf.d
- ./static_cdn/static_root/:/static
depends_on:
- web
web:
build: .
container_name: "koober-dev"
command: ./start.sh
volumes:
- .:/app
- ./static_cdn/static_root/:/app/static_cdn/static_root
ports:
- "9010:9010"
depends_on:
- db
db:
image: postgres
container_name: "koober-postgres-db"
Dockerfile
FROM ubuntu:18.04
# -- Install Pipenv:
FROM python:3
ENV PYTHONUNBUFFERED 1
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
# -- Install Application into container:
RUN set -ex && mkdir /app
WORKDIR /app
ADD requirements.txt /app/
RUN pip install -r requirements.txt
# -- Adding dependencies:
ADD . /app/
但它没有加载静态文件。
【问题讨论】:
我认为你颠倒了你的 nginx 配置中的东西。该位置应该是浏览器期望找到的地方,而别名应该是实际的文件系统位置。 即使在反转它时也不起作用 你试过了吗:location /app/static_cdn/static_root autoindex on; alias /app/static_cdn/static_root;
也试过了。顺便说一句,它在控制台myapp-dev | Not Found: /static/theme/css/custom.css
你能澄清一下这句话是什么意思吗? “在开发过程中,我将静态文件放在 static_my_project 中,它在运行 collectstatic 时将副本复制到 static_cdn/static_root”
【参考方案1】:
您需要有一个到STATIC_ROOT
目录的共享卷,以便您的nginx
container 可以反向代理到Web 服务器和您的Web 服务器生成的静态文件。
在docker-compose.yml
:
services:
nginx:
image: nginx:alpine
volumes:
- ./static_cdn/static_root/:/static
ports:
- 80:80
web:
build: .
volumes:
- ./static_cdn/static_root/:/app/static_cdn/static_root
现在在你的 nginx.conf 添加:
location /static/
alias /static/;
【讨论】:
用docker-compose.yml
更新的问题没有给出错误Mounts denied: The path /static is not shared from OS X and is not known to Docker
您尚未添加 docker 可访问的 /static 路径。你可以用 [***.com/questions/45122459/….此外,您不应将完整的源代码挂载到两个容器。只需挂载需要在容器之间共享的部分。在您的示例中,只有 STATIC_ROOT
需要在 nginx 和 Web 容器之间共享。在答案中编辑了安装路径。
static_cdn
目录位于application
目录中,该目录位于user
目录中,user
已存在于Docker
可共享路径中。我尝试了您的更改,但仍然没有成功。这次它没有给Mount denied
,但是在访问该网站时,它给出了文件未找到并且只显示文本
您是否在启动容器后运行python manage.py collectstatic --noinput
?您的安装路径,即 app/static_cdn/static_root
应该包含您尝试使用 nginx
提供的静态文件
我试过了,它对我有用。看一看。 gitlab.com/pranavagg/django-docker-sample以上是关于使用 Docker、nginx 和 gunicorn 提供 Django 静态文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Nginx 和 Docker 部署 React 和 Django