在 CentOS 7上使用 Apache 和 mod_wsgi 部署 Django 应用的方法

简介

Django 是一个强大的 Web 框架,可以帮助您快速启动 Python 应用程序或网站。Django 包括一个简化的开发服务器,用于在本地测试代码,但对于任何与生产相关的事情,都需要一个更安全和功能强大的 Web 服务器。

在本指南中,我们将演示如何在 CentOS 7 上在 Python 虚拟环境中安装和配置 Django。然后,我们将设置 Apache 在我们的应用程序前面,以便它可以直接处理客户端请求,然后将需要应用程序逻辑的请求传递给 Django 应用程序。我们将使用 mod_wsgi Apache 模块来实现这一点,该模块可以通过 WSGI 接口规范与 Django 进行通信。

先决条件和目标

要完成本指南,您应该有一个全新的 CentOS 7 服务器实例,并配置了一个具有 sudo 权限的非根用户。您可以通过运行我们的初始服务器设置指南来了解如何设置。

我们将在 Python 虚拟环境中安装 Django。将 Django 安装到与您的项目特定的环境中,可以使您的项目及其要求得到分开处理。

一旦我们的应用程序运行起来,我们将配置 Apache 与 Django 应用程序进行交互。它将使用 mod_wsgi Apache 模块来实现这一点,该模块可以将 HTTP 请求转换为由一个名为 WSGI 的规范定义的可预测的应用程序格式。您可以通过阅读本指南中的链接部分了解更多关于 WSGI 的信息。

让我们开始吧。

从 CentOS 和 EPEL 存储库安装软件包

要开始这个过程,我们将从我们发行版的存储库中下载并安装我们需要的所有项目。这将包括 Apache Web 服务器、用于与我们的 Django 应用程序进行交互的 mod_wsgi 模块,以及 pip,这是可以用来下载我们的 Python 相关工具的 Python 包管理器。

要获取 pip,我们需要启用 EPEL 存储库,该存储库包含一些额外的软件包。您可以通过输入以下命令轻松完成:

sudo yum install epel-release

启用了 EPEL 存储库后,我们可以通过输入以下命令来安装我们需要的组件:

sudo yum install python-pip httpd mod_wsgi

配置 Python 虚拟环境

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

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

sudo pip install virtualenv

安装了 virtualenv 后,我们可以开始形成我们的项目。创建一个您希望保存项目的目录,并进入该目录:

mkdir ~/myproject
cd ~/myproject

在项目目录中,通过输入以下命令创建一个 Python 虚拟环境:

virtualenv myprojectenv

这将在您的 myproject 目录中创建一个名为 myprojectenv 的目录。在其中,它将安装一个本地版本的 Python 和一个本地版本的 pip。我们可以使用这个来为我们的项目安装和配置一个隔离的 Python 环境。

在安装项目的 Python 要求之前,我们需要激活虚拟环境。您可以通过输入以下命令来执行:

source myprojectenv/bin/activate

您的提示符应该会更改,指示您现在正在一个 Python 虚拟环境中操作。它看起来应该像这样:(myprojectenv)user@host:~/myproject$

在虚拟环境激活状态下,通过输入以下命令使用本地的 pip 安装 Django:

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_ROOT = os.path.join(BASE_DIR, "static/")

完成后保存并关闭文件。

完成初始项目设置

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

cd ~/myproject
./manage.py makemigrations
./manage.py migrate

通过输入以下命令为项目创建一个管理员用户:

./manage.py createsuperuser

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

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

./manage.py collectstatic

您将需要确认操作。静态文件将被放置在项目目录中名为 static 的目录中。

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

./manage.py runserver 0.0.0.0:8000

在您的网络浏览器中,访问您服务器的域名或 IP 地址,后面加上 :8000

http://server_domain_or_IP:8000

您应该会看到默认的 Django 首页:

Django default index

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

Django admin login

认证后,您可以访问默认的 Django 管理界面:

Django admin interface

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

现在我们暂时完成了 Django 的工作,因此我们可以通过输入以下命令退出虚拟环境:

deactivate

配置 Apache

现在您的 Django 项目正在运行,我们可以将 Apache 配置为前端。它接收到的客户端连接将使用 mod_wsgi 模块转换为 Django 应用程序期望的 WSGI 格式。这应该在之前的安装过程中已自动启用。

要配置 WSGI 传递,我们需要创建一个新的配置文件来定义 WSGI 传递。使用 sudo 权限在 /etc/httpd/conf.d 目录中创建并打开一个名为 django.conf 的文件:

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

