部署姜戈与枪角兽和 nginx

这是一个宽泛的问题,但我希望得到一个规范的答案。我一直在尝试使用 枪角兽Nginx姜戈中部署一个站点。在阅读了大量的教程之后,我已经取得了成功,但我不能确定我所遵循的步骤是否足够好,可以毫无问题地运行一个网站,或者也许有更好的方法来做到这一点。这种不确定性令人恼火。

这就是为什么我正在寻找一个非常详细和解释清楚的新手的答案。我不想解释太多我所知道的和我不知道的,因为这可能会使答案有一点偏差,而其他人可能从你的答案中获得较小程度的好处。不过,我希望看到提到的一些事情是:

  • 你认为什么样的“安排”效果最好?我使用了 虚拟世界并将我的 姜戈项目移动到了这个环境中,但是我看到了另一个设置,其中有一个用于虚拟环境的文件夹和其他用于项目的文件夹。

  • 如何设置允许多个站点驻留在单个服务器上的方式?

  • 为什么有人建议使用 gunicorn_django -b 0.0.0.0:8000而有人建议使用 gunicorn_django -b 127.0.0.1:8000?我在 AmazonEC2实例中测试了后者,但是前者没有问题,而后者却没有问题。

  • Nginx 配置文件背后的逻辑是什么?有如此多的教程使用完全不同的配置文件,以至于我不知道哪一个更好。例如,有些人使用 alias /path/to/static/folder,有些人使用 root /path/to/static/folder。也许您可以共享您的首选配置文件。

  • 为什么我们要在 /etc/nginx中创建 site-availablesites-enabled之间的符号链接?

  • 一些最佳做法一如既往地受到欢迎: -)

谢谢

17121 次浏览

我不是一个部署专家,但是我会和 gevent 分享我部署 Django 的一些实践(但是应该类似于 gunicorn)。

virtualenv是伟大的原因,我不会进入。然而,我发现 virtualenv-wrapper(医生)非常有用,特别是当您正在从事许多项目时,因为它允许在不同的 Virtual alenv 之间轻松切换。这并不适用于部署环境,但是当我需要使用 SSH 在服务器上进行故障排除时,我发现这非常有用。使用它的另一个优点是,它管理的是 viralenv 目录,因此手动工作较少。Virtualenvs 应该是一次性的,这样万一您遇到版本问题或者其他安装问题,您可以直接转储 env 并创建一个新的 env。因此,最好的做法是不要将任何项目代码包含在 viralenv 中。它应该保持独立。

至于建立多个站点,virtualenv基本上就是答案。对于每个项目,您应该有一个单独的 virutalenv。仅仅这一点就可以解决很多问题。然后,当您部署时,不同的 Python 进程将运行不同的站点,从而避免部署之间可能发生的任何冲突。在管理同一台服务器上的多个站点时,我发现一个非常有用的工具是 supervisor(医生)。它为启动、停止和重新启动不同的 Django 实例提供了一个简单的接口。它还能够在进程失败或计算机启动时自动重新启动进程。例如,如果某个异常被引发,但没有任何东西捕捉到它,整个网站就会崩溃。督导程序将捕捉到这一点,并自动重新启动 Django 实例。下面是一个示例监控程序(单个进程)配置:

[program:foo]
command=/path/toviertualenv/bin/python deploy.py
directory=/path/where/deploy.py/is/located/
autostart=true
autorestart=true
redirect_stderr=True
user=www

对于 Nginx 来说,我知道一开始它会让人难以承受。我发现 Nginx 非常有用。它解释了所有主要的 nginx 指令。

在我的 nginx 安装中,我发现最好的做法是只在 nginx.conf文件中设置核心配置,然后我有一个单独的文件夹 sites,在那里我保存我所托管的每个站点的 nginx 配置。然后我只需要将该文件夹中的所有文件包含在核心配置文件中。我使用指令 include sites/+*.conf;。这样,它只包含 sites文件夹中以 +符号开头的文件。这样,我就可以通过文件名来控制加载哪些配置文件。因此,如果我想禁用某个站点,我只需要重命名配置文件并重新启动 nginx。我不太确定您在问题中所说的“/etc/nginx 中的 site-able 和 site-enable 之间的 symlink”是什么意思,因为这些都是 Apache 命名文件夹,但它们完成的任务与 include指令类似。

至于 rootalias指令,除了计算根之外,它们基本相同。在 alias中,无论什么在 location中下降了,而在根中没有。图像显示您拥有以下 nginx 配置:

location /static {
alias /some/path/;
}
location /static2 {
root /some/other/path/;
}

如果用户访问这些 URL,那么 nginx 将尝试在系统中以下位置查找文件:

/static/hello/world.pdf => /some/path/hello/world.pdf
/static2/hello/world.pdf => /some/other/path/static2/hello/world.pdf

这是 nginx 站点的一个简单配置:

server {
server_name .foodomain.com;
listen 80;


access_log logs/foodomain.log;


gzip                on;
gzip_http_version   1.0;
gzip_comp_level     2;
gzip_proxied        any;
gzip_min_length     1100;
gzip_buffers        16 8k;
gzip_types          text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;


# Some version of IE 6 don't handle compression well on some mime-types, so just disable for them
gzip_disable "MSIE [1-6].(?!.*SV1)";


# Set a vary header so downstream proxies don't send cached gzipped content to IE6
gzip_vary on;


location / {
proxy_read_timeout      30s;
proxy_pass              http://localhost:8000;
proxy_set_header        Host                 $host;
proxy_set_header        User-Agent           $http_user_agent;
proxy_set_header        X-Real-IP            $remote_addr;
}


location /media {
alias   /path/to/media/;
expires 1y;
}


location /static {
autoindex on;
expires   1y;
alias     /path/to/static/;
}


location /favicon.ico {
alias /path/to/favicon.ico;
}
}

