如何在 Ubuntu 16.04 上使用 Apache 和 mod_wsgi 为 Django 应用程序提供服务

2023-11-07

介绍

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

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

先决条件和目标

为了完成本指南,您应该拥有一个新的 Ubuntu 16.04 服务器实例,其中包含一个非 root 用户sudo已配置的权限。您可以通过运行我们的初始服务器设置指南.

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

一旦我们的应用程序启动并运行,我们将配置 Apache 以与 Django 应用程序交互。它将通过mod_wsgiApache 模块,可以将 HTTP 请求转换为由 WSGI 规范定义的可预测的应用程序格式。您可以通过阅读以下链接部分了解有关 WSGI 的更多信息本指南.

让我们开始吧。

从 Ubuntu 存储库安装软件包

首先,我们将从 Ubuntu 存储库下载并安装所需的所有项目。这将包括 Apache Web 服务器、mod_wsgi用于与我们的 Django 应用程序交互的模块,以及pip,Python包管理器,可用于下载我们的Python相关工具。

要获得我们需要的一切,请更新服务器的本地包索引,然后安装适当的包。

如果您使用 DjangoPython 2,您需要的命令是:

  1. sudo apt-get update
  2. sudo apt-get installpython-pip apache2 libapache2-mod-wsgi

相反,如果您使用 DjangoPython 3,您将需要一个替代的 Apache 模块并且pip包裹。在这种情况下,适当的命令是:

  1. sudo apt-get update
  2. sudo apt-get installpython3-pip apache2 libapache2-mod-wsgi-py3

配置Python虚拟环境

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

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

如果您正在使用Python 2, type:

  1. sudo pip install虚拟环境

如果您正在使用Python 3, type:

  1. sudo pip3 install虚拟环境

With virtualenv安装完毕后,我们就可以开始构建我们的项目了。创建一个您希望保存项目的目录并移入该目录:

  1. mkdir ~/myproject
  2. cd ~/myproject

在项目目录中,通过键入以下内容创建 Python 虚拟环境:

  1. virtualenv myprojectenv

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 要求之前,我们需要激活虚拟环境。您可以通过输入以下内容来做到这一点:

  1. 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).

  1. pip install django

创建并配置新的 Django 项目

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

创建 Django 项目

由于我们已经有一个项目目录,我们将告诉 Django 将文件安装到此处。它将创建一个包含实际代码的二级目录(这是正常的),并在该目录中放置一个管理脚本。关键是末尾的点,它告诉 Django 在当前目录中创建文件:

  1. django-admin.py startproject myproject .

调整项目设置

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

  1. 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 数据库:

  1. cd ~/myproject
  2. ./manage.py makemigrations
  3. ./manage.py 迁移

通过键入以下内容为项目创建管理用户:

  1. ./manage.py 创建超级用户

您必须选择用户名,提供电子邮件地址,然后选择并确认密码。

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

  1. ./manage.py 收集静态

您必须确认该操作。静态文件将放置在名为的目录中static在您的项目目录中。

现在,我们可以调整防火墙设置以允许流量到达我们的 Django 开发服务器,我们将在端口 8000 上运行该服务器。如果您按照先决条件中的初始服务器设置指南进行操作,则当前应该启用 UFW 防火墙。

通过键入以下内容允许连接到开发服务器:

  1. sudoUFW 允许8000

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

  1. ./manage.py 运行服务器0.0.0.0:8000

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

http://server_domain_or_IP:8000

您应该看到默认的 Django 索引页面:

Django default index

如果您附加/admin在地址栏中 URL 的末尾,系统将提示您输入使用以下命令创建的管理用户名和密码createsuperuser命令:

Django admin login

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

Django admin interface

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

现在我们暂时完成了 Django 的使用,因此我们可以通过输入以下内容退出虚拟环境:

  1. 停用

配置阿帕奇

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

要配置 WSGI pass,我们需要编辑默认虚拟主机文件:

  1. 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默认情况下,它应该位于您的基本项目目录中:

  1. chmod 664 ~/myproject/db.sqlite3

然后,我们需要给 Apache 运行的组,即www-datagroup,文件的组所有权:

  1. sudo chown :www-data ~/myproject/db.sqlite3

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

  1. sudo chown :www-data ~/myproject

