如何安装和配置Django与Postgres,Nginx和Gunicorn

本教程通过在您的VPS上安装和配置Django与Postgres,Nginx和Gunicorn。

先决条件


本教程假定您已经使用Debian 7或类似的Linux发行版(例如Ubuntu)设置了您的Droplet(VPS)。 如果你还没有这样做,请按照上设置Droplet教程这里

为了方便起见,我将本教程分为两部分。 第一部分(第1步 - 6)仅涵盖安装。 如果你是一个更高级的Django用户,只需要帮助安装你可以在第6步停止。如果你已经安装了一切,只是想知道如何配置一切,然后跳到第7步。如果你觉得你需要帮助从开始到完成,然后只是顺序通过的步骤,你应该没有问题。 让我们开始吧!

第一步:更新软件包


在我们做任何事情之前,我们需要确保我们的VPS上安装的所有软件包都是最新的。 为此,请通过SSH连接到所需的VPS并运行以下命令:

sudo apt-get update

sudo apt-get upgrade

第一个命令下载通过apt-get管理的软件包的任何更新。 第二个命令安装已下载的更新。 在运行以上命令(如果有要安装的更新)之后,可能会提示您指示是否要安装更新。 如果发生这种情况,只需键入“y”,然后在提示时按“输入”。

第二步:安装并创建Virtualenv


安装virtualenv非常简单。 只需运行以下命令:

sudo apt-get install python-virtualenv

这就是它的所有! 现在让我们创建我们的virtualenv,这样我们可以安装Django和其他Python包:

sudo virtualenv /opt/myenv

请注意,在“/ opt”目录中创建了一个新目录“myenv”。 这是我们的virtualenv将生活。 确保将“/ opt / myenv”替换为您希望虚拟化安装位置的路径。 我通常把我的env的/ opt,但这是严格的偏好。 有些人在VPS的根目录下创建一个名为“webapps”的目录。 选择任何对你最有意义的方法。

第三步:安装Django


现在我们需要激活我们的virtualenv,这样当我们安装Python包,他们安装到我们的virtualenv。 这是您如何激活您的virtualenv:

source /opt/myenv/bin/activate

您现在应该看到“(myenv)”已被追加到终端提示符的开头。 这将帮助你知道什么时候你的virtualenv是活动的和virtualenv是活动的,如果你有多个virtualenv的VPS。

随着您的virtualenv活动,我们现在可以安装Django。 为了做到这一点,我们将使用pip,一个Python包管理器很像easy_install。 这里是你将运行的命令:

pip install django

你现在有Django安装在你的virtualenv! 现在,让我们的数据库服务器。

第四步:安装PostgreSQL


大多数Django用户喜欢使用PostgreSQL作为他们的数据库服务器。 它比MySQL更强大,Django ORM比MySQL,MSSQL或其他更好用PostgreSQL。

由于我们不需要为此部分激活virtualenv,请运行以下命令停用:

deactivate

这将始终禁用任何virtualenv当前处于活动状态。 现在我们需要使用这个命令安装PostgreSQL的依赖项来使用Django:

sudo apt-get install libpq-dev python-dev

现在你已经这样做,安装PostgreSQL像这样:

sudo apt-get install postgresql postgresql-contrib

PostgreSQL现在安装在您的机器上并准备好滚动。

第五步:安装NGINX


NGINX是一个令人难以置信的快速和轻量级的Web服务器。 我们将使用它来为我们的Django应用程序提供我们的静态文件。 要安装它只需运行这个命令:

sudo apt-get install nginx

请记住,您仍然需要启动NGINX,但是当我们开始配置我们的VPS时,我们将讨论这一点。

第六步:安装Gunicorn


Gunicorn是一个非常强大的Python WSGI HTTP服务器。 因为它是一个Python包,我们需要首先激活我们的virtualenv来安装它。 下面是我们如何做:

source /opt/myenv/bin/activate

确保您在终端提示符的开头看到添加的“myenv”。 在您的virtualenv现在处于活动状态时,运行以下命令:

pip install gunicorn

Gunicorn现在安装在你的virtualenv。

如果你想要的是安装一切,请随时停下来。 否则,请继续操作,了解如何配置一切协同工作,并让网络上的其他人可以访问您的应用。

第七步:配置PostgreSQL


让我们从PostgreSQL开始我们的配置。 使用PostgreSQL,我们需要创建一个数据库,创建一个用户,并授予我们创建的用户访问我们创建的数据库。 通过运行以下命令启动:

