前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上使用Apache和mod_wsgi为Django应用程序提供服务

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

原创
作者头像
独木桥先生
修改2018-10-22 11:38:51
2.1K0
修改2018-10-22 11:38:51
举报

介绍

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

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

准备和目标

一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

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

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

让我们开始吧。

从Ubuntu存储库安装软件包

要开始这个过程,我们将从Ubuntu存储库下载并安装我们需要的所有项目。这将包括Apache Web服务器,用于与我们的Django应用程序接口的mod_wsgi模块,以及可用于下载我们的Python相关工具的pipPython包管理器。

要获得我们需要的所有内容,请更新服务器的本地包索引,然后安装相应的包。

如果您在Python 2中使用Django,您需要的命令是:

代码语言:javascript
复制
sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi

相反,如果您使用Django和Python 3,则需要一个替代的Apache模块和pip包。在这种情况下,适当的命令是:

代码语言:javascript
复制
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,请键入:

代码语言:javascript
复制
sudo pip install virtualenv

如果您使用的是Python 3,请键入:

代码语言:javascript
复制
sudo pip3 install virtualenv

随着virtualenv的安装完成,我们可以开始形成我们的项目。创建一个目录,您希望保留项目并进入目录:

代码语言:javascript
复制
mkdir ~/myproject
cd ~/myproject

在项目目录中,键入以下命令创建Python虚拟环境:

代码语言:javascript
复制
virtualenv myprojectenv

这将在myproject目录创建一个名为myprojectenv的目录。在里面,它将安装本地版本的Python和本地版本的pip。我们可以使用它为我们的项目安装和配置一个独立的Python环境。

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

代码语言:javascript
复制
source myprojectenv/bin/activate

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

在您的虚拟环境处于活动状态时,使用以下本地实例安装Django pip

注意

无论您使用的是Python 2还是Python 3,当虚拟环境被激活时,我们都应该使用pip命令(而不是pip3)。

代码语言:javascript
复制
pip install django

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

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

创建Django项目

由于我们已经有了一个项目目录,我们将告诉Django在这里安装文件。它将使用实际代码创建第二级目录,这是正常的,并将管理脚本放在此目录中。关键是最后的点告诉Django在当前目录中创建文件:

代码语言:javascript
复制
django-admin.py startproject myproject .

调整项目设置

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

代码语言:javascript
复制
nano myproject/settings.py

为简单起见,我们将在本指南中使用默认的SQLite数据库,因此我们实际上不需要进行太多更改。我们将专注于配置允许的主机以限制我们响应的域并配置静态文件目录,其中Django将放置静态文件,以便Web服务器可以轻松地提供这些服务。

首先找到这条ALLOWED_HOSTS线。在方括号内,输入服务器的公共IP地址,域名或两者。每个值都应该用引号括起来,并用逗号分隔,就像普通的Python列表一样:

代码语言:javascript
复制
. . .
ALLOWED_HOSTS = ["server_domain_or_IP"]
. . .

在文件的底部,我们将添加一行来配置此目录。Django使用该STATIC_ROOT设置来确定这些文件应该到达的目录。我们将使用一些Python来告诉它在我们项目的主目录中使用一个名为“static”的目录:

代码语言:javascript
复制
. . .
​
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

完成后保存并关闭文件。

完成初始项目设置

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

代码语言:javascript
复制
cd ~/myproject
./manage.py makemigrations
./manage.py migrate

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

代码语言:javascript
复制
./manage.py createsuperuser

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

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

代码语言:javascript
复制
./manage.py collectstatic

您必须确认操作。静态文件将放在static项目目录中调用的目录中。

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

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

代码语言:javascript
复制
sudo ufw allow 8000

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

代码语言:javascript
复制
./manage.py runserver 0.0.0.0:8000

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

代码语言:javascript
复制
http://server_domain_or_IP:8000

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

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

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

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

我们现在已经完成了Django,因此我们可以通过键入以下命令退出虚拟环境:

代码语言:javascript
复制
deactivate

配置Apache

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

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

代码语言:javascript
复制
sudo nano /etc/apache2/sites-available/000-default.conf

我们可以保留文件中已存在的指令。我们只需要添加一些额外的项目。

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

代码语言:javascript
复制
<VirtualHost *:80>
    . . .
​
    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>
​
</VirtualHost>

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

代码语言:javascript
复制
<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 home,Apache可以找到所有可能需要的组件。由于我们使用了虚拟环境,因此我们可以将其直接指向我们的基本虚拟环境目录。然后,我们将Python路径设置为指向Django项目的基础。

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

代码语言:javascript
复制
<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默认情况下调用数据库文件,它应位于基础项目目录中:

代码语言:javascript
复制
chmod 664 ~/myproject/db.sqlite3

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

代码语言:javascript
复制
sudo chown :www-data ~/myproject/db.sqlite3

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

代码语言:javascript
复制
sudo chown :www-data ~/myproject

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

代码语言:javascript
复制
sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'

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

代码语言:javascript
复制
sudo apache2ctl configtest

只要最后一行输出看起来像这样,你的文件就会很好:

代码语言:javascript
复制
. . .
Syntax OK

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

代码语言:javascript
复制
sudo systemctl restart apache2

您现在应该可以通过转到服务器的域名或IP地址来访问Django站点,而无需指定端口。常规站点和管理界面应按预期运行。

下一步

在验证您的应用程序是否可访问后,保护应用程序的流量非常重要。

结论

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

Django通过提供许多常见的部分使创建项目和应用程序变得简单,使您可以专注于独特的元素。通过利用本文中介绍的常规工具链,您可以轻松地为从单个服务器创建的应用程序提供服务。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Serve Django Applications with Apache and mod_wsgi on Ubuntu 16.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 准备和目标
      • 从Ubuntu存储库安装软件包
        • 配置Python虚拟环境
          • 创建和配置一个新的Django项目
            • 创建Django项目
            • 调整项目设置
            • 完成初始项目设置
          • 配置Apache
            • 总结一些权限问题
          • 下一步
            • 结论
            相关产品与服务
            SSL 证书
            腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档