【问题标题】:Deploying django in a production server在生产服务器中部署 django
【发布时间】:2013-12-11 04:58:52
【问题描述】:

首先请让我明确一点,我是一个 Windows 用户,对网络世界很陌生。在过去的几个月里,我一直在学习 python 和 django,这对我来说是一次很棒的经历。现在我以某种方式创建了一个小项目,我想将其部署在生产服务器中。由于 django 有其内置的开发服务器,所以对我来说没有问题。但是现在我必须将它部署到生产服务器上,我搜索了一下,发现 Nginx + uWSGI 或 Nginx + Gunicorn 是它的最佳选择。并且由于uWSGI和Gunicord与Windows不兼容,我觉得应该适配Ubuntu或者其他Unix系统。

所以我的问题是:

  1. 为了清楚起见,由于我必须使用上述其中之一,请向我解释为什么我需要两台服务器?
  2. 如果我必须适应 Ubuntu 环境,我是否必须学习 Ubuntu shell 脚本、SSH 和其他东西?或者托管服务提供商会帮助我这样做吗?
  3. 请让我知道我还需要什么来解决上述问题。

非常感谢您抽出宝贵时间,如果我的问题是一个蹩脚的问题,请原谅。希望得到积极的回应。

【问题讨论】:

  • 你不必使用两台服务器,你可以在一台服务器上设置 Nginx + uWSGI + apache2 ,并且配置好所有东西一起工作,Nginx 和 gunicorn 几乎是一样的东西,你只需要使用其中之一。我正在使用 ubuntu,没关系,SSH 与 ubuntu 集成,你不需要为此学习大事
  • @drabo2005 我将问题解释为两个服务器进程而不是两个单独的机器;我同意没有迫切需要使用两台单独的机器来服务 nginx + 其他东西。我不同意 nginx 和 gunicorn 是一回事,甚至属于同一类软件; nginx 是一个反向代理和静态服务器,gunicorn 是一个专用的 wsgi 应用程序网络服务器。

标签: django web-deployment uwsgi gunicorn django-deployment


【解决方案1】:
  1. 典型的配置涉及两个服务器进程(它们可以一起运行在同一个实际硬件或虚拟服务器上),以便前面的代理服务器可以缓冲慢速客户端。例如:一个慢客户端将通过请求连接到 nginx。 Nginx 会将请求传递给 Gunicorn,Gunicorn 会做出响应。然后 Nginx 将立即消耗 Gunicorn 响应,立即释放 Gunicorn 资源。此时,慢速客户端可以花费尽可能多的时间来消耗来自 Nginx 的响应,而不会占用服务器资源。两个服务器进程模型的替代方案是使用带有 Gunicorn 的异步工作者并将 Gunicorn 本身放在前面,或者使用像 Waitress 这样的异步同步组合。不过,前面的 Nginx 有一个额外的好处,即可以兼作即用型静态服务器。

    请注意,“慢客户端”可以描述为:手机失去连接并保持 TCP 套接字挂起,直到请求中途超时;只是速度慢的手机;所有类型的不可靠连接;故意尝试使用服务器资源的恶意拒绝服务客户端;有时任何因任何原因出现打嗝或故障的旧连接。所以这是一个几乎会影响任何网站的问题。

  2. 您本身不需要 shell 脚本,但习惯 Ubuntu 需要一些时间。即使在脚本之外,还有很多东西要学习,比如如何使用包管理器,如何在安装包后配置包,不会混淆未来的更新等等。你肯定必须学习使用 SSH ;它是 *nix 世界中最基本的服务器管理工​​具之一。

    学习使用 Ubuntu 或其他服务器平台的另一种选择是使用像 Heroku 这样的平台即服务选项,因为 PaaS 托管服务提供商确实会为您处理所有这些事情。我推荐这种方法。话虽如此,尽管我认为 PaaS 对于那些想要专注于开发而不是服务器管理员的人来说是一个不错的选择,无论他们的技能水平如何,但对 Linux 服务器平台的一点经验也确实有很长的路要走帮助您了解代码运行的环境。因此,即使您使用 PaaS,您仍然可以从对 Ubuntu 进行一些(或很多)修补中受益。

    PaaS 的另一个好处是,他们的基础设施通常会处理 Nginx 部分的交易(通过代理缓冲慢速请求)。例如,Heroku 就是这种情况。因此,您根本不必担心基础架构的那一部分。

  3. 这部分问题过于宽泛,无法回答,但如果您需要澄清,请在 cmets 中告诉我。

【讨论】:

  • 感谢您的详细解释。真的很纠结这两个。现在我想我会使用 vps 并使用 putty 进行 ssh。还有一件事,如何更改已部署的文件?我听说过fabric,但很难理解它背后的逻辑。你能解释一下如何做到这一点吗?再次感谢。
  • @Benjamin 最终,您只需要在服务器上获取更新的程序文件并重新启动 Web 服务器进程(或者让它重新加载您的代码)。 fabric 是一种使这更容易的工具,所以如果它比您需要的更复杂,请不要使用它。通过腻子的 scp 或 sftp 很好。任何其他方法,例如使用 git 从服务器直接从您的源代码存储库下载也是公平的游戏。
【解决方案2】:

首先,如果您对 Windows 更满意,则无需使用 Ubuntu。我不知道 nginx 是否可以在 Windows 上运行,但如果不能,我会感到非常惊讶(事实上,here 是用于在 Windows 上安装的 nginx 文档)。与此同时,Apache 确实可以在 Windows 上运行。 Django 文档有 a full explanation 说明如何设置 Apache/mod_wsgi 来为 Django 服务。

您不需要两台服务器。我不确定你为什么认为你这样做:通常的原因是在单独的服务器上拥有静态资产,但你没有提到这是一个原因。但是,由于您只是在谈论一个小型站点,因此您甚至不需要这样做。一台配置为同时为 Django 和静态资产提供服务的服务器就可以了。同样,文档准确地解释了如何做到这一点。

【讨论】:

  • 感谢您的回答。当我四处搜索时,我发现带有 nginx 的 uWSGI/Gunicorn 是最佳实践。所以,我考虑实现这两个并在这里提出问题。
【解决方案3】:

我正在做这件事,就像在本教程中一样:http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
Nginx 是我在 gunicorn 上运行的 django 应用程序的代理及其服务静态,我的 python 环境的 virtualenv,监视我的应用程序运行的主管。
如果不使用 Postgresql 可能会出现一些错误,请问我会帮忙(过去使用 MySQL 现在是 Postgresql)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2012-01-13
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多