sudo su - postgres

您的终端提示现在应该说“postgres @ yourserver”。 如果是这种情况,则运行此命令创建数据库:

createdb mydb

您的数据库现在已创建,并且如果您未更改命令,将命名为“mydb”。 你可以为你的数据库命名你想要的。 现在使用以下命令创建数据库用户:

createuser -P

你现在将会遇到一系列的6个提示。 第一个将要求您输入新用户的名称。 使用任何你想要的名称。 接下来的两个提示是您的密码和新用户的密码确认。 对于最后3个提示只需输入“n”并按“回车”。 这只是确保你的新用户只能访问你给它访问和没有其他。 现在激活PostgreSQL命令行界面如下:

psql

最后,使用此命令授予此新用户对您的新数据库的访问权限:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

您现在有一个PostgreSQL数据库和用户访问该数据库。 现在我们可以安装Django并设置它使用我们的新数据库。

第八步:创建一个Django项目


为了走得更远,我们需要一个Django项目来测试。 这将让我们看看我们正在做的是否工作。 将目录更改为您的virtualenv的目录(在我的情况下,/ opt / myenv),如下所示:

cd /opt/myenv

现在确保你的virtualenv是活动的。 如果你不确定,那么只需运行以下命令确保你被激活:

source /opt/myenv/bin/activate

在您的virtualenv现在处于活动状态时,运行以下命令以启动新的Django项目:

django-admin.py startproject myproject

您应该在virtualenv目录中看到一个名为“myproject”的新目录。 这是我们的新Django项目文件存在的地方。

为了使Django能够与我们的数据库交谈,我们需要为PostgreSQL安装一个后端。 确保您的virtualenv是活动的,并运行以下命令为了做到这一点:

pip install psycopg2

将目录更改为新的“myproject”目录,然后进入其子目录,也称为“myproject”,如下所示:

cd /opt/myenv/myproject/myproject

使用您选择的编辑器编辑settings.py文件:

nano settings.py

查找数据库设置并将其编辑为如下所示:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'mydb',                      # Or path to database file if using sqlite3.
            # The following settings are not used with sqlite3:
            'USER': 'myuser',
            'PASSWORD': 'password',
            'HOST': 'localhost',                      # Empty for localhost through domain sockets or           '127.0.0.1' for localhost through TCP.
            'PORT': '',                      # Set to empty string for default.
        }
    }

保存并退出文件。 现在向上移动一个目录,使您在主Django项目目录(/ opt / myenv / myproject)中。

cd /opt/myenv/myproject

如果您尚未使用以下命令,请激活您的virtualenv:

source /opt/myenv/bin/activate

在您的virtualenv处于活动状态时,运行以下命令,以便Django可以将其初始配置和其他表添加到数据库:

python manage.py syncdb

您应该看到一些输出描述什么表安装,然后提示询问是否要创建超级用户。 这是可选的,并且取决于是否将使用Django的身份验证系统或Django管理员。

第九步:配置Gunicorn


Gunicorn配置非常针对您的应用程序需求。 我会简单地在这里运行Gunicorn与一些不同的设置。

首先让我们使用默认设置运行Gunicorn。 这里是命令只运行默认Gunicorn:

gunicorn_django --bind yourdomainorip.com:8001

请务必将“yourdomainorip.com”替换为您的域名,或者您的VPS的IP地址。 现在去您的网络浏览器,访问yourdomainorip.com:8001,看看你得到什么。 你应该得到Django欢迎屏幕。

如果你仔细看看上面的命令的输出,但是,你会注意到只有一个Gunicorn工人启动。 如果您在大型VPS上启动大规模应用程序,该怎么办? 没有恐惧! 我们需要做的是修改命令有点像:

gunicorn_django --workers=3 --bind yourdomainorip.com:8001

现在你会注意到,3个工人被引导,而不是只有一个工人。 您可以将此号码更改为适合您的需要。

因为我们运行命令以root身份启动Gunicorn,Gunicorn现在以root身份运行。 如果你不想要怎么办? 再次,我们可以改变上面的命令稍微适应:

gunicorn_django --workers=3 --user=nobody --bind yourdomainorip.com:8001

如果你想为Gunicorn设置更多的选项,那么最好设置一个配置文件,你可以在运行Gunicorn时调用。 这将导致更短和更容易读/配置Gunicorn命令。

您可以将gunicorn的配置文件放在任何你想要的地方。 为了简单起见,我们将它放在我们的virtualenv目录中。 导航到您的virtualenv的目录,如下所示:

