Django 是一个功能强大的 Web 框架,可以帮助您快速启动 Python 应用程序或网站。 Django 包含一个简化的开发服务器,用于在本地测试代码,但对于任何与生产稍微相关的事情,都需要更安全、更强大的 Web 服务器。
在本指南中,我们将演示如何在 Python 虚拟环境中安装和配置 Django。然后,我们将在应用程序前面设置 Apache,以便它可以在将需要应用程序逻辑的请求传递到 Django 应用程序之前直接处理客户端请求。我们将使用mod_wsgi
Apache 模块,可以通过 WSGI 接口规范与 Django 进行通信。
为了完成本指南,您应该拥有一个新的 Ubuntu 16.04 服务器实例,其中包含一个非 root 用户sudo
已配置的权限。您可以通过运行我们的初始服务器设置指南.
我们将在 Python 虚拟环境中安装 Django。将 Django 安装到特定于您的项目的环境中将允许单独处理您的项目及其需求。
一旦我们的应用程序启动并运行,我们将配置 Apache 以与 Django 应用程序交互。它将通过mod_wsgi
Apache 模块,可以将 HTTP 请求转换为由 WSGI 规范定义的可预测的应用程序格式。您可以通过阅读以下链接部分了解有关 WSGI 的更多信息本指南.
让我们开始吧。
首先,我们将从 Ubuntu 存储库下载并安装所需的所有项目。这将包括 Apache Web 服务器、mod_wsgi
用于与我们的 Django 应用程序交互的模块,以及pip
,Python包管理器,可用于下载我们的Python相关工具。
要获得我们需要的一切,请更新服务器的本地包索引,然后安装适当的包。
如果您使用 DjangoPython 2,您需要的命令是:
-
sudo apt-get update
-
sudo apt-get installpython-pip apache2 libapache2-mod-wsgi
相反,如果您使用 DjangoPython 3,您将需要一个替代的 Apache 模块并且pip
包裹。在这种情况下,适当的命令是:
-
sudo apt-get update
-
sudo apt-get installpython3-pip apache2 libapache2-mod-wsgi-py3
现在我们已经有了 Ubuntu 存储库中的组件,我们可以开始开发 Django 项目了。第一步是创建一个 Python 虚拟环境,以便我们的 Django 项目将与系统工具以及我们可能正在处理的任何其他 Python 项目分开。
我们需要安装virtualenv
命令来创建这些环境。我们可以使用pip
.
如果您正在使用Python 2, type:
如果您正在使用Python 3, type:
With virtualenv
安装完毕后,我们就可以开始构建我们的项目了。创建一个您希望保存项目的目录并移入该目录:
-
mkdir ~/myproject
-
cd ~/myproject
在项目目录中,通过键入以下内容创建 Python 虚拟环境:
This will create a directory called myprojectenv
within your myproject
directory. Inside, it will install a local version of Python and a local version of pip
. We can use this to install and configure an isolated Python environment for our project.
在安装项目的 Python 要求之前,我们需要激活虚拟环境。您可以通过输入以下内容来做到这一点:
-
source myprojectenv/bin/activate
Your prompt should change to indicate that you are now operating within a Python virtual environment. It will look something like this: (myprojectenv)user@host:~/myproject$
.
在虚拟环境处于活动状态时,使用本地实例安装 Djangopip
:
Note
无论你使用的是Python 2还是Python 3,当虚拟环境激活时,我们应该使用pip
命令(不是pip3
).
现在 Django 已安装在我们的虚拟环境中,我们可以创建实际的 Django 项目文件。
由于我们已经有一个项目目录,我们将告诉 Django 将文件安装到此处。它将创建一个包含实际代码的二级目录(这是正常的),并在该目录中放置一个管理脚本。关键是末尾的点,它告诉 Django 在当前目录中创建文件:
- django-admin.py startproject myproject .
我们应该对新创建的项目文件做的第一件事是调整设置。使用文本编辑器打开设置文件:
-
nano myproject/settings.py
为了简单起见,我们将在本指南中使用默认的 SQLite 数据库,因此我们实际上不需要进行太多更改。我们将重点配置允许的主机以限制我们响应的域并配置静态文件目录,Django 将在其中放置静态文件,以便 Web 服务器可以轻松地提供这些文件。
首先找到ALLOWED_HOSTS
线。在方括号内,输入服务器的公共 IP 地址、域名或两者。每个值都应该用引号括起来并用逗号分隔,就像普通的 Python 列表一样:
〜/myproject/myproject/settings.py
. . .
ALLOWED_HOSTS = ["server_domain_or_IP"]
. . .
在文件的底部,我们将添加一行来配置该目录。 Django 使用STATIC_ROOT
设置以确定这些文件应存放的目录。我们将使用一些 Python 来告诉它使用项目主目录中名为“static”的目录:
〜/myproject/myproject/settings.py
. . .
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
完成后保存并关闭文件。
现在,我们可以使用管理脚本将初始数据库模式迁移到 SQLite 数据库:
-
cd ~/myproject
- ./manage.py makemigrations
- ./manage.py 迁移
通过键入以下内容为项目创建管理用户:
您必须选择用户名,提供电子邮件地址,然后选择并确认密码。
我们可以通过键入以下内容将所有静态内容收集到我们配置的目录位置:
您必须确认该操作。静态文件将放置在名为的目录中static
在您的项目目录中。
现在,我们可以调整防火墙设置以允许流量到达我们的 Django 开发服务器,我们将在端口 8000 上运行该服务器。如果您按照先决条件中的初始服务器设置指南进行操作,则当前应该启用 UFW 防火墙。
通过键入以下内容允许连接到开发服务器:
最后,您可以使用以下命令启动 Django 开发服务器来测试您的项目:
- ./manage.py 运行服务器0.0.0.0:8000
在您的网络浏览器中,访问您服务器的域名或 IP 地址,然后访问:8000
:
http://server_domain_or_IP:8000
您应该看到默认的 Django 索引页面:
![Django default index](https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/sample_site.png)
如果您附加/admin
在地址栏中 URL 的末尾,系统将提示您输入使用以下命令创建的管理用户名和密码createsuperuser
命令:
![Django admin login](https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_login.png)
身份验证后,您可以访问默认的 Django 管理界面:
![Django admin interface](https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_interface.png)
完成探索后,在终端窗口中按 CTRL-C 关闭开发服务器。
现在我们暂时完成了 Django 的使用,因此我们可以通过输入以下内容退出虚拟环境:
现在您的 Django 项目正在运行,我们可以将 Apache 配置为前端。它收到的客户端连接将被转换为 Django 应用程序期望的 WSGI 格式,使用mod_wsgi
模块。这应该在之前安装时自动启用。
要配置 WSGI pass,我们需要编辑默认虚拟主机文件:
-
sudo nano/etc/apache2/sites-available/000-default.conf
我们可以保留文件中已经存在的指令。我们只需要添加一些额外的项目。
首先,让我们配置静态文件。我们将使用别名来告诉 Apache 映射以以下开头的任何请求/static
到我们项目文件夹中的“static”目录。我们之前在那里收集了静态资源。我们将设置别名,然后使用目录块授予对相关目录的访问权限:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
. . .
Alias /static /home/sammy/myproject/static
<Directory /home/sammy/myproject/static>
Require all granted
</Directory>
</VirtualHost>
接下来,我们将授予访问权限wsgi.py
文件位于存储 Django 代码的二级项目目录中。为此,我们将使用一个目录部分,其中包含一个文件部分。我们将授予对此嵌套结构内部文件的访问权限:
/etc/apache2/sites-available/000-default.conf
<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
指令来设置它。
This directive takes an arbitrary name for the process. We’ll use myproject
to stay consistent. Afterwards, we set up the Python home where Apache can find all of the components that may be required. Since we used a virtual environment, we can point this directly to our base virtual environment directory. Afterwards, we set the Python path to point to the base of our Django project.
接下来,我们需要指定进程组。这应该指向我们为WSGIDaemonProcess
指令(myproject
在我们的例子中)。最后,我们需要设置脚本别名,以便 Apache 将对根域的请求传递给wsgi.py
file:
/etc/apache2/sites-available/000-default.conf
<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
group,文件的组所有权:
-
sudo chown :www-data ~/myproject/db.sqlite3
为了写入文件,我们还需要授予 Apache 组对数据库父目录的所有权:
-
sudo chown :www-data ~/myproject
我们需要再次调整防火墙。由于我们通过 Apache 进行代理,因此我们不再需要打开端口 8000,因此我们可以删除该规则。然后我们可以添加一个例外以允许流量流向 Apache 进程:
-
sudoufw 删除允许8000
-
sudoUFW 允许“阿帕奇完整版”
检查您的 Apache 文件以确保没有出现任何语法错误:
只要最后一行输出如下所示,您的文件就状态良好:
Output
. . .
Syntax OK
完成这些步骤后,您就可以重新启动 Apache 服务以实施您所做的更改。输入以下命令重新启动 Apache:
-
sudosystemctl 重新启动 apache2
现在,您应该能够通过服务器的域名或 IP 地址来访问您的 Django 站点,而无需指定端口。常规站点和管理界面应按预期运行。
验证您的应用程序可访问后,确保应用程序的流量安全非常重要。
如果您的应用程序有域名,那么保护应用程序安全的最简单方法是使用 Let’s Encrypt 提供的免费 SSL 证书。关注我们的Let's Encrypt Apache 16.04 指南了解如何进行设置。
If you do not拥有您的应用程序的域名,并且将其用于您自己的目的或用于测试,您始终可以创建自签名证书。您可以通过我们的网站了解如何进行设置在 Ubuntu 16.04 上为 Apache 创建自签名 SSL 证书的指南.
在本指南中,我们在自己的虚拟环境中设置了一个 Django 项目。我们已经配置了 Apachemod_wsgi
处理客户端请求并与 Django 应用程序交互。
Django 通过提供许多通用部分使创建项目和应用程序变得简单,使您能够专注于独特的元素。通过利用本文中描述的通用工具链,您可以轻松地为从单个服务器创建的应用程序提供服务。