如何在Ubuntu 16.04上使用Apache和mod_wsgi来部署Django应用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

Django 是一个强大的 Web 框架,可以帮助您快速启动 Python 应用程序或网站。Django 包括一个简化的开发服务器,用于在本地测试代码,但对于任何与生产相关的事情,都需要一个更安全和功能强大的 Web 服务器。

在本指南中,我们将演示如何在 Python 虚拟环境中安装和配置 Django。然后,我们将设置 Apache 在我们的应用程序前面,以便它可以直接处理客户端请求,然后将需要应用程序逻辑的请求传递给 Django 应用程序。我们将使用 mod_wsgi Apache 模块来实现这一点,该模块可以通过 WSGI 接口规范与 Django 进行通信。

先决条件和目标

要完成本指南,您应该具有一个全新的 Ubuntu 16.04 服务器实例,并配置了具有 sudo 权限的非根用户。您可以通过运行我们的初始服务器设置指南来了解如何设置。

我们将在 Python 虚拟环境中安装 Django。将 Django 安装到与您的项目特定的环境中,可以使您的项目及其要求得到分开处理。

一旦我们的应用程序运行起来,我们将配置 Apache 与 Django 应用程序进行交互。它将使用 mod_wsgi Apache 模块来将 HTTP 请求转换为由名为 WSGI 的规范定义的可预测的应用程序格式。您可以通过阅读本指南中的链接部分来了解有关 WSGI 的更多信息。

让我们开始吧。

从 Ubuntu 软件仓库安装软件包

要开始这个过程,我们将从 Ubuntu 软件仓库下载并安装我们需要的所有项目。这将包括 Apache Web 服务器、用于与我们的 Django 应用程序进行交互的 mod_wsgi 模块,以及 pip,这是可以用来下载我们的 Python 相关工具的 Python 包管理器。

要获取我们需要的所有内容,请更新服务器的本地软件包索引,然后安装适当的软件包。

如果您正在使用 Python 2 与 Django,您需要的命令是:

sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi

如果您正在使用 Python 3 与 Django,您将需要另一个 Apache 模块和 pip 软件包。在这种情况下,适当的命令是:

sudo apt-get update
sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3

配置 Python 虚拟环境

现在我们从 Ubuntu 软件仓库中获得了组件,我们可以开始处理我们的 Django 项目了。第一步是创建一个 Python 虚拟环境,以便我们的 Django 项目将与系统工具和我们可能正在进行的任何其他 Python 项目分开。

我们需要安装 virtualenv 命令来创建这些环境。我们可以使用 pip 来获取它。

如果您正在使用 Python 2,请输入:

sudo pip install virtualenv

如果您正在使用 Python 3,请输入:

sudo pip3 install virtualenv

安装了 virtualenv 后,我们可以开始构建我们的项目。创建一个您希望保存项目的目录,并进入该目录:

mkdir ~/myproject
cd ~/myproject

在项目目录中,通过输入以下命令创建一个 Python 虚拟环境:

virtualenv myprojectenv

这将在您的 myproject 目录中创建一个名为 myprojectenv 的目录。在其中,它将安装一个本地版本的 Python 和一个本地版本的 pip。我们可以使用这个来为我们的项目安装和配置一个隔离的 Python 环境。

在安装项目的 Python 要求之前,我们需要激活虚拟环境。您可以通过输入以下命令来执行:

source myprojectenv/bin/activate

您的提示应该会更改,指示您现在正在操作一个 Python 虚拟环境中。它看起来应该像这样:(myprojectenv)user@host:~/myproject$

在您的虚拟环境激活状态下,使用本地实例的 pip 安装 Django:

pip install django

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

现在 Django 已经安装在我们的虚拟环境中,我们可以创建实际的 Django 项目文件。

创建 Django 项目

由于我们已经有了一个项目目录,我们将告诉 Django 在这里安装文件。它将创建一个实际代码的第二级目录,这是正常的,并在此目录中放置一个管理脚本。关键在于末尾的点,它告诉 Django 在当前目录中创建文件:

django-admin.py startproject myproject .

调整项目设置

我们应该使用我们新创建的项目文件来调整设置。使用您的文本编辑器打开设置文件:

nano myproject/settings.py

出于简单起见,我们将在本指南中使用默认的 SQLite 数据库,因此实际上我们不需要改变太多。我们将专注于配置允许的主机,以限制我们响应的域,并配置静态文件目录,Django 将在其中放置静态文件,以便 Web 服务器可以轻松地提供这些文件。

首先找到 ALLOWED_HOSTS 行。在方括号内,输入您服务器的公共 IP 地址、域名或两者。每个值应该用引号括起来,并用逗号分隔,就像一个普通的 Python 列表一样:

. . .
ALLOWED_HOSTS = ["server_domain_or_IP"]
. . .

在文件底部,我们将添加一行来配置此目录。Django 使用 STATIC_ROOT 设置来确定这些文件应该放在哪个目录。我们将使用一些 Python 代码告诉它使用我们项目主目录中名为 “static” 的目录:

. . .

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

完成后保存并关闭文件。

完成初始项目设置

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

cd ~/myproject
./manage.py makemigrations
./manage.py migrate

通过输入以下命令为项目创建一个管理员用户:

./manage.py createsuperuser

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

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

./manage.py collectstatic

您将需要确认操作。静态文件将被放置在项目目录中名为 static 的目录中。

