如何在 Ubuntu 14.04 上使用 Postgres、Nginx 和 Gunicorn 设置 Django

介绍

Django 是一个强大的 Web 框架,可以帮助您将您的 Python 应用程序或网站从地面上获得。Django 包含一个简化开发服务器来本地测试您的代码,但对于任何与生产有关的内容,需要一个更安全、更强大的 Web 服务器。

在本指南中,我们将展示如何在Ubuntu 14.04上安装和配置某些组件以支持和服务Django应用程序。我们将设置一个PostgreSQL数据库,而不是使用默认的SQLite数据库。我们将配置Gunicorn应用程序服务器与我们的应用程序进行交互。

前提和目标

为了完成本指南,您应该有一个新的Ubuntu 14.04服务器实例,具有非根用户的sudo特权配置,您可以通过我们的 初始服务器设置指南来学习如何设置此设置。

将 Django 安装在虚拟环境中,而将 Django 安装在您项目的特定环境中,将使您的项目及其需求能够单独处理。

一旦我们的数据库和应用程序启动并运行,我们将安装和配置Gunicorn应用程序服务器,这将作为我们的应用程序的界面,将客户端请求翻译成HTTP到我们的应用程序可以处理的Python呼叫。

让我们开始吧。

安装 Ubuntu 存储库中的软件包

要开始这个过程,我们将从Ubuntu存储库下载并安装我们需要的所有项目,我们将使用Python包管理器pip稍后安装额外的组件。

首先,更新本地包索引,然后下载和安装包:

1sudo apt-get update
2sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

這將安裝「pip」,後來建立 Gunicorn 所需的 Python 開發檔案、Postgres 資料庫系統和與之互動所需的圖書館,以及 Nginx 網頁伺服器。

创建 PostgreSQL 数据库和用户

我们将直接跳进并为我们的Django应用程序创建一个数据库和数据库用户。

要在默认配置中使用 Postgres,最好暂时更改为postgres系统用户。

1sudo su - postgres

当您作为postgres用户时,您可以通过键入直接登录到 PostgreSQL 交互式会话中,而无需进一步验证:

1psql

您将收到一个PostgreSQL提示,我们可以设置我们的要求。

首先,为您的项目创建一个数据库:

1CREATE DATABASE myproject;

每个命令都必须以半列结束,因此如果您遇到问题,请确保命令以一个结束。

接下来,为我们的项目创建一个数据库用户. 请确保选择安全密码:

1CREATE USER myprojectuser WITH PASSWORD 'password';

现在,我们可以为我们的新用户提供访问权限来管理我们的新数据库:

1GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

完成后,通过键入退出 PostgreSQL 提示:

1\q

现在,退出postgres用户的壳会话以通过键入返回正常用户的壳会话:

1exit

为您的项目创建一个Python虚拟环境

现在我们已经准备好了我们的数据库,我们可以开始准备剩下的项目要求,我们将在虚拟环境中安装我们的Python要求,以便更容易管理。

要做到这一点,我们首先需要访问virtualenv命令,我们可以使用pip来安装:

1sudo pip install virtualenv

安装了virtualenv,我们可以开始创建我们的项目. 创建一个目录,您希望保留您的项目,然后移动到目录:

1mkdir ~/myproject
2cd ~/myproject

在项目目录中,通过键入创建一个Python虚拟环境:

1virtualenv myprojectenv

这将创建一个名为myprojectenv的目录在你的myproject目录中。内部,它将安装一个本地版本的Python和一个本地版本的pip

在我们安装项目的 Python 要求之前,我们需要激活虚拟环境,您可以通过键入:

1source myprojectenv/bin/activate

您的提示应更改,以表示您现在在Python虚拟环境中运行,它将看起来像这样: (myprojectenv)user@host:~/myproject$

随着虚拟环境的启动,安装 Django、Gunicorn 和psycopg2 PostgreSQL 适配器,使用本地实例pip:

1pip install django gunicorn psycopg2

创建和配置一个新的Django项目

有了我们的Python组件安装,我们可以创建实际的Django项目文件。

创建 Django 项目

由于我们已经有一个项目目录,我们会告诉Django在这里安装文件,它将创建一个与实际代码的第二级目录,这是正常的,并在该目录中放置一个管理脚本。

1django-admin.py startproject myproject .

调整项目设置

我们应该做的第一件事与我们新创建的项目文件是调整设置. 在文本编辑器中打开设置文件:

1nano myproject/settings.py

首先,找到配置数据库访问的部分,它将从DATABASES开始,文件中的配置是 SQLite 数据库,我们已经为我们的项目创建了一个 PostgreSQL 数据库,所以我们需要调整设置。

使用您的 PostgreSQL 数据库信息更改设置. 我们告诉 Django 使用我们与pip安装的psycopg2适配器. 我们需要输入数据库名称、数据库用户名、数据库用户名密码,然后指定数据库位于本地计算机上。

 1DATABASES = {
 2    'default': {
 3        'ENGINE': 'django.db.backends.postgresql_psycopg2',
 4        'NAME': 'myproject',
 5        'USER': 'myprojectuser',
 6        'PASSWORD': 'password',
 7        'HOST': 'localhost',
 8        'PORT': '',
 9    }
10}

接下来,移动到文件的底部,并添加一个设置,表示 static 文件应该放置在哪里。 这是必要的,以便 Nginx 能够处理这些项目的请求。

1STATIC_ROOT = os.path.join(BASE_DIR, "static/")

保存并关闭文件,当你完成。

完整的初始项目设置

现在,我们可以使用管理脚本将初始数据库方案迁移到我们的PostgreSQL数据库:

1cd ~/myproject
2./manage.py makemigrations
3./manage.py migrate

