这是一个宽泛的问题,但我想得到一个规范的答案.我一直在try 在Django中部署一个使用gunicornnginx的站点.在阅读了大量的教程之后,我已经取得了成功,但我不能确定我遵循的步骤是否足够好来运行一个没有问题的网站,或者也许有更好的方法来做到这一点.这种不确定性令人恼火.

这就是为什么我要为新手寻找一个非常详细和解释清楚的答案.我不想解释太多我知道的和我不知道的,因为这可能会扭曲答案,其他人可能会从你的答案中受益较少.然而,我想看到的是:

  • 你认为哪种"设置"效果最好?我使用了virtualenv并将我的Django项目移到了这个环境中,但是我看到了另一个设置,其中有一个用于虚拟环境的文件夹,另一个用于项目的文件夹.

  • 我怎样才能在一台服务器上设置多个站点?

  • 为什么有些人建议使用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之间的符号链接?

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

谢谢

推荐答案

你认为哪种"设置"效果最好?我使用了viralenv并移动了我的 在这个环境中的Django项目,但是我看到了另一个 设置,其中有一个文件夹用于虚拟环境,其他文件夹用于 项目.

virtualenv是一种隔离Python环境的方法;因此,它在deployment岁时没有太大的作用,但是在development岁和testing岁时,如果不是强烈推荐的话,这是一个要求.

您将从viralenv获得的价值在于,它允许您确保为应用程序安装了正确版本的库.因此,虚拟环境本身放在哪里并不重要.只需确保您没有将其作为源代码版本控制系统的一部分.

文件系统布局并不重要.你会看到很多文章赞美目录布局的优点,甚至可以克隆一些框架项目作为起点.我觉得这更多的是个人喜好,而不是严格的要求.当然,拥有它很好;但是,除非你有know why,否则它不会给你的部署过程增加任何价值——所以不要这样做,因为有些博客推荐它,除非它对你的场景有意义.例如,如果部署工作流程中没有专用PyPi服务器,则无需创建setup.py文件.

我如何设置允许多个站点托管的内容

要进行多个站点设置,您需要做两件事:

  1. 在端口80和/或端口443(如果您有SSL)上监听公网IP的服务器.
  2. 一堆运行实际django源代码的"进程".

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

对于#2,有几种方法可以启动这些过程.gevent/uwsgi是最受欢迎的.这里唯一需要记住的是do not use runserver in production.

这些是绝对最低要求.通常,人们会添加某种进程管理器来控制所有"django服务器"(#2)的运行.这里你会看到upstartsupervisor被提及.我更喜欢supervisor,因为它不需要接管整个系统(不像upstart).然而,再一次——这不是hard requirement.你完全可以运行一系列screen个会话,并将其删除.缺点是,如果服务器重新启动,则必须重新启动屏幕会话.

我个人建议:

  1. Nginx代表#1
  2. 在uwsgi和genicorn之间 Select -我使用uwsgi.
  3. supervisor用于管理后端进程.
  4. 您托管的每个应用程序的单个系统帐户(用户).

我推荐#4的原因是隔离权限;同样,这不是必需的.

为什么有些人建议使用gunicorn_django-b 0.0.0:8000和

0.0.0.0表示"所有IP地址"——它是一个元地址(即占位符地址).127.0.0.1是始终指向本地计算机的保留地址.这就是为什么它被称为"localhost".只有在同一系统上运行的进程才能访问它.

通常,您让前端服务器(上面列表中的#1)侦听公共IP地址.你是should explicitly bind the server to 100 IP address号.

但是,如果由于某种原因您正在使用DHCP,或者您不知道IP地址是什么(例如,它是一个新配置的系统),您可以告诉nginx/apache/任何其他进程绑定到0.0.0.0.This should be a 101.

对于生产服务器,您将拥有一个静态IP.如果你有一个动态IP(DHCP),那么你可以在0.0.0.0分钟后离开.但在生产机器上使用DHCP是非常罕见的.

将genicorn/uwsgi绑定到此地址的版本为not recommended.如果您将后端进程(genicorn/uwsgi)绑定到0.0.0.0,则可能会绕过您的前端代理(nginx/apache/etc)"直接"访问它;某人可能只需请求http://your.public.ip.address:9000/,然后直接访问您的应用程序especially if your front-end server (nginx) and your back end process (django/uwsgi/gevent) are running on the same machine.

不过,如果你不想麻烦地运行前端代理服务器,你可以自由地这么做.

nginx的配置文件背后的逻辑是什么?有这么多 使用截然不同的配置文件的教程 不知道哪一个更好.例如,有些人使用"别名" /path/to/静电/文件夹",其他"root/path/to/静电/文件夹". 也许您可以共享您的首选配置文件.

关于nginx,您应该知道的第一件事是它是not a webserver,就像Apache或IIS一样.它是一个代理人.因此,您将看到定义了不同的术语,如"upstream "/"下游"和多个"服务器".花点时间先看一下nginx手册.

设置nginx有很多不同的方法;但是对于您的问题,这里有一个答案,分别是aliasroot.root是绑定nginx的文档根目录("主目录")的显式指令.这是当您发出没有路径(如http://www.example.com/)的请求时它将查看的目录

alias表示"将名称映射到目录".别名目录may not be是文档根的子目录.

为什么我们要在中可用的站点和启用的站点之间创建一个符号链接

这是Debian(以及类似Debian的系统,如ubuntu)所独有的.sites-available列出系统上所有虚拟主机/站点的配置文件.从sites-enabledsites-available的符号链接"激活"该站点或虚拟主机.它是分离配置文件并轻松启用/禁用主机的一种方式.

Django相关问答推荐

自定义公钥打破Django管理内联逻辑

如何创建为模型创建信号的Djangodecorator ?

升级到4.2时,获取默认文件存储/存储是互斥的

没有与给定查询匹配的监视列表

带有变量键的 Django 模板括号表示法不起作用

当前路径 **/POST 与其中任何一个都不匹配

我如何获得已循环的每个项目的名称?

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

从一个组中获取所有用户 - Django

表单集中的每个表单验证

Django:get_or_create 使用 together_unique 引发重复条目

如何在 django 模板中将名称反转为绝对 url?

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

django Datefield 到 Unix 时间戳

django 静态文件版本控制

在 Celery 任务中运行 Scrapy 蜘蛛

使用 request.user 的 Django 和中间件始终是匿名的

Django 模型(1054,Unknown column in 'field list')

如何更改 django 模板中布尔值的打印方式?