如何在 Debian 8 上使用 Apache 和 mod_wsgi 服务 Django 应用程序

介绍

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

在本指南中,我们将展示如何在Python虚拟环境中安装和配置Django,然后在我们的应用程序前设置Apache,以便它可以直接处理客户端请求,然后将需要应用程序逻辑的请求传递给Django应用程序。

前提和目标

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

将 Django 安装在 Python 虚拟环境中,将 Django 安装到您项目的特定环境中,将允许您单独处理您的项目及其需求。

一旦我们的应用程序启动并运行,我们会将Apache配置为与Django应用程序的接口,它将使用mod_wsgi的Apache模块,该模块可以将HTTP请求转换为可预测的应用程序格式,由一个名为WSGI的规范定义。

让我们开始吧。

从 Debian 存储库中安装软件包

要开始这个过程,我们将从 Debian 存储库下载并安装我们所需的所有项目,其中包括 Apache 网页服务器、用于与 Django 应用程序交互的mod_wsgi模块和pip Python 包管理器,可用于下载我们的 Python 相关工具。

要获得我们需要的一切,请更新您的服务器的本地包索引,然后安装相应的包。

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

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

相反,如果您正在使用 Django 与 Python 3,您将需要一个替代的 Apache 模块和 pip 包。

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

现在我们有来自 Debian 存储库的组件,我们可以开始在 Django 项目上工作。

创建 Python 虚拟环境

第一步是创建一个Python虚拟环境,使我们的Django项目与系统的工具和我们可能正在工作的其他Python项目分开,我们需要安装virtualenv命令来创建这些环境。

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

1sudo pip install virtualenv

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

1sudo pip3 install virtualenv

安装了virtualenv,我们可以开始创建我们的项目. 创建一个目录,您希望保留您的项目,并进入目录:

1mkdir ~/myproject
2cd ~/myproject

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

1virtualenv myprojectenv

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

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

1source ~/myproject/myprojectenv/bin/activate

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

如果您的虚拟环境是活跃的,请使用本地实例pip安装 Django:

<$>[注] **注:**虚拟环境使用自己的Python版本和相关工具,无论您是否使用Python 2或Python 3,当虚拟环境被激活时,您应该使用pip命令(而不是pip3).

1pip install django

这将在您的Python虚拟环境中安装Django包。

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

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

创建 Django 项目

由于我们已经在~/myproject上有一个主项目目录,我们会告诉Django在这里安装文件。命令将创建一个包含实际代码的二级目录。它还会将管理脚本放入当前的项目目录。实现正确目录结构的关键是在项目名称后列出主目录:

1django-admin.py startproject myproject ~/myproject

您应该最终找到一个看起来像这样的目录结构:

 1.
 2└── ./myproject/			# parent project directory
 3    ├── manage.py			# Django management script
 4    ├── myproject/			# project code directory
 5    │   ├── __init__.py
 6    │   ├── settings.py
 7    │   ├── urls.py
 8    │   └── wsgi.py
 9    └── myprojectenv/		# project virtual environment directory
10        └── . . .

检查您的目录结构是否与此相一致,可以帮助稍后减少错误。

调整项目设置

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

1nano ~/myproject/myproject/settings.py

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

在方块中,输入您的服务器的公共IP地址、域名或两者,每个值都应该被引用包裹,并像正常的Python列表一样分开一个字节。

1[label ~/myproject/myproject/settings.py]
2. . .
3ALLOWED_HOSTS = ["server_domain_or_IP", "127.0.0.1", "127.0.1.1"]
4. . .

在文件的底部,我们将设置Django的STATIC_ROOT。Django可以收集和输出所有静态资产到已知的目录,以便Web服务器可以直接服务它们。

1[label ~/myproject/myproject/settings.py]
2. . .
3
4STATIC_URL = '/static/'
5STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

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

完整的初始项目设置

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

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

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

1./manage.py createsuperuser

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

我们可以将所有静态内容收集到我们用STATIC_ROOT定义的目录位置,键入:

1./manage.py collectstatic

正如预期的那样,静态文件将在项目目录中的名为静态的目录中放置。

您可能需要调整防火墙设置以允许流量到我们的Django开发服务器,我们将在端口8000上运行。

如果您正在运行ufw防火墙,您可以通过键入以下方式允许流量到端口 8000:

1sudo ufw allow 8000

如果您正在运行iptables,则所需的准确命令取决于当前的防火墙配置。

1sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

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

1./manage.py runserver 0.0.0.0:8000

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

1http://server_domain_or_IP:8000

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

Django default index

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

Django admin login

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

Django admin interface

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