现在,我们可以调整防火墙设置,以允许流量访问我们将在端口 8000 上运行的 Django 开发服务器。如果您按照先决条件中的初始服务器设置指南进行了设置,您应该已经启用了 UFW 防火墙。

通过输入以下命令允许连接到开发服务器:

sudo ufw allow 8000

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

./manage.py runserver 0.0.0.0:8000

在您的网络浏览器中,访问您的服务器的域名或 IP 地址,后面加上 :8000

http://server_domain_or_IP:8000

您应该会看到默认的 Django 首页:

!Django default index

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

!Django admin login

认证后,您可以访问默认的 Django 管理界面:

!Django admin interface

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

现在我们暂时完成了 Django 的工作,可以通过输入以下命令退出虚拟环境:

deactivate

配置 Apache

现在您的 Django 项目正在运行,我们可以将 Apache 配置为前端。它接收到的客户端连接将使用 mod_wsgi 模块转换为 Django 应用程序期望的 WSGI 格式。这应该在之前的安装中已自动启用。

要配置 WSGI 传递,我们需要编辑默认的虚拟主机文件:

sudo nano /etc/apache2/sites-available/000-default.conf

我们可以保留文件中已经存在的指令。我们只需要添加一些额外的内容。

首先,让我们配置静态文件。我们将使用别名告诉 Apache 将以 /static 开头的任何请求映射到我们项目文件夹中的 “static” 目录。我们之前在那里收集了静态资产。我们将设置别名,然后使用目录块授予对应目录的访问权限:


<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

</VirtualHost>

接下来,我们将授予对存储 Django 代码的第二级项目目录中的 wsgi.py 文件的访问权限。为此,我们将使用一个带有文件部分的目录部分。我们将在这个嵌套结构内授予对文件的访问权限:


<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

    <Directory /home/sammy/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

</VirtualHost>

配置完成后,我们准备构建实际处理 WSGI 传递的文件部分。我们将使用守护程序模式来运行 WSGI 进程,这是推荐的配置。我们可以使用 WSGIDaemonProcess 指令来设置这个。

这个指令需要一个进程的任意名称。我们将使用 myproject 保持一致。之后,我们设置 Python 主目录,Apache 可以在其中找到可能需要的所有组件。由于我们使用了虚拟环境,我们可以直接将其指向我们的基本虚拟环境目录。之后,我们设置 Python 路径,指向我们 Django 项目的基本目录。

接下来,我们需要指定进程组。这应该指向我们为 WSGIDaemonProcess 指令选择的相同名称(在我们的情况下是 myproject)。最后,我们需要设置脚本别名,以便 Apache 将对根域的请求传递给 wsgi.py 文件:


<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

    <Directory /home/sammy/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess myproject python-home=/home/sammy/myproject/myprojectenv python-path=/home/sammy/myproject
    WSGIProcessGroup myproject
    WSGIScriptAlias / /home/sammy/myproject/myproject/wsgi.py

</VirtualHost>

完成这些更改后,保存并关闭文件。

处理一些权限问题

如果你正在使用 SQLite 数据库,这是本文中默认使用的数据库,你需要允许 Apache 进程访问这个文件。

首先,我们需要改变权限,使得数据库的组所有者可以读写。数据库文件默认名为 db.sqlite3,应该位于你的基础项目目录中:

chmod 664 ~/myproject/db.sqlite3

接下来,我们需要将 Apache 运行的组 www-data 赋予文件组所有权:

sudo chown :www-data ~/myproject/db.sqlite3

为了能够写入文件,我们还需要将 Apache 赋予数据库父目录的组所有权:

sudo chown :www-data ~/myproject

我们需要再次调整防火墙。由于我们现在通过 Apache 进行代理,所以不再需要打开 8000 端口,因此我们可以删除该规则。然后,我们可以添加一个例外,允许流量到达 Apache 进程:

sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'

检查你的 Apache 文件,确保没有出现语法错误:

sudo apache2ctl configtest

只要输出的最后一行看起来像这样,你的文件就没问题:

. . .
Syntax OK

完成这些步骤后,你可以重新启动 Apache 服务以实施你所做的更改。输入以下命令重启 Apache:

sudo systemctl restart apache2

现在,你应该能够通过访问服务器的域名或 IP 地址而无需指定端口来访问你的 Django 站点。常规站点和管理员界面应该能够正常运行。

下一步

在确认你的应用程序可访问后,重要的是要保护应用程序的流量。

如果你的应用程序有一个域名,最简单的方式是使用 Let’s Encrypt 免费 SSL 证书来保护你的应用程序。请参考我们的 Let’s Encrypt 指南,了解如何在 16.04 上为 Apache 设置这个功能。

如果你的应用程序没有域名,并且仅用于个人目的或测试,你可以随时创建一个自签名证书。你可以参考我们的指南,在 Ubuntu 16.04 上为 Apache 创建自签名 SSL 证书。

结论

在本指南中,我们在自己的虚拟环境中设置了一个 Django 项目。我们使用 mod_wsgi 配置了 Apache 来处理客户端请求并与 Django 应用程序进行交互。

Django 通过提供许多常见组件,使得创建项目和应用程序变得简单,让你可以专注于独特的元素。通过利用本文中描述的通用工具链,你可以轻松地从单个服务器上提供你创建的应用程序。

猜你喜欢

转载自blog.csdn.net/rubys007/article/details/143277283