【问题标题】:django + uwsgi in dockerdocker中的django + uwsgi
【发布时间】:2017-12-07 10:28:55
【问题描述】:

在 Docker 中部署 Django 应用程序的最佳方式是什么。我查看了几个博客,似乎在大多数示例中,每个人都试图将 nginx + django + uwsgi 放在一个容器中。

但是容器应该只有一个进程。所以我在一个容器中尝试 django 和 uswgi,而 nginx 在另一个容器中或主机本身上。

可以请一些建议我最好的方法。

P.S:- 我的 django 应用程序只是为我提供 REST API 结果。而且我没有将 Django 模板用于我的静态内容。

我也在寻找使用 https 启用所有这些功能。 如果有人已经实现了类似的 django 应用托管方式,请分享博客或 github 链接。

【问题讨论】:

标签: django docker nginx uwsgi


【解决方案1】:

大多数 NGINX+uWSGI 设置之间的桥接点是 uwsgi UNIX 套接字。 这作为文件系统上的文件公开。 (你也可以使用 WSGI over TCP 套接字)

如果要运行两个容器,它们都需要查看包含此套接字的文件系统或网络。

在普通 docker 中,您可以将相同的卷或主机目录绑定挂载到两个容器中以完成您所说的。 uWSGI会在这个路径下创建socket,NGINX会通过这个socket与uWSGI服务器通信:

docker run -v /app/uwsgi/:/app/uwsgi/ my-uwsgi-server-image --socket /app/uwsgi/uwsgi.sock
docker run -v /app/uwsgi/:/app/uwsgi/ nginx
  # your nginx config should set the django upstream to use "/app/uwsgi/uwsgi.sock"

在 kubernetes 中,您可以使用 Volumes 和 VolumeMounts 在单个 Pod 中使用多个容器完成相同的操作。

【讨论】:

  • 套接字不需要是文件。定义地址和/或端口允许在不依赖共享卷的情况下分离 Nginx + uwsgi。是的,网络开销的开销很小,但几乎可以肯定的是,它不需要容器在同一主机/pod 中运行所获得的灵活性。
  • 谢谢詹姆斯——我已经更新了答案,说明你可以通过 TCP 使用 WSGI。
【解决方案2】:

看起来像旧线程,但也许有人会找到答案来解决他/她的问题。

如果您不使用任何静态内容服务或出于不同的特定原因需要它,则您实际上并不需要 nginx 服务。

uwsgi 可以作为简单的 http 服务器。

请参阅文档:https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html

来自我的Dockerfile 的 CMD 命令示例:

CMD ["uwsgi", "--http-socket", ":8000", "--py-autoreload", "1", "--module", "app.wsgi:application"]

查看更简单的命令:

uwsgi --http-socket :8000 --py-autoreload 1 --module app.wsgi:application

以上配置仅用于本地开发。

在将其应用到您的项目之前,先采用它以满足您的环境要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2017-03-08
    • 2014-05-31
    • 2013-10-05
    • 2012-01-20
    • 1970-01-01
    • 2011-04-16
    • 2011-10-10
    相关资源
    最近更新 更多