如何在 CentOS 7 上使用 Apache 和 mod_wsgi 服务 Django 应用程序

介绍

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

在本指南中,我们将展示如何在 CentOS 7 上安装和配置 Python 虚拟环境中的 Django。

前提和目标

要完成本指南,您应该有一个新的 CentOS 7 服务器实例,具有非根用户的sudo特权配置. 您可以通过仔细阅读我们的 初始服务器设置指南来学习如何设置此设置。

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

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

让我们开始吧。

从 CentOS 和 EPEL Repos 安装包

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

要获得pip,我们需要启用EPEL存储库,这就像一些额外的包一样。

1sudo yum install epel-release

通过启用EPEL,我们可以通过键入所需的组件来安装:

1sudo yum install python-pip httpd mod_wsgi

创建 Python 虚拟环境

现在我们已经从存储库中获得了组件,我们可以开始在我们的Django项目上工作,第一步是创建一个Python虚拟环境,使我们的Django项目与系统的工具和我们可能正在工作的其他Python项目分开。

我们需要安装virtualenv命令来创建这些环境,我们可以使用pip来获得:

1sudo pip install virtualenv

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

1mkdir ~/myproject
2cd ~/myproject

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

1virtualenv myprojectenv

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

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

1source myprojectenv/bin/activate

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

如果您的虚拟环境是活跃的,请通过键入pip的本地实例来安装 Django:

1pip install django

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

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

创建 Django 项目

由于我们已经有一个项目目录,我们会告诉Django在这里安装文件,它将创建一个与实际代码的第二级目录,这是正常的,并在该目录中放置一个管理脚本。

1django-admin.py startproject myproject .

调整项目设置

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

1nano myproject/settings.py

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

在文件的底部,我们将添加一个行来配置此目录。Django使用STATIC_ROOT设置来确定这些文件应该去的目录。

1STATIC_ROOT = os.path.join(BASE_DIR, "static/")

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

完整的初始项目设置

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

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

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

1./manage.py createsuperuser

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

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

1./manage.py collectstatic

静态文件将在您的项目目录中放置在名为静态的目录中。

最后,您可以通过使用以下命令启动 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

Apache 配置

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

要配置 WSGI 通行,我们需要创建一个新的配置文件,定义 WSGI 通行. 在 /etc/httpd/conf.d 目录中创建并打开具有 sudo 特权的文件. 我们将这个文件称为 django.conf:

1sudo nano /etc/httpd/conf.d/django.conf

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

1Alias /static /home/user/myproject/static
2<Directory /home/user/myproject/static>
3    Require all granted
4</Directory>

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

 1Alias /static /home/user/myproject/static
 2<Directory /home/user/myproject/static>
 3    Require all granted
 4</Directory>
 5
 6<Directory /home/user/myproject/myproject>
 7    <Files wsgi.py>
 8        Require all granted
 9    </Files>
10</Directory>

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

此指令对这个过程采用任意的名称。我们将使用myproject来保持一致性。之后,我们设置了Python路径,在那里Apache可以找到可能需要的所有组件。由于我们使用了虚拟环境,我们将不得不设置两个路径组件。第一是我们项目的母目目录,在那里可以找到项目文件。第二是我们虚拟环境文件夹中的lib/pythonx.x/site-packages路径(在那里Xs被Python版本号组件取代)。

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

 1Alias /static /home/user/myproject/static
 2<Directory /home/user/myproject/static>
 3    Require all granted
 4</Directory>
 5
 6<Directory /home/user/myproject/myproject>
 7    <Files wsgi.py>
 8        Require all granted
 9    </Files>
10</Directory>
11
12WSGIDaemonProcess myproject python-path=/home/user/myproject:/home/user/myproject/myprojectenv/lib/python2.7/site-packages
13WSGIProcessGroup myproject
14WSGIScriptAlias / /home/user/myproject/myproject/wsgi.py

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

解决一些许可问题

接下来,我们需要修复几个权限集,以便Apache服务可以访问我们的文件。默认情况下,CentOS非常限制地锁定每个用户的主目录。 为了绕过这一点,我们将apache用户添加到我们自己的用户组中。

用以下命令将apache用户添加到您的组中,以命令中的用户代替您自己的用户名:

1sudo usermod -a -G user apache

现在,我们可以给我们的用户组在我们的主目录上执行权限,这将允许Apache进程进入和访问以下内容:

1chmod 710 /home/user

这将使Apache能够进入我们的家庭目录。

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

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

1chmod 664 ~/myproject/db.sqlite3

之后,我们需要给该组Apache运行在下,该组apache,该组的文件所有权:

1sudo chown :apache ~/myproject/db.sqlite3

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

1sudo chown :apache ~/myproject

完成这些步骤后,您将准备启动 Apache 服务。

1sudo systemctl start httpd

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

如果一切按预期工作,您可以启用Apache服务,以便它在启动时自动启动:

1sudo systemctl enable httpd

结论

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

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

Published At
Categories with 技术
comments powered by Disqus