希望这能帮到你。

什么“设置”你见过最好的工作? 我使用的是 viralenv 和移动我的 Django 项目在这个环境中,但我看到了另一个 其中有一个文件夹的虚拟环境和其他设置 项目。

Viralenv 是一种隔离 Python 环境的方法; 因此,它在 部署中没有很大的作用——但是在 发展测试中,如果不是强烈推荐的话,它是一个必要条件。

您可以从 viralenv 获得的值是,它允许您确保为应用程序安装了正确的库版本。所以你把虚拟环境放在哪里并不重要。只要确保不将它作为源代码版本控制系统的一部分。

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

我如何设置事情的方式,允许多个网站托管 在一个服务器上?

有两件事你需要做多个网站设置:

  1. 如果您有 SSL,侦听端口80和/或端口443上的公共 IP 的服务器。
  2. 一组运行实际 django 源代码的“进程”。

人们使用 nginx 的目的是 # 1,因为它是一个非常快速的代理,而且不需要像 Apache 这样的综合服务器。如果您对 Apache 感到满意,可以自由使用它。没有要求“对于多个站点,使用 nginx”; 您只需要一个监听该端口的服务,该服务知道如何将(代理)重定向到运行实际 django 代码的进程。

对于 # 2,有几种方法可以启动这些过程。Gevent/uwsgi 是最流行的。这里唯一需要记住的是 不要在生产环境中使用 runserver

这些是绝对的最低要求。通常,人们会添加某种进程管理器来控制所有运行的“ django 服务器”(# 2)。这里你会看到 upstartsupervisor提到。我更喜欢主管,因为它不需要接管整个系统(不像暴发户)。然而,再次-这不是一个 硬性要求。您完全可以运行一系列 screen会话并分离它们。缺点是,如果服务器重新启动,就必须重新启动屏幕会话。

我个人建议:

  1. Nginx # 1
  2. 你可以在 uwsgi 和 Gunicorn 之间选择-我用 uwsgi。
  3. 管理后端进程的主管。
  4. 托管的每个应用程序的单个系统帐户(用户)。

我建议使用 # 4的原因是为了隔离权限; 同样,这也不是必需的。

为什么有些人建议使用 gunicorn _ django-b 0.0.0.0:8000和 其他人建议 gunicorn _ django-b 127.0.0.1:8000? 我测试了后者 在亚马逊 EC2实例中,但是在前者工作时它没有工作 没问题。

0.0.0.0的意思是“所有 IP 地址”-它是一个元地址(即占位符地址)。127.0.0.1是一个保留地址,它总是指向本地计算机。这就是为什么它被称为“ localhost”。只有在同一系统上运行的进程才能访问它。

通常,前端服务器(上面列表中的 # 1)会侦听公共 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)在同一台机器上运行时

如果您不想麻烦地运行前端代理服务器,那么您可以自由地这样做。

Nginx 配置文件背后的逻辑是什么 教程使用完全不同的配置文件,我是 比如,有些人使用“别名” /path/to/static/file”和其他“ root/path/to/static/file”。 也许您可以共享您的首选配置文件。

关于 nginx,您应该知道的第一件事是它是像 Apache 或 IIS 一样的 不是网络服务器。这是个代理人。因此,您将看到定义了不同的术语,如“上游”/“下游”和多个“服务器”。花点时间先看看 nginx 手册。

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

alias的意思是“映射一个名称到一个目录”。别名目录 也许不是文档根目录的子目录。

为什么我们要在站点可用和站点启用之间创建符号链接 /etc/nginx?

这是 Debian (以及类似于 ubuntu 的 Debian 系统)所特有的。sites-available列出了系统上所有虚拟主机/站点的配置文件。从 sites-enabledsites-available的符号链接“激活”该站点或虚拟主机。这是一种分离配置文件和轻松启用/禁用主机的方法。

好吧,就您在问题中提到的最佳实践而言,我忍不住要分享一个对我非常有效的工具,真的!我自己过去常常在几个配置文件中混淆了 Gunicorn,nginx,几个站点的管理员 D!但我渴望以某种方式使整个过程自动化,这样我就可以对我的应用程序/站点进行更改并立即部署它。它的名字是姜戈-基佬。你可以找到我的经验与 这里是姜戈部署自动化的细节。我刚刚配置了一个 Fabfile.py ONCE (django-fagungis 使用光纤来自动化整个过程,并在远程服务器上创建了一个 Virtual alenv,即 非常方便来管理单个服务器上托管的多个站点的依赖关系。它使用 nginx、 gunicorn 和 monitor D 来处理 Django 项目/站点部署)和 Django-fagungis 从 bitbucket 中克隆我的最新项目(我用它来颠覆) ,并将其部署到我的远程服务器上,我只需要在我的本地机器的 shell 中输入三个命令,然后它!对我来说,这已经成为 Django 部署的最佳和免费实践。

检查 Django 项目所需的最小 Gunicorn 和 nginx 配置。 Http://agiliq.com/blog/2013/08/minimal-nginx-and-gunicorn-configuration-for-djang/