我们需要再次调整防火墙。由于我们通过 Apache 进行代理,因此我们不再需要打开端口 8000,因此我们可以删除该规则。然后我们可以添加一个例外以允许流量流向 Apache 进程:

  1. sudoufw 删除允许8000
  2. sudoUFW 允许“阿帕奇完整版”

检查您的 Apache 文件以确保没有出现任何语法错误:

  1. sudoapache2ctl 配置测试

只要最后一行输出如下所示,您的文件就状态良好:

Output
. . . Syntax OK

完成这些步骤后,您就可以重新启动 Apache 服务以实施您所做的更改。输入以下命令重新启动 Apache:

  1. 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 通过提供许多通用部分使创建项目和应用程序变得简单,使您能够专注于独特的元素。通过利用本文中描述的通用工具链,您可以轻松地为从单个服务器创建的应用程序提供服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ubuntu 16.04 上使用 Apache 和 mod_wsgi 为 Django 应用程序提供服务 的相关文章

  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • Python,Google Places API - 给定一组纬度/经度查找附近的地点

    我有一个由商店 ID 及其纬度 经度组成的数据框 我想迭代该数据框 并使用 google api 为每个商店 ID 查找附近的关键地点 例如输入 Store ID LAT LON 1 1 222 2 222 2 2 334 4 555 3
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 使用 Tkinter 打开网页

    因此 我的应用程序需要能够打开其中的单个网页 并且它必须来自互联网并且未保存 特别是我想使用 Tkinter GUI 工具包 因为它是我最熟悉的工具包 最重要的是 我希望能够在窗口中生成事件 例如单击鼠标 但无需实际使用鼠标 有什么好的方法
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Flymake的临时文件可以在系统临时目录下创建吗?

    我目前正在使用以下代码在 emacs 中连接 Flymake 和 Pyflakes defun flymake create temp in system tempdir filename prefix make temp file or
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 获取多个同名请求参数

    我的问题是给定的代码 from flask import Flask request app Flask name app route def hello return str request values get param None a
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 从网络中的另一台计算机访问本地GAE SDK服务器

    我有开发服务器 来自 google appengine sdk 在我的 Ubuntu 计算机上运行 我可以通过导航到 localhost 8080 来访问我的网站 我想从网络中的另一台计算机 装有 Vista 操作系统 访问该站点 ifco