首先,让我们配置静态文件。我们将使用别名告诉 Apache 将任何以 /static 开头的请求映射到我们项目文件夹中的 “static” 目录。我们之前在那里收集了静态资产。我们将设置别名,然后使用目录块授予对应目录的访问权限:

Alias /static /home/user/myproject/static
<Directory /home/user/myproject/static>
    Require all granted
</Directory>

接下来,我们将授予对存储 Django 代码的第二级项目目录中的 wsgi.py 文件的访问权限。为此,我们将使用一个带有文件部分的目录部分。我们将在这个嵌套结构内授予对文件的访问权限:

Alias /static /home/user/myproject/static
<Directory /home/user/myproject/static>
    Require all granted
</Directory>

<Directory /home/user/myproject/myproject>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

配置完成后,我们准备构建实际处理 WSGI 传递的文件部分。我们将使用守护程序模式来运行 WSGI 进程,这是推荐的配置。我们可以使用 WSGIDaemonProcess 指令来设置这一点。

该指令接受一个进程的任意名称。我们将使用 myproject 保持一致。然后,我们设置 Apache 可以找到可能需要的所有组件的 Python 路径。由于我们使用了虚拟环境,我们将不得不设置两个路径组件。第一个是我们项目的父目录,其中可以找到项目文件。第二个是虚拟环境文件夹中的 lib/pythonx.x/site-packages 路径(其中的 X 被 Python 版本号组件替换)。这样,Apache 就可以找到运行项目所需的所有其他 Python 代码。

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

Alias /static /home/user/myproject/static
<Directory /home/user/myproject/static>
    Require all granted
</Directory>

<Directory /home/user/myproject/myproject>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

WSGIDaemonProcess myproject python-path=/home/user/myproject:/home/user/myproject/myprojectenv/lib/python2.7/site-packages
WSGIProcessGroup myproject
WSGIScriptAlias / /home/user/myproject/myproject/wsgi.py

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

处理一些权限问题

接下来,我们需要修复一些权限设置,以便 Apache 服务可以访问我们的文件。默认情况下,CentOS 对每个用户的主目录进行了严格的限制。为了解决这个问题,我们将把 apache 用户添加到我们自己的用户组中。这样我们就可以适当地放开权限,让它可以访问到相应的文件。

使用以下命令将 apache 用户添加到你的用户组中。将命令中的 user 替换为你自己的用户名:

sudo usermod -a -G user apache

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

chmod 710 /home/user

这将使 Apache 有能力进入我们的主目录。

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

首先,我们需要更改权限,以便数据库的组所有者可以读取和写入。默认情况下,数据库文件名为 db.sqlite3,应该位于你的基础项目目录中:

chmod 664 ~/myproject/db.sqlite3

之后,我们需要将文件的组所有权交给 Apache 运行的组,即 apache 组:

sudo chown :apache ~/myproject/db.sqlite3

为了对文件进行写入,我们还需要将数据库的父目录的组所有权交给 Apache 组:

sudo chown :apache ~/myproject

完成这些步骤后,你就可以启动 Apache 服务了。输入以下命令:

sudo systemctl start httpd

现在,你应该能够通过访问服务器的域名或 IP 地址而无需指定端口来访问你的 Django 站点。常规站点和管理界面应该能够正常运行。

如果一切正常,你可以启用 Apache 服务,使其在启动时自动启动:

sudo systemctl enable httpd

结论

在本指南中,我们在其自己的虚拟环境中设置了一个 Django 项目。我们使用 mod_wsgi 配置了 Apache 来处理客户端请求并与 Django 应用程序进行交互。

Django 通过提供许多常见组件,使创建项目和应用程序变得简单,让你可以专注于独特的元素。通过利用本文中描述的通用工具链,你可以轻松地从单个服务器上提供你创建的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/373942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPTs保姆级教程之实践

GPTs什么 使用GPTs的前提&#xff1a;ChatGPT Plus帐号 GTPs的作用&#xff1a;把我们和GPT对话的prompt&#xff0c;封装起来成为一个“黑匣子”。 主要有两个作用&#xff1a; 1、避免反复输入prompt&#xff0c;“黑匣子”打开&#xff0c;输入问题即可使用 2、在别人可以…

爬虫实战--人民网

文章目录 前言发现宝藏 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0c;文章中如果有记录错误&#xff0c;欢迎读者朋友们…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

手拉手Vue3+vite引入echarts

技术栈springboot3hutool-alloshi-coreVue3viteechartsTailwindCSS软件版本IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1hutool-all5.8.18oshi-core6.4.1Vue35.0.10vite5.0.10axios1.6.7echarts5.4.3 ECharts是一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅…