我们现在已经完成了Django,所以我们可以通过键入退出我们的虚拟环境:

1deactivate

你的壳提示的(myprojectenv)前缀应该消失。

Apache 配置

现在你的Django项目正在运行,我们可以将Apache配置为前端.它接收的客户端连接将被翻译成Django应用程序使用mod_wsgi模块所期望的WSGI格式。

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

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

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

首先,让我们配置静态文件,我们会使用一个字母来告诉Apache将任何从/static开始的请求映射到我们项目文件夹中的静态目录。

 1[label /etc/apache2/sites-available/000-default.conf]
 2<VirtualHost *:80>
 3    . . .
 4
 5    Alias /static /home/sammy/myproject/static
 6    <Directory /home/sammy/myproject/static>
 7        Require all granted
 8    </Directory>
 9
10</VirtualHost>

接下来,我们将允许访问第二级项目目录中的wsgi.py文件,其中存储了Django代码。 为了做到这一点,我们将使用一个目录部分,里面有一个文件部分。

 1[label /etc/apache2/sites-available/000-default.conf]
 2<VirtualHost *:80>
 3    . . .
 4
 5    Alias /static /home/sammy/myproject/static
 6    <Directory /home/sammy/myproject/static>
 7        Require all granted
 8    </Directory>
 9
10    # Next, add the following directory block
11    <Directory /home/sammy/myproject/myproject>
12        <Files wsgi.py>
13            Require all granted
14        </Files>
15    </Directory>
16
17</VirtualHost>

配置后,我们准备好构建实际处理 WSGI 通道的文件部分,我们将使用 daemon 模式运行 WSGI 流程,这是推荐的配置。

此指令对这个过程采用任意的名称。我们将使用myproject来保持一致性。之后,我们设置了Python主页,在那里Apache可以找到可能需要的所有组件。由于我们使用了虚拟环境,我们可以直接指向我们的基本虚拟环境目录。

接下来,我们需要指定进程组,这应该指向我们选择的WSGIDaemonProcess指令(在我们的情况下是myproject)的相同名称。

 1[label /etc/apache2/sites-available/000-default.conf]
 2<VirtualHost *:80>
 3    . . .
 4
 5    Alias /static /home/sammy/myproject/static
 6    <Directory /home/sammy/myproject/static>
 7        Require all granted
 8    </Directory>
 9
10    <Directory /home/sammy/myproject/myproject>
11        <Files wsgi.py>
12            Require all granted
13        </Files>
14    </Directory>
15
16    WSGIDaemonProcess myproject python-home=/home/sammy/myproject/myprojectenv python-path=/home/sammy/myproject
17    WSGIProcessGroup myproject
18    WSGIScriptAlias / /home/sammy/myproject/myproject/wsgi.py
19
20</VirtualHost>

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

解决一些许可问题

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

要做到这一点,第一步是更改权限,以便数据库的组所有者可以阅读和写入。

1chmod 664 ~/myproject/db.sqlite3
2chmod 775 ~/myproject

接下来,我们需要给 Apache 组运行在下面的www-data组,组所有权的文件:

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

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

1sudo chown :www-data ~/myproject

我们不再需要打开端口 8000,因为我们正在通过Apache代理,所以我们可以删除这个规则,然后我们可以添加一个例外来允许流量到Apache流程。

如果你正在使用ufw,你可以通过键入这样做:

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

如果您使用iptables,相应的命令将看起来像这样:

1sudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPT
2sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

检查您的 Apache 文件,以确保您没有做任何语法错误:

1sudo apache2ctl configtest

只要最后一行输出看起来像这个样子,你的文件仍处于良好状态:

1[secondary_label Output]
2. . .
3Syntax OK

完成这些步骤后,您将准备重新启动 Apache 服务,以实现所做的更改。

1sudo systemctl restart apache2

您现在应该能够访问您的 Django 网站,通过访问您的服务器的域名或 IP 地址而无需指定端口。

下一步

验证您的应用程序是否可访问后,重要的是确保对您的应用程序的流量。

如果你有一个域名,你的应用程序,最简单的方式来保护你的应用程序是通过免费的SSL证书从Let's Encrypt. 遵循我们的 Let's Encrypt指南为Apache在Debian 8学习如何设置这个。

如果您 没有您的应用程序的域名,并且正在使用它为自己的目的或测试,您可以随时创建一个自签证书。

结论

在本指南中,我们已经在自己的虚拟环境中设置了Django项目,我们已将Apache配置为mod_wsgi,以处理客户端请求和与Django应用程序的界面。

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

Published At
Categories with 技术
comments powered by Disqus