如何使用Apache和mod_wsgi在Debian 8上配置Django应用程序

Django是一个强大的网络框架,可以帮助您快速获得您的Python应用程序或网站。 Django包括一个简化的开发服务器,用于在本地测试您的代码,但对于任何甚至与生产有关的,更安全和强大的Web ...

介绍

Django是一个强大的网络框架,可以帮助您快速获得您的Python应用程序或网站。 Django包括一个用于在本地测试代码的简化开发服务器,但是对于与生产有关的任何事情,需要一个更安全和更强大的Web服务器。 在本指南中,我们将演示如何在Python虚拟环境中安装和配置Django。 然后,我们将在我们的应用程序前设置Apache,以便它可以在将需要应用程序逻辑的请求传递到Django应用程序之前直接处理客户端请求。 我们将做到这一点使用mod_wsgi Apache模块,可以通过WSGI接口规范和Django沟通。

先决条件和目标

为了完成这个指南,你应该有一个非root用户耳目一新的Debian 8服务器实例sudo配置权限。 你可以学习如何通过我们的运行设置此服务器初始设置指南 。 我们将在Python虚拟环境中安装Django。将Django安装到特定于您的项目的环境中将允许单独处理您的项目及其需求。 一旦我们的应用程序启动并运行,我们将配置Apache与Django应用程序接口。它会做到这一点与mod_wsgi Apache模块,可HTTP请求转换成一个被称为WSGI规范中定义的可预测的应用格式。 你可以通过阅读链接部分找到更多关于WSGI 本指南 。 让我们开始吧。

从Debian存储库安装软件包

要开始该过程,我们将从Debian存储库下载并安装我们需要的所有项目。这将包括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
现在我们有来自Debian仓库的组件,我们可以开始处理我们的Django项目。

配置Python虚拟环境

第一步是创建一个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 ~/myproject/myprojectenv/bin/activate
您的提示应该更改为表示您现在在Python虚拟环境中操作。它看起来是这样的: ( myprojectenv ) user @ host :~/ myproject $ 。 随着虚拟环境活跃,本地实例安装Django pip注:虚拟环境中使用自己的Python和相关工具的版本。不管你是使用Python 2或Python 3,当虚拟环境中被激活,你应该使用pip命令(不pip3 )。
pip install django
这将在您的Python虚拟环境中安装Django软件包。

创建和配置新的Django项目

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

创建Django项目

既然我们已经在父项目目录~/ myproject ,我们会告诉Django在这里安装文件。该命令将创建包含实际代码的第二级目录。它还将在当前项目目录中放置一个管理脚本。实现正确的目录结构的关键是在项目名称后列出父目录:
django-admin.py startproject myproject ~/myproject
你应该得到一个目录结构,如下所示:
.
└── ./myproject/          # parent project directory
    ├── manage.py         # Django management script
    ├── myproject/            # project code directory
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── myprojectenv/     # project virtual environment directory
        └── . . .
检查您的目录结构是否与此匹配可以帮助最大限度地减少错误。

调整项目设置