苹果手机如何录屏?这里告诉你答案!

苹果公司的iPhone以其卓越的性能和用户体验受到了全球消费者的喜爱&#xff0c;而录屏功能作为手机的一项重要功能&#xff0c;能够帮助我们记录手机屏幕上的操作&#xff0c;分享游戏技巧、制作教程视频等。本文将为您介绍苹果手机如何录屏&#xff0c;帮助您更好地掌握录屏技…

Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接...问题解决方法之一

一、问题描述 将Redis压缩包解压后&#xff0c;安装Redis过程中出现问题Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝&#xff0c;无法连接... 官网windows下redis开机自启动的指令如下&#xff1a; 1、在redis目录下执行 redis-server --service-in…

【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

第五大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 第五届大数据、人工智能与软件工程国际研讨会&…

电脑虚拟内存怎么设置?1分钟快速增加内存!

“我电脑里的内存好像不太够用&#xff0c;因此&#xff0c;我想在电脑里增加一些虚拟内存。不知道我应该怎么操作呢&#xff1f;有什么比较简单的此操作方法吗&#xff1f;” 虚拟内存是计算机系统内存管理的一种技术&#xff0c;它为程序提供了一个比实际物理内存更大的内存空…

C#用Array类的FindAll方法和List<T>类的Add方法按关键词在数组中检索元素并输出

目录 一、使用的方法 1. Array.FindAll(T[], Predicate) 方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 2.List类的常用方法 &#xff08;1&#xff09;List.Add(T) 方法 &#xff08;2&#xff09;List.RemoveAt(Int32) 方法 &#xff08;3&…

C++判断二叉树是否对称

可以使用递归的方式判断二叉树是否对称。判断二叉树是否为空&#xff0c;若为空则返回 true。然后编写一个辅助函数 isSymmetricHelper&#xff0c;该函数接受两个参数&#xff0c;分别是左子树和右子树。在 isSymmetricHelper 函数中&#xff0c;判断左子树的左子树和右子树的…

挑战杯 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

C++学习Day04之this指针

目录 一、程序及输出1.1 基础使用1.2 *this和链式编程1.2.1 返回引用进行链式编程1.2.2 返回值进行链式编程1.3 注意事项 二、分析与总结 一、程序及输出 在 C 中使用类的成员函数时&#xff0c;可以使用 this 指针来引用当前对象的地址。this 指针是一个隐式参数&#xff0c;它…

基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 损失函数和优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................…

代码随想录 Leetcode47. 全排列 II

题目&#xff1a; 代码(首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracing(vector<int>& nums, vector<bool>& used1, vector<bool>…

leetcode 算法 67.二进制求和(python版)

需求 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 代码 class Solution…

使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序

对于在线客服与营销系统&#xff0c;客服端指的是后台提供服务的客服或营销人员&#xff0c;他们使用客服程序在后台观察网站的被访情况&#xff0c;开展营销活动或提供客户服务。在本篇文章中&#xff0c;我将详细介绍如何通过 WPF Chrome 内核的方式实现复合客服端应用程序。…

聚观早报 | 小米14 Ultra官宣;苹果汽车项目调整

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 2月6日消息 小米14 Ultra官宣 苹果汽车项目调整 ROG游戏手机8系列推出福利 一加Ace 3原神刻晴定制机官宣 苹果i…

vite+vue3发布自己的npm组件+工具函数

记录一下个人最近一次发布npm组件的过程&#xff1a; 一、创建组件和工具函数 执行命令创建一个空项目&#xff1a; npm create vite 创建过程稍微有些慢&#xff0c;不知何故&#xff1f;其中选择vue , 个人暂时使用的JS 。在 src 目录下面创建一个文件 package 存放组件和公…

计算机网络-差错控制(纠错编码 海明码 纠错方法)

文章目录 纠错编码-海明码海明距离1.确定校验码位数r2.确定校验码和数据的位置3.求出校验码的值4.检错并纠错纠错方法1纠错方法2 小结 纠错编码-海明码 奇偶校验码&#xff1a;只能发现错误不能找到错误位置和纠正错误 海明距离 如果找到码距为1&#xff0c;那肯定为1了&…

K8S之标签的介绍和使用

标签 标签定义标签实操1、对Node节点打标签2、对Pod资源打标签查看资源标签删除资源标签 标签定义 标签就是一对 key/value &#xff0c;被关联到对象上。 标签的使用让我们能够表示出对象的特点&#xff0c;比如使用在Pod上&#xff0c;能一眼看出这个Pod是干什么的。也可以用…