你看过哪种"设置"效果最好?我使用virtualenv,并将我的django项目放在这个环境中,但我看到其他设置中有一个用于虚拟环境的文件夹和另一个用于项目的文件夹。
virtualenv是一种隔离Python环境的方法;因此,在部署期间它并没有发挥太大作用 - 但在开发和测试期间,如果不是强烈建议,那么就是必须的。 virtualenv的价值在于它允许您确保为应用程序安装了正确的库版本。 所以,虚拟环境本身放在哪里都没关系。只需确保不将其包含在源代码版本控制系统中即可。
文件系统布局并不是关键。 您会看到很多文章赞扬目录布局甚至还有可以克隆的框架项目。 我认为这更具个人偏好而不是严格要求。当然拥有这个很好,但除非您知道为什么,否则它不会为部署流程增加任何价值-因此,除非对您的情况有意义,否则不要因为某些博客推荐它而这么做。例如-如果您没有私有PyPi服务器是部署工作流程的一部分,则无需创建setup.py文件。
如何设置以允许在单个服务器上托管多个站点?
您需要两件事来进行多站点设置:
1. 一个正在公共IP上监听端口80和/或端口443(如果有SSL)的服务器。
2. 大量运行实际django源代码的“进程”。
人们使用nginx作为#1,因为它是非常快速的代理,并且不带有像Apache这样的综合服务器的开销。 如果您熟悉Apache,则可以自由使用它。 没有“多个站点,请使用nginx”的要求; 您只需要一个服务来监听该端口,知道如何重定向(代理)到运行实际django代码的进程即可。
对于#2,有几种启动这些进程的方法。 gevent / uwsgi是最流行的。 这里唯一需要记住的是
在生产中不要使用runserver。这些是绝对最低要求。通常人们会添加一些进程管理器来控制所有运行的“django服务器”(#2)。在这里,你会看到提到了
upstart
和
supervisor
。我更喜欢supervisor,因为它不需要接管整个系统(不像upstart)。然而,再次强调-这不是一个硬性要求。你可以 perfectly 运行一堆
screen
会话并将它们分离。缺点是,如果您的服务器重新启动,则必须重新启动screen会话。
个人建议如下:
- Nginx #1
- 选择使用uwsgi或gunicorn之一-我使用uwsgi。
- supervisor 管理后端进程。
- 为您托管的每个应用程序使用单独的系统帐户(用户)
我建议使用第4步是为了隔离权限;同样,这不是必需的。
一些人为什么建议使用gunicorn_django -b 0.0.0.0:8000 和其他人建议使用 gunicorn_django -b 127.0.0.1:8000? 我在一个Amazon EC2实例中测试了后者,但它没有起作用,而前者则没有问题。
0.0.0.0
表示“所有IP地址”,这是一个元地址(即占位符地址)。
127.0.0.1
是一个保留地址,始终指向本地机器。这就是为什么它被称为"localhost"。它只能由运行在同一系统上的进程访问。
通常,您将在具有公共IP地址的前端服务器(#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/等)“直接”被访问;如果您的前端服务器(nginx)和后端进程(django/uwsgi/gevent)在同一台机器上运行,某人可以通过请求
http://your.public.ip.address:9000/
直接访问您的应用程序
特别是。
如果您不想运行前端代理服务器,也可以自由地这样做。
nginx配置文件背后的逻辑是什么?有这么多教程使用完全不同的配置文件,我对哪个更好感到困惑。例如,有些人使用"alias /path/to/static/folder",而其他人则使用"root /path/to/static/folder"。 或许你可以分享你喜欢的配置文件。
您需要了解关于nginx的第一件事就是,它与Apache或IIS等不同,不是一个Web服务器,它是一个代理服务器。因此,您将看到不同的术语,例如“上游”/“下游”和多个“服务器”被定义,花点时间去阅读nginx手册。
有许多不同的设置nginx的方法,但以下是对于您关于alias
与root
的问题的一个答案。 root
是一个明确的指令,将nginx的文档根目录(“主目录”)绑定到指定目录。这是在没有路径的请求时(例如:http://www.example.com/
)它将查看的目录。
alias
的意思是“将名称映射到目录”。别名目录可能不是文档根目录的子目录。
为什么我们需要在/etc/nginx中的site-available和sites-enabled之间创建符号链接?
这是Debian(以及类似Ubuntu的基于Debian的系统)所特有的。 sites-available
列出系统中所有虚拟主机/站点的配置文件。从sites-enabled
到sites-available
的符号链接“激活”该网站或虚拟主机。这是一种分离配置文件并轻松启用/禁用主机的方法。