如何使用Apache驱动Django

简介

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

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

准备

您应该拥有一个新的Debian 8服务器实例,其中非root用户具有已配置好的的sudo权限。没有服务器的同学可以在这个页面购买。

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

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

从Debian存储库安装软件包

我们将从Debian存储库下载并安装我们需要的所有项目。这将包括ApacheWeb服务器,用于与Django应用程序接口的mod_wsgipip模块,以及可用于下载我们的Python相关工具的Python包管理器pip。

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

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

sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi

相反,如果您使用Django和Python3,则需要一个替代的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$

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

注意:虚拟环境使用自己的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地址和域名。每个值都应该用引号括起来,并用逗号分隔。

. . .
ALLOWED_HOSTS = ["server_domain_or_IP", "127.0.0.1", "127.0.1.1"]
. . .

在文件的底部,我们将设置Django的STATIC_ROOT。Django可以收集所有静态资产并将其输出到已知目录中,以便Web服务器可以直接为它们提供服务。我们将使用一些Python语句来告诉它在我们项目的主目录中使用一个名为“static”的目录:

. . .

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

您可能必须调整防火墙设置以允许流量导入到我们的Django开发服务器。

如果您正在运行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浏览器中,访问服务器的域名或后跟:8000的IP地址:

http://server_domain_or_IP:8000

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

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

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

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

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

deactivate

shell提示符的前缀(myprojectenv)应该消失。

配置Apache

我们可以将Apache配置为前端。它接收的客户端连接将被转换为Django应用程序使用mod_wsgi模块所期望的WSGI格式。

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

sudo nano /etc/apache2/sites-available/000-default.conf

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

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

<VirtualHost *:80>
    . . .

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

</VirtualHost>

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

<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路径设置为指向Django项目。

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

<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

我们需要再次调整我们的防火墙。由于我们通过Apache代理,因此我们不再需要打开端口8000并删除该规则。然后我们可以添加一个例外以允许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

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

下一步

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

如果您的应用程序具有域名,则保护您应用程序的最简单方法是使用腾讯云提供的免费SSL证书

如果您没有域名,可以在腾讯云购买域名

结论

在本文中,我们在自己的虚拟环境中设置了一个Django项目。我们已经配置Apachemod_wsgi来处理客户端请求并与Django应用程序进行对接。通过利用本文中介绍的常规工具链,您可以轻松地为单个服务器创建的应用程序提供服务。


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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

查找修改时间在指定区间的文件并打包

#!/bin/bash # find file and tar # joyousphper@gmail.com # find_and_tar.sh read ...

2773
来自专栏云计算教程系列

如何在Debian 9上安装Apache Tomcat 9

Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。Tomcat是Apache Software Foundati...

5424
来自专栏源哥的专栏

把JSP放到WEB-INF后以保护JSP源代码

    本人在看《J2EE核心模式》(“Core J2ee Patterns”,刘天北、熊节译),里面提到了一种实现资源保护的方法,那就是把那些限制访问的资源(...

1163
来自专栏云计算教程系列

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

Django是一个功能强大的Web框架,可以帮助您快速启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码,但是对于任何...

1580
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用LEMP将Symfony 4应用程序部署到生产中

Symfony是一个开源PHP框架,具有优雅的结构和声誉,无论其大小如何,都是一个适合启动任何项目的框架。作为一组可重用的组件,其灵活性,体系结构和高性能使其成...

1958
来自专栏学一学大数据

一文上手zabbix安装配置【运维篇】

2053
来自专栏北京马哥教育

CentOS系统启动流程你懂否

一、Linux内核的组成 相关概念: Linux系统的组成部分:内核+根文件系统 内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序。 ...

3794
来自专栏PHP技术大全

Web安全之XSS Platform搭建及使用实践

XSS Platform 是一个非常经典的XSS渗透测试管理系统,原作者在2011年所开发,由于后来长时间没有人维护,导致目前在PHP7环境下无法运行。

1641
来自专栏云计算教程系列

如何在CentOS 7上使用Postgres,Nginx和Gunicorn设置Django

Django是一个功能强大的Web框架,可以帮助您启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码,但是对于任何与生...

1653
来自专栏空木白博客

分享5个网址二维码API接口

它们只需要填写好网址就能自动生成二维码,分别来自与bshare和jiathis分享工具中,如您需要就把下面的二维码生成API接口复制到你需要地方。

4702

扫码关注云+社区

领取腾讯云代金券