创建一个项目的管理用户,键入:

1./manage.py createsuperuser

您将需要选择用户名,提供电子邮件地址,并选择并确认密码。

我们可以将所有静态内容收集到我们通过键入配置的目录位置:

1./manage.py collectstatic

然后,静态文件将被放置在项目目录中的名为静态的目录中。

最后,您可以通过使用以下命令启动 Django 开发服务器来测试我们的项目:

1./manage.py runserver 0.0.0.0:8000

在您的 Web 浏览器中,访问您的服务器的域名或 IP 地址,然后是 :8000:

1http://server_domain_or_IP:8000

您应该看到默认的 Django 索引页面:

Django index page

如果您在地址栏中添加/admin到URL的末尾,您将被提示使用createsuperuser命令创建的管理用户名和密码:

Django admin login

验证后,您可以访问默认的 Django admin 界面:

Django admin interface

当您完成探索时,在终端窗口中按 CTRL-C 来关闭开发服务器。

测试 Gunicorn 服务项目的能力

在离开我们的虚拟环境之前,我们要做的最后一件事是测试Gunicorn,以确保它可以服务于应用程序。

1cd ~/myproject
2gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

这将启动Gunicorn在Django开发服务器正在运行的相同界面上。你可以返回并再次测试应用程序。 请注意,管理员界面将没有应用任何的样式,因为Gunicorn不知道负责此事的静态内容。

我们通过指定相对目录路径给Django的wsgi.py文件,这是我们应用程序的入口点,使用Python的模块语法通过Gunicorn传递了一个模块。

当你完成测试时,在终端窗口中按 CTRL-C 来阻止 Gunicorn。

我们现在已经完成了我们的Django应用程序的配置,我们可以通过键入退出我们的虚拟环境:

1deactivate

创建一个 Gunicorn Upstart 文件

我们已经测试了Gunicorn可以与我们的Django应用程序进行交互,但我们应该实施一个更强大的启动和停止应用程序服务器的方式。

创建并在文本编辑器中使用sudo特权打开 Gunicorn 的 Upstart 文件:

1sudo nano /etc/init/gunicorn.conf

我们将从一个简单的描述字符串开始,以说明我们的服务文件的用途。然后我们将继续定义该服务应该自动启动的系统运行级别。运行服务的正常运行级别为2、3、4和5。当系统处于其中任何一个时,我们会运行我们的服务。

1description "Gunicorn application server handling myproject"
2
3start on runlevel [2345]
4stop on runlevel [!2345]

接下来,我们会告诉 Upstart 自动重新启动服务,如果它失败了,我们还想指定用户和组在下方运行,我们会使用我们的正常用户,因为我们所有的文件都是该用户的所有。

1description "Gunicorn application server handling myproject"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
5
6respawn
7setuid user
8setgid www-data
9chdir /home/user/myproject

现在,我们只需要给出将启动Gunicorn进程的命令。我们需要给出在我们虚拟环境中存储的Gunicorn可执行的路径。我们会告诉它使用Unix插槽而不是网络端口与Nginx进行通信,因为这两个服务都将在这个服务器上运行。这更安全,更快。你也可以在这里添加Gunicorn的任何其他配置。例如,我们会指定我们想要3个工人流程:

 1description "Gunicorn application server handling myproject"
 2
 3start on runlevel [2345]
 4stop on runlevel [!2345]
 5
 6respawn
 7setuid user
 8setgid www-data
 9chdir /home/user/myproject
10
11exec myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

完成后,保存并关闭文件。

通过键入开始 Gunicorn 服务:

1sudo service gunicorn start

配置 Nginx 到 Proxy Pass 到 Gunicorn

现在Gunicorn已设置,我们需要配置 Nginx 来将流量传输到进程中。

首先,在 Nginx 的可用站点目录中创建并打开一个新的服务器块:

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

在内部,打开一个新的服务器块,我们将首先指定该块应该在正常端口80上听,并应响应我们的服务器的域名或IP地址:

1server {
2    listen 80;
3    server_name server_domain_or_IP;
4}

接下来,我们会告诉 Nginx 忽略找到 favicon 的任何问题,我们还会告诉它在我们的 `~/myproject/static’ 目录中收集的静态资产在哪里找到。

1server {
2    listen 80;
3    server_name server_domain_or_IP;
4
5    location = /favicon.ico { access_log off; log_not_found off; }
6    location /static/ {
7        root /home/user/myproject;
8    }
9}

最后,我们将创建一个位置 / {}块,以匹配所有其他请求. 在这个位置中,我们将包括标准的proxy_params文件,包括在 Nginx 安装中,然后我们将流量传输到我们的 Gunicorn 过程创建的接口:

 1server {
 2    listen 80;
 3    server_name server_domain_or_IP;
 4
 5    location = /favicon.ico { access_log off; log_not_found off; }
 6    location /static/ {
 7        root /home/user/myproject;
 8    }
 9
10    location / {
11        include proxy_params;
12        proxy_pass http://unix:/home/user/myproject/myproject.sock;
13    }
14}

保存并关闭文件完成后. 现在,我们可以通过链接到网站启用目录来启用该文件:

1sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

通过键入测试您的 Nginx 配置以检测语法错误:

1sudo nginx -t

如果没有报告错误,请继续通过键入重新启动 Nginx:

1sudo service nginx restart

您现在应该能够访问您的服务器的域或IP地址来查看您的应用程序。

结论

在本指南中,我们已经在自己的虚拟环境中设置了一个Django项目,我们已经配置了Gunicorn来翻译客户端请求,以便Django能够处理这些请求。

Django 通过提供许多常见元素来简化项目和应用程序的创建,使您能够专注于独特的元素,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。

Published At
Categories with 技术
comments powered by Disqus