随机推荐

  • 如何在 Ubuntu 20.04 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上使用最广泛的网络浏览器 它是专为现代网络构建的快速 易于使用且安全的浏览器 Chrome 适用于所有主要操作系统和硬件平台 并允许您在所有设备上同步书签 历史记录和密码 本文介绍如何在 Ubuntu 20 04 上安装 G
  • 如何在 Ubuntu 20.04 上安装 TeamViewer

    团队查看器是一个跨平台解决方案 用于远程控制 网络会议 桌面共享和计算机之间的文件传输 本文介绍如何在 Ubuntu 20 04 上安装 TeamViewer 先决条件 您需要以 root 或用户身份登录须藤访问能够在 Ubuntu 系统上
  • 如何在 CentOS 7 上挂载 exFAT 驱动器

    exFAT 扩展文件分配表 是 Microsoft 专有的文件系统 针对 SD 卡和 USB 闪存驱动器等闪存设备进行了优化 它旨在取代旧的 32 位 FAT32 文件系统 该系统无法存储大于 4 GB 的文件 最新版本的 Windows
  • 如何在 Python 中检查文件或目录是否存在

    在编写 Python 脚本时 您可能希望仅在文件或目录存在或不存在时执行特定操作 例如 您可能想要读取数据或将数据写入配置文件 或者仅在文件不存在时才创建该文件 在Python中 有很多不同的方法来检查文件是否存在并确定文件的类型 本教程展
  • 如何在 Debian 10 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 它用于所有现代 PHP 框架和平台 例如 Laravel
  • 如何在 Ubuntu 18.04 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个开源 PHP 应用程序 旨在通过基于 Web 的界面处理 MySQL 和 MariaDB 服务器的管理 phpMyAdmin 允许您管理 MySQL 数据库 用户帐户和权限 执行 SQL 语句 以各种数据格式导入
  • 如何在 Debian 10 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 用于客户端和服务器之间的安全连接 支持各种身份验证机制 加密连接可用于在服务器上执行命令 X11 隧道 端口转发等 基于密码和公钥是两种最常见的身份验证机制 使用公钥进行认证是基于数字签
  • 如何在 CentOS 7 上设置 OpenVPN 服务器

    无论您是想在连接不可信的公共 Wi Fi 网络时安全可靠地访问互联网 绕过地理限制内容还是允许您的同事在远程工作时安全地连接到您的公司网络 使用 VPN 都是最佳解决方案 VPN 允许您连接到远程 VPN 服务器 使您的连接加密且安全 并通
  • 如何在 CentOS 7 上安装 TeamViewer

    团队查看器是一个跨平台的解决方案 可用于计算机之间的远程控制 桌面共享和文件传输 TeamViewer 是专有计算机软件 不包含在 CentOS 存储库中 在本教程中 我们将逐步完成在 CentOS 7 上安装 TeamViewer 所需的
  • Linux 重启(重启)命令

    当内核更新时 除非您使用Livepatch或KernelCare 否则您需要重新启动Linux系统 在其他情况下也可能需要重新启动系统 例如 排除硬件问题 安装应用程序等时 如果您运行的是无头 Linux 服务器 您需要知道如何从命令行重新
  • 如何创建可启动的 Linux USB 驱动器

    通常 在笔记本电脑或 PC 上安装某些 Linux 发行版的全新副本时 您需要一个包含要安装的发行版的可启动 USB 本教程将引导您完成在 Windows macOS 和 Linux 计算机上创建可启动 Linux USB 记忆棒所需的步骤
  • 如何在 Debian 10 上安装 Visual Studio Code

    视觉工作室代码是微软开发的免费开源跨平台代码编辑器 它具有内置的调试支持 嵌入式Git控制 语法突出显示 代码完成 集成终端 代码重构和片段 可以使用扩展来扩展 Visual Studio Code 功能 本教程介绍如何在 Debian 1
  • 如何检查 PostgreSQL 版本

    PostgreSQL 通常简称为 Postgres 是一个开源通用对象关系数据库管理系统 在某些情况下 了解系统上安装并运行的 PostgreSQL 服务器版本可能很重要 例如 如果您要安装需要特定 PostgreSQL 版本的应用程序 则
  • 如何在 Ubuntu 20.04 上安装 R

    R 是一种开源编程语言和免费环境 专门从事统计计算和图形表示 它主要由统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本文介绍了在 Ubuntu 20 04 上安装 R 所需的步骤 先决条件 在继续本教程之前 请确保您已满足以下先决条
  • 如何在 Debian 10 上安装 TeamViewer

    团队查看器是一款跨平台应用程序 可用于远程控制 桌面共享 在线会议以及计算机之间的文件传输 本教程介绍如何在 Debian 10 Buster 上安装 TeamViewer 先决条件 在继续本教程之前 请确保您以以下身份登录具有 sudo
  • 如何在 Python 中注释

    编写 Python 代码时 让代码简洁且易于理解始终是一个好习惯 组织代码 为变量和函数指定描述性名称是实现此目的的几种方法 提高代码可读性的另一种方法是使用注释 注释是用于解释代码的人类可读的解释或注释 例如 如果您编写了一个复杂的正则表
  • 如何在 Debian Linux 9 上安装 VirtualBox

    虚拟盒子是一款开源跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 本教程介绍如何在 Debian 9 上安装最新的 VirtualBox 6 0 先决条件 您需要以以下身份登录具有 sudo 访问权限的用户能够在 Debian 系
  • 如何在 Debian 10 上安装 TensorFlow

    TensorFlow是谷歌打造的一个开源机器学习平台 它可以在不同设备上的CPU或GPU上运行 TensorFlow 可以在 Python 虚拟环境中安装在系统范围内 作为Docker容器 或使用 Anaconda 在本教程中 我们将解释如
  • 如何在 Ubuntu 16.04 上将 Apache Web 根移动到新位置

    介绍 在 Ubuntu 上 默认情况下 Apache2 Web 服务器将其文档存储在 var www html 它通常与操作系统的其余部分一起位于根文件系统上 但有时 将文档根移动到另一个位置会很有帮助 例如单独安装的文件系统 例如 如果您
  • 如何在 Ubuntu 16.04 上使用 Apache 和 mod_wsgi 为 Django 应用程序提供服务

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