使用gunicorn和nginx部署Django

这是一个广泛的问题,但我想得到一个规范的答案。我一直在尝试部署一个网站使用gunicorn和nginx在Django。阅读吨的教程后,我已经成功,但我不能确定我遵循的步骤是足够好,运行一个网站没有问题,或者也许有更好的方法来做。这种不确定性令人讨厌。

这就是为什么我正在寻找一个非常详细和解释好的答案为新手。我不想解释太多我知道什么和我不知道,因为这可能扭曲的答案有点,其他人可能受益于较少程度从你的答案。然而,我想看到的一些事情是:

>你看到什么“设置”最好的工作?我使用virtualenv并移动我的Django项目在这个环境中,但是我看到了另一个设置,其中有一个文件夹的虚拟环境和其他项目。
>我如何设置的方式允许几个网站托管在一个单一的服务器?
>为什么有些人建议使用gunicorn_django -b 0.0.0.0:8000和其他人建议gunicorn_django -b 127.0.0.1:8000?我测试了后者在Amazon EC2实例,但它没有工作,而前者工作没有问题。
> nginx配置文件的逻辑是什么?有很多教程使用完全不同的配置文件,我困惑在哪一个更好。例如,一些人使用别名/路径/到/ static /文件夹和其他根/路径/到/ static /文件夹。也许你可以共享你喜欢的配置文件。
>为什么我们在/ etc / nginx中在站点可用和站点启用之间创建一个符号链接?
>一些最佳做法一如既往欢迎:-)

谢谢

What “setup” have you seen work best? I used virtualenv and moved my
django project inside this environment, however I have seen another
setups where there is a folder for virtual environments and other for
projects.

virtualenv是一种隔离Python环境的方法;因此,它在部署时没有很大的部分,但是在开发和测试期间,如果不强烈推荐,这是一个要求。

您从virtualenv获得的值是它允许您确保为应用程序安装了正确的库版本。所以,你坚持虚拟环境本身无关紧要。只是确保你不包括它作为源代码版本控制系统的一部分。

文件系统布局并不重要。你会看到许多文章颂扬目录布局的优点,甚至骨架项目,你可以克隆作为起点。我觉得这更多的是个人喜好而不是硬要求。当然它很好有;但除非你知道为什么,它不会为您的部署过程添加任何价值 – 所以不要这样做,因为一些博客推荐它,除非它对您的场景有意义。例如 – 如果您没有作为部署工作流的一部分的私有PyPi服务器,则无需创建setup.py文件。

How can I setup things in a way that allows several sites to be hosted
in a single server?

您需要执行多个网站设置有两件事:

>正在侦听端口80和/或端口443上的公共IP的服务器(如果您有SSL)。
>一堆运行实际django源代码的“进程”。

人们使用nginx的#1,因为它是一个非常快的代理,它不会带来像Apache这样的综合服务器的开销。你可以自由使用Apache,如果你很舒服。没有要求“多个网站,使用nginx”;你只需要一个正在侦听该端口的服务,知道如何重定向(代理)到运行实际django代码的进程。

对于#2,有几种方法来启动这些进程。 gevent / uwsgi是最受欢迎的。唯一要记住的是不要在生产中使用runserver。

这是绝对的最低要求。通常人们添加一些进程管理器来控制所有“django服务器”(#2)运行。在这里你会看到upstartsupervisor提到。我喜欢主管,因为它不需要接管整个系统(不像upstart)。但是,这不是一个严格的要求。你可以完美地运行一堆screen会话和解决他们。缺点是,如果你的服务器重新启动,你将不得不重新启动屏幕会话。

个人我会推荐:

> Nginx for#1
>在uwsgi和gunicorn之间选择 – 我使用uwsgi。
> supervisor用于管理后端进程。
>您托管的每个应用程序的个人系统帐户(用户)。

我推荐#4的原因是隔离权限;再次,不是一个要求。

Why some people suggest using gunicorn_django -b 0.0.0.0:8000 and
others suggest gunicorn_django -b 127.0.0.1:8000? I tested the latter
in an Amazon EC2 instance but it didn’t work while the former worked
without problem.

0.0.0.0表示“所有IP地址” – 其元地址(即占位符地址)。 127.0.0.1是始终指向本地机器的保留地址。这就是为什么它叫“localhost”。它只能到达在同一系统上运行的进程。

通常,您有前端服务器(上面的列表中的#1)侦听公共IP地址。您应该将服务器显式绑定到一个IP地址。

然而,如果由于某种原因你在DHCP或你不知道什么是IP地址(例如,它是一个新配置的系统),你可以告诉nginx / apache /任何其他进程绑定到0.0.0.0。这应该是一个临时的停止措施。

对于生产服务器,您将拥有一个静态IP。如果您有动态IP(DHCP),那么您可以留在0.0.0.0。这是非常罕见的,你会有DHCP为您的生产机器。

在生产中不建议将gunicorn / uwsgi绑定到此地址。如果你绑定你的后端进程(gunicorn / uwsgi)到0.0.0.0,它可能变得可以“直接”访问,绕过你的前端代理(nginx / apache / etc);有人可以只请求http://your.public.ip.address:9000 /并直接访问你的应用程序,特别是如果你的前端服务器(nginx)和你的后端进程(django / uwsgi / gevent)运行在同一个机。

你可以自由地做,如果你不想有运行前端代理服务器的麻烦虽然。

What is the logic behind the config file of nginx? There are so many
tutorials using drastically different configuration files that I’m
confused on which one is better. For example, some people use “alias
/path/to/static/folder” and others “root /path/to/static/folder”.
Maybe you can share your preferred configuration file.

首先你应该知道的关于nginx的是,它不是一个web服务器像Apache或IIS。它是一个代理。因此,您将看到不同的术语,如’上游’/’下游’和多个“服务器”被定义。花一些时间,并通过nginx手册第一。

有很多不同的方法来设置nginx;但这里是一个答案你的问题对别名对根。 root是一个显式指令,用于绑定nginx的文档根目录(“主目录”)。这是当您提出请求时没有像http://www.example.com/这样的路径时会查看的目录

别名意味着“将名称映射到目录”。别名目录可能不是文档根目录的子目录。

Why do we create a symlink between site-available and sites-enabled in
/etc/nginx?

这是debian独有的(和像debian一样的系统像ubuntu)。 sites-available列出系统上所有虚拟主机/站点的配置文件。从站点启用到站点的符号链接可用于“激活”该站点或虚拟主机。它是一种分离配置文件并轻松启用/禁用主机的方法。

http://stackoverflow.com/questions/13004484/deploying-django-with-gunicorn-and-nginx

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:使用gunicorn和nginx部署Django