在生产服务器上部署Django

18

首先,我要明确的是我是一个Windows用户,对于网络世界非常陌生。在过去的几个月中,我一直在学习Python和Django,这对我来说是一次很棒的经历。现在,我已经创建了一个小项目,我希望将其部署到生产服务器上。由于Django有自己的内置开发服务器,所以对我来说没有问题。但是现在我必须将其部署到生产服务器上,我在Google上找到了Nginx + uWSGI或Nginx + Gunicorn作为最佳选择。由于uWSGI和Gunicorn与Windows不兼容,因此我认为我应该适应Ubuntu或其他Unix系统。

所以我的问题是:

  1. 为了明确起见,由于我必须使用上述之一,请解释一下为什么我需要两个服务器?
  2. 如果我必须适应Ubuntu环境,我是否必须学习Ubuntu shell脚本、SSH和其他内容?还是托管提供商将帮助我完成?
  3. 请让我知道还需要什么相关工具。

非常感谢您的时间,请原谅如果我的问题看起来很弱。希望能得到积极的回答。


你不需要使用两台服务器,可以在一台服务器上设置Nginx + uWSGI + apache2,并将所有内容正确配置以使它们协同工作。 Nginx和gunicorn几乎是相同的东西,你只需要使用其中之一。我正在使用Ubuntu,SSH集成在Ubuntu上,你不需要学习太多东西。 - drabo2005
@drabo2005 我理解这个问题是关于两个服务器进程而不是两台独立的机器;我同意没有必要使用两台独立的机器来服务nginx + 其他东西。但我不同意nginx和gunicorn是相同的软件或者处于同一类别的软件;nginx是反向代理和静态服务器,而gunicorn是专门用于wsgi应用程序的Web服务器。 - Andrew Gorcester
3个回答

15
  1. 一种典型的配置涉及两个服务器进程(可以在同一实际硬件或虚拟服务器上运行),以便位于前面的代理服务器可以缓冲慢客户端。例如:慢速客户端将连接到 nginx 并发送请求。Nginx 将请求传递给 Gunicorn,Gunicorn 将响应。然后,Nginx 将立即消耗 Gunicorn 的响应,立即释放 Gunicorn 资源。此时,慢速客户端可以随意使用时间来从 Nginx 消耗响应,而不会占用太多服务器资源。替代两个服务器进程模型的方法是使用具有 Gunicorn 的异步工作者并将 Gunicorn 本身放在前面,或者使用类似 Waitress 的异步-同步组合。但是,位于前面的 Nginx 具有作为现成静态服务器的额外好处。

    请注意,“慢客户端”可能描述:失去连接并使 TCP 套接字挂起直到超时中请求的移动电话;只是慢的移动电话;所有类型的不可靠连接;敌对的拒绝服务客户端试图故意使用服务器资源;有时任何由于任何原因而出现溃烂或故障的旧连接。因此,这是几乎影响任何站点的问题。

  2. 您不需要专门的 shell 脚本,但习惯于 Ubuntu 需要一些时间。甚至在脚本之外,还有很多东西要学习,例如如何使用包管理器,如何配置已安装的软件包以避免混淆未来的更新等。您肯定还必须学会使用 SSH;它是 *nix 世界中最基本的服务器管理工具之一。

    学习使用Ubuntu或其他服务器平台的另一种选择是使用像Heroku这样的平台即服务(PaaS)选项,因为PaaS托管提供商确实会为您处理所有这些事情。 我推荐这种方法。 话虽如此,尽管我认为无论技能水平如何,对于想要专注于开发而不是服务器管理的人来说,PaaS都是一个很好的选择,但也同样真实的是,略微了解Linux服务器平台会有助于您了解代码运行的环境。 因此,即使您选择PaaS,通过与Ubuntu进行一些微调(或大量调整),您仍将受益。

    PaaS的另一个好处是,通常他们的基础架构处理Nginx部分(通过代理缓冲慢请求)。例如,在Heroku上就是这种情况。 所以,您根本不必担心基础架构的这一部分。

  3. 这个问题的这一部分过于宽泛,但是如果需要澄清,请在评论中告诉我。


感谢您的详细解释。我对这两个问题真的很困惑。现在我想使用VPS并使用Putty进行SSH。还有一个问题,我如何更改已部署的文件?我听说过Fabric,但很难理解其背后的逻辑。您能否请再解释一下如何操作呢?再次感谢。 - Benjamin Smith Max
@Benjamin 最终你只需要将更新后的程序文件放到服务器上并重新启动Web服务器进程(或者让它重新加载你的代码)。fabric是一个可以使这个过程更容易的工具,所以如果它比你需要的更复杂,就不要使用它。通过putty使用scp或sftp也可以。任何其他方法,比如直接从服务器上使用git下载源代码仓库,也是可以的。 - Andrew Gorcester

3
我正在按照这篇教程进行操作:http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/。Nginx是我的代理服务器,用于将请求转发给运行在gunicorn上的Django应用程序,并提供静态文件服务;virtualenv用于管理Python环境;supervisor用于监控我的应用程序运行状态。如果您没有使用Postgresql,可能会遇到一些错误,请告知我,我会帮助解决(之前我使用的是MySQL,现在改用Postgresql)。

2
首先,如果您喜欢使用Windows系统,那么没有必要使用Ubuntu。我不知道nginx是否可以在Windows上运行,但是如果不能的话,我会非常惊讶(实际上,这里是nginx在Windows上安装的文档)。而Apache肯定可以在Windows上运行。Django文档有完整的解释,介绍如何设置Apache/mod_wsgi以提供Django服务。
您不需要两个服务器。我不确定为什么您认为需要两个服务器:通常的原因是将静态资源放在单独的服务器上,但是您没有提到这作为原因。由于您只谈论一个小站点,因此甚至不需要这样做。配置为同时提供Django和静态资源的一个服务器就足够了。同样,文档详细说明了如何操作。

1
谢谢你的回答。我在Google上搜索后发现,uWSGI/Gunicorn与nginx是最佳实践。因此,我考虑实现这两个并在这里提出了问题。 - Benjamin Smith Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接