介绍
Django是一个强大的网络框架,可以帮助您快速获得您的Python应用程序或网站。 Django包括一个用于在本地测试代码的简化开发服务器,但是对于与生产有关的任何事情,需要一个更安全和更强大的Web服务器。
在本指南中,我们将演示如何在Python虚拟环境中安装和配置Django。 然后,我们将在我们的应用程序前设置Apache,以便它可以在将需要应用程序逻辑的请求传递到Django应用程序之前直接处理客户端请求。 我们将做到这一点使用mod_wsgi
Apache模块,可以通过WSGI接口规范和Django沟通。
先决条件和目标
为了完成这个指南,你应该有一个非root用户新鲜的Ubuntu 16.04服务器实例sudo
配置权限。 你可以学习如何通过我们的运行设置此服务器初始设置指南 。
我们将在Python虚拟环境中安装Django。 将Django安装到特定于您的项目的环境中将允许单独处理您的项目及其需求。
一旦我们的应用程序启动并运行,我们将配置Apache与Django应用程序接口。 它会做到这一点与mod_wsgi
Apache模块,可HTTP请求转换成一个被称为WSGI规范中定义的可预测的应用格式。 你可以通过阅读链接部分找到更多关于WSGI 本指南 。
让我们开始吧。
从Ubuntu存储库安装软件包
要开始该过程,我们将从Ubuntu存储库下载并安装我们需要的所有项目。 这将包括Apache Web服务器,则mod_wsgi
使用与我们的Django的应用接口模块,以及pip
,可以用来下载我们的Python相关的工具Python的包管理器。
要获得我们需要的一切,请更新服务器的本地包索引,然后安装相应的包。
如果您在使用Django使用Python 2,你所需要的命令是:
sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi
相反,如果你正在使用Django和Python 3,您将需要一个替代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
这将创建一个名为myprojectenv
你中myproject
目录。 在内部,它会安装Python和本地版本的本地版本pip
。 我们可以使用它为我们的项目安装和配置一个孤立的Python环境。
在我们安装我们项目的Python需求之前,我们需要激活虚拟环境。 你可以通过键入:
source myprojectenv/bin/activate
您的提示应该更改为表示您现在在Python虚拟环境中操作。 它看起来是这样的: ( myprojectenv ) user @ host :~/ myproject $
。
随着虚拟环境活跃,本地实例安装Django pip
:
pip
命令(不pip3
)。
pip install django
创建和配置新的Django项目
现在Django安装在我们的虚拟环境中,我们可以创建实际的Django项目文件。
创建Django项目
由于我们已经有一个项目目录,我们将告诉Django在这里安装文件。 它将创建一个具有实际代码的二级目录,这是正常的,并在此目录中放置一个管理脚本。 这一点的关键是在结束时告诉Django在当前目录中创建文件的点:
django-admin.py startproject myproject .
调整项目设置
我们应该对我们新创建的项目文件做的第一件事是调整设置。 使用文本编辑器打开设置文件:
nano myproject/settings.py
为了简单起见,我们将在本指南中使用默认的SQLite数据库,因此我们实际上不需要更改太多。 我们将专注于配置静态文件目录,其中Django将放置静态文件,以便Web服务器可以轻松地提供这些文件。
在文件的底部,我们将添加一行来配置此目录。 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
项目目录之内。
现在,我们可以调整我们的防火墙设置,以允许流量到我们的Django开发服务器,我们将在端口8000上运行。如果您按照先决条件中的初始服务器设置指南,您应该有当前启用UFW防火墙。
通过键入以下命令允许连接到开发服务器:
sudo ufw allow 8000
最后,您可以使用以下命令启动Django开发服务器来测试您的项目:
./manage.py runserver 0.0.0.0:8000
在Web浏览器,访问你的服务器的域名或IP地址后面:8000
:
http://server_domain_or_IP:8000
您应该会看到默认的Django索引页面:
如果您添加/admin
在地址栏中的URL的最后,你会被提示输入您已创建的管理员用户名和密码createsuperuser
命令:
验证后,您可以访问默认的Django管理界面:
当您完成浏览时,在终端窗口中按CTRL-C关闭开发服务器。
我们现在已经完成了Django,所以我们可以通过键入以下内容退出我们的虚拟环境:
deactivate
配置Apache
现在你的Django项目正在工作,我们可以配置Apache作为前端。 它接收客户端的连接将被翻译成Django的应用程序需要使用的WSGI格式mod_wsgi
模块。 这应该在早期安装时自动启用。
要配置WSGI传递,我们需要编辑默认的虚拟主机文件:
sudo nano /etc/apache2/sites-available/000-default.conf
我们可以保留文件中已经存在的指令。 我们只需要添加一些额外的项目。
首先,让我们配置静态文件。 我们将使用别名来告诉Apache映射开始的任何请求/static
我们的项目文件夹中的“静态”的目录。 我们早些时候收集了那些静态资产。 我们将设置别名,然后通过目录块授予对相关目录的访问权限:
<VirtualHost *:80>
. . .
Alias /static /home/sammy/myproject/static
<Directory /home/sammy/myproject/static>
Require all granted
</Directory>
</VirtualHost>
接下来,我们将授予访问wsgi.py
那里Django的代码存储在第二级项目目录中的文件。 为此,我们将使用一个目录部分,其中包含一个文件部分。 我们将授予对此嵌套构造中的文件的访问权限:
<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
我们需要再次调整防火墙。 我们不再需要端口8000打开,因为我们通过Apache代理,所以我们可以删除该规则。 然后我们可以添加一个异常,以允许流量到Apache进程:
sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'
检查您的Apache文件,以确保您没有犯任何语法错误:
sudo apache2ctl configtest
只要输出的最后一行看起来像这样,你的文件是在良好的形状:
Output. . .
Syntax OK
完成这些步骤后,您就可以重新启动Apache服务来实现所做的更改。 键入以下命令重新启动Apache:
sudo systemctl restart apache2
现在,您应该可以访问您的Django站点,方法是转到服务器的域名或IP地址,而无需指定端口。 常规站点和管理界面应按预期运行。
下一步
验证您的应用程序可访问后,确保应用程序的流量非常重要。
如果您有应用程序的域名,保护您的应用程序的最简单的方法是使用Let's Encrypt的免费SSL证书。 按照我们对16.04让我们为Apache加密指南 ,以了解如何设置起来。
如果你没有一个域名为您的应用程序,并使用这个自己的目的或为测试,你总是可以创建自签名证书。 你可以学习如何与我们的设置这对Ubuntu的16.04创建为Apache自签名的SSL证书指南 。
结论
在本指南中,我们在其自己的虚拟环境中设置了一个Django项目。 我们与配置Apachemod_wsgi
处理客户请求和接口与Django应用程序。
Django通过提供许多常用的部分来简化创建项目和应用程序,使您能够专注于独特的元素。 通过利用本文中描述的通用工具链,您可以轻松地从单个服务器提供您创建的应用程序。