我们应该对我们新创建的项目文件做的第一件事是调整设置。使用文本编辑器打开设置文件:
nano ~/myproject/myproject/settings.py
为了简单起见,我们将在本指南中使用默认的SQLite数据库,因此我们实际上不需要更改太多。我们将专注于配置允许的主机以限制我们响应的域并配置静态文件目录,其中Django将放置静态文件,以便Web服务器可以轻松地提供这些文件。 通过寻找开始ALLOWED_HOSTS线。 在方括号内,输入您的服务器的公共IP地址,域名或两者。 每个值都应该用引号括起来,并用逗号分隔,就像普通的Python列表一样。 它添加像本地地址是一个好主意127.0.0.1127.0.1.1 ,以及:
〜/ myproject / myproject / settings.py
. . .
ALLOWED_HOSTS = ["server_domain_or_IP", "127.0.0.1", "127.0.1.1"]
. . .
在文件的底部,我们将设置Django的STATIC_ROOT 。 Django可以收集所有静态资产并将其输出到已知目录中,以便Web服务器可以直接为其提供服务。我们将使用一点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 migrate
通过键入以下内容为项目创建管理用户:
./manage.py createsuperuser
您必须选择用户名,提供电子邮件地址,然后选择并确认密码。 我们可以收集所有的静态内容到我们和定义的目录位置STATIC_ROOT通过键入:
./manage.py collectstatic
您必须确认操作。正如预期的那样,静态文件将被放置在一个名为static项目目录之内。 您可能需要调整防火墙设置,以允许流量到我们的Django开发服务器,我们将在端口8000上运行。 如果你正在运行一个ufw防火墙,您可以通过键入允许通信端口8000:
sudo ufw allow 8000
如果您正在运行iptables相反,你需要确切的命令取决于您当前的防火墙配置。对于大多数配置,此命令应该工作:
sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
最后,您可以使用此命令启动Django开发服务器来测试您的项目:
./manage.py runserver 0.0.0.0:8000
在Web浏览器,访问你的服务器的域名或IP地址后面:8000
http://server_domain_or_IP:8000
您应该会看到默认的Django索引页面: Django默认索引 如果您添加/admin在地址栏中的URL的最后,你会被提示输入您已创建的管理员用户名和密码createsuperuser命令: Django管理员登录 验证后,您可以访问默认的Django管理界面: Django管理界面 当您完成浏览时,在终端窗口中按CTRL-C关闭开发服务器。 我们现在已经完成了Django,所以我们可以通过键入以下内容退出我们的虚拟环境:
deactivate
( myprojectenv )前缀为您的shell提示符应该消失。

配置Apache

现在你的Django项目正在工作,我们可以配置Apache作为前端。它接收客户端的连接将被翻译成Django的应用程序需要使用的WSGI格式mod_wsgi模块。这应该在早期安装时自动启用。 要配置WSGI传递,我们需要编辑默认的虚拟主机文件:
sudo nano /etc/apache2/sites-available/000-default.conf
我们可以保留文件中已经存在的指令。我们只需要添加一些额外的项目。 首先,让我们配置静态文件。我们将使用别名来告诉Apache映射开始的任何请求/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>

    # Next, add the following directory block
    <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文件:
/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
chmod 775 ~/myproject
之后,我们需要给Apache下运行组中, www-data组,文件的组所有权:
sudo chown :www-data ~/myproject/db.sqlite3
为了写入文件,我们还需要给数据库的父目录的Apache组所有权:
sudo chown :www-data ~/myproject
我们需要再次调整防火墙。我们不再需要端口8000打开,因为我们通过Apache代理,所以我们可以删除该规则。然后我们可以添加一个异常,以允许流量到Apache进程。 如果你正在使用ufw ,您可以通过键入做到这一点:
sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'
如果您在使用iptables ,适当的命令会是这个样子:
sudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
检查您的Apache文件,以确保您没有犯任何语法错误:
sudo apache2ctl configtest
只要输出的最后一行看起来像这样,你的文件是在良好的形状:
. . .
Syntax OK
完成这些步骤后,您就可以重新启动Apache服务来实现所做的更改。键入以下命令重新启动Apache:
sudo systemctl restart apache2
现在,您应该可以访问您的Django网站,只需转到服务器的域名或IP地址,而无需指定端口。常规站点和管理界面应按预期运行。

下一步

验证您的应用程序可访问后,确保应用程序的流量非常重要。 如果您有应用程序的域名,保护您的应用程序的最简单的方法是使用Let's Encrypt的免费SSL证书。按照我们Apache加密引导Debian 8 ,以了解如何设置。 如果你没有一个域名为您的应用程序,并使用这个自己的目的或为测试,你总是可以创建自签名证书。 你可以学习如何与我们的设置此Debian 8上创建Apache自签名SSL证书指南

结论

在本指南中,我们在其自己的虚拟环境中设置了一个Django项目。我们与配置Apachemod_wsgi处理客户请求和接口与Django应用程序。 Django通过提供许多常用的部分来简化创建项目和应用程序,使您能够专注于独特的元素。通过利用本文中描述的通用工具链,您可以轻松地从单个服务器提供您创建的应用程序。