cd /opt/myenv

现在使用您的首选编辑器打开您的配置文件(在下面的示例中使用nano):

sudo nano gunicorn_config.py

将以下内容添加到文件:

    command = '/opt/myenv/bin/gunicorn'
    pythonpath = '/opt/myenv/myproject'
    bind = '127.0.0.1:8001'
    workers = 3
    user = nobody

保存并退出文件。 这些选项的作用是设置gunicorn二进制文件的路径,添加你的项目目录到你的Python路径,设置域和端口绑定Gunicorn,设置gunicorn工人的数量和设置用户Gunicorn将运行为。

为了运行服务器,这次我们需要一个更长的命令。 在提示符中输入以下命令:

/opt/myenv/bin/gunicorn -c /opt/myenv/gunicorn_config.py myproject.wsgi

你会注意到在上面的命令中,我们传递“-c”标志。 这告诉gunicorn我们有一个我们想要使用的配置文件,我们在“-c”标志后传递。 最后,我们向我们的WSGI文件传递一个Python点符号引用,以便Gunicorn知道我们的WSGI文件在哪里。

运行Gunicorn这种方式要求你在自己的屏幕会话中运行Gunicorn(如果你熟悉使用屏幕),或者通过点击“ctrl + z”然后键入“bg”和“enter”在运行Gunicorn命令后。 这将使进程后台,所以即使在当前会话关闭后它也继续运行。 这也提出了需要手动启动或重新启动Gunicorn的问题,如果你的VPS重新启动或由于某种原因它崩溃。 为了解决这个问题,大多数人使用supervisord来管理Gunicorn并根据需要启动/重新启动它。 安装和配置supervisord已经覆盖在另一篇文章中可以找到这里

最后,这绝不是Gunicorn配置选项的详尽列表。 请务必阅读正文中发现的Gunicorn文档gunicorn.org更多关于这个话题。

第十步:配置NGINX


在我们太过分了之前,让我们首先启动NGINX:

sudo service nginx start

因为我们只设置NGINX来处理静态文件,我们需要首先确定我们的静态文件将被存储在哪里。 打开您的Django项目的settings.py文件,并编辑STATIC_ROOT行,如下所示:

    STATIC_ROOT = "/opt/myenv/static/"

这个路径可以在任何你想要的。 但为了清洁,我通常把它放在我的Django项目文件夹外,但在我的virtualenv目录。

现在你已经设置了静态文件的位置,让我们配置NGINX来处理这些文件。 使用以下命令打开一个新的NGINX配置文件(您可以用您选择的编辑器替换“nano”):

sudo nano /etc/nginx/sites-available/myproject

您可以为文件命名任何您想要的,但标准通常将其命名为与您正在配置的站点相关。 现在将以下内容添加到文件中:

    server {
        server_name yourdomainorip.com;

        access_log off;

        location /static/ {
            alias /opt/myenv/static/;
        }

        location / {
                proxy_pass http://127.0.0.1:8001;
                proxy_set_header X-Forwarded-Host $server_name;
                proxy_set_header X-Real-IP $remote_addr;
                add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
        }
    }

保存并退出文件。 以上配置已经设置NGINX为我们为我们的Django项目设置的静态目录提供yourdomainorip.com/static/上请求的任何内容。 任何要求在yourdomainorip.com将代理本地主机在端口8001,这是我们告诉Gunicorn运行。 其他行确保请求的主机名和IP地址传递给Gunicorn。 否则,每个请求的IP地址变为127.0.0.1,主机名只是您的VPS主机名。

现在我们需要在/ etc / nginx / sites-enabled目录中设置一个指向此配置文件的符号链接。 这就是NGINX知道这个网站是活跃的。 将目录更改为/ etc / nginx / sites-enabled,如下所示:

cd /etc/nginx/sites-enabled

一旦运行此命令:

sudo ln -s ../sites-available/myproject

这将创建我们需要的符号链接,以便NGINX知道尊重我们的网站的新配置文件。

另外,删除默认的nginx服务器块:

`sudo rm default'

我们需要重新启动NGINX,以便它知道寻找我们的更改。 为此,运行以下:

sudo service nginx restart

就是这样! 你现在有Django安装和使用PostgreSQL和你的应用程序是可访问的NGINX服务静态内容和Gunicorn作为你的应用程序服务器。 如果您有任何问题或进一步的建议,请务必将其留在评论部分。