在CentOS 7上通过Apache和mod_wsgi运行Django应用

提供:ZStack云计算

前言

Django是一款强大的Web框架,可用于快速搭建起一套Python应用。Django包含一套简单的开发服务器用于进行本地测试,不过线上生产环境一般都使用更加安全强大的Web服务器。

本文将示范如何在CentOS 7上的一个Python虚拟环境中安装配置Django。我们在前端配置Apache用于处理客户端请求并将需要应用逻辑反馈的请求发送给Django应用,这将通过mod_wsgi模块进行,该模块可通过WSGI接口规范与Django进行通讯。

准备工作

首先你需要一台CentOS 7服务器,上面配置过具有sudo权限的非root用户(配置方法可参见这个教程

我们将在Python虚拟环境中安装Django,这样有助于分别处理不同项目的依赖项。

应用启动之后,我们将配置Apache的接口以对接Django应用,这将通过mod_wsgi模块完成,该模块可将HTTP请求转换为WSGI标准格式。有关WSGI的更多信息可参考这篇文章

从CentOS和EPEL软件仓库安装软件包

首先我们将下载如下软件包:Apache服务器,Apache的mod_wsgi模块,以及Python软件包管理器pip

要获取pip,需要先启用EPEL软件仓库:

sudo yum install epel-release

启用EPEL后,可以输入如下命令安装上述所需软件包:

sudo yum install python-pip httpd mod_wsgi

配置Python虚拟环境

我们将创建一个Python虚拟环境以将该Django项目与其他系统工具和其他Python项目隔离开。

首先用pip安装virtualenv

sudo pip install virtualenv

安装完毕后,创建一个项目目录:

mkdir ~/myproject
cd ~/myproject

在该目录内创建一个Python虚拟环境:

virtualenv myprojectenv

该命令将会在myproject目录下创建一个myprojectenv目录,其中安装了一个本地的Python和pip。我们将使用它们来安装配置本项目的Python环境。

在安装依赖项之前,需要先激活该虚拟环境:

source myprojectenv/bin/activate

激活之后,命令行提示符应该能够看出来,比如这样:(myprojectenv)user@host:~/myproject$

虚拟环境激活后,使用pip安装Django:

pip install django

创建一个新的Django项目

现在可以创建Django项目文件了。

创建Django项目

我们需要让Django将文件安装到我们刚才创建的项目目录下。代码文件将在一个子目录下创建,管理脚本则将在项目根目录下创建。注意命令结尾处用于指定安装位置的.

django-admin.py startproject myproject .

调整项目设置

新建项目后要做的第一件事情就是调整设置。用编辑器打开配置文件:

nano myproject/settings.py

简便起见,我们将使用默认的SQLite数据库,所以需要更改的配置不多,主要是静态文件的目录,即Django放置静态文件以供Web服务器使用的目录。

在配置文件末尾添加STATIC_ROOT条目,内容中使用一些Python语句定义静态文件目录“static”:

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

保存退出。

完成项目初始配置

现在,使用管理脚本将初始数据库结构迁移到SQLite数据库:

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

创建管理员用户:

./manage.py createsuperuser

设置一个用户名、Email地址和密码。

输入如下命令以将所有静态文件收集到指定目录:

./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进入管理员界面,输入刚才设置的用户名密码:

Django admin login

认证之后,应该能看到如下界面:

Django admin interface

确认没有问题后,回到服务器终端窗口按下CTRL-C快捷键以终止服务。

Django部分现在已经配置完毕,可以输入如下命令关闭虚拟环境:

deactivate

配置Apache

现在开始配置前端的Apache,其mod_wsgi模块将把来自客户端的HTTP请求翻译为Django应用可读的WSGI格式。之前安装模块的时候,该模块应该已经自动启用。

我们需要新建一个定义WSGI通道的配置文件。在/etc/httpd/conf.d目录下以sudo权限生成一个django.conf文件:

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

首先是静态文件的设置。创建一个别名,将访问/static的请求都映射到项目目录下的“static”目录:

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

其次,设置wsgi.py文件的权限,使其能够访问项目目录下存放Django代码的目录。这需要通过另一个directory条目完成:

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版本号)。

之后,我们需要指定进程组,进程组的名称应该和我们在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用户,这样能够恰到好处的分配权限。

使用如下命令在自己的用户组(“user”)中添加apache用户:

sudo usermod -a -G user apache

将用户根目录的执行权限开放给本用户组:

chmod 710 /home/user

这样,Apache进程就能够访问到我们用户根目录下的内容了。

如果你像本文一样使用SQLite数据库,则还需要开放数据库文件给Apache进程。

首先需要开放用户组对数据库文件的读写权限:

chmod 664 ~/myproject/db.sqlite3

然后,将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项目,并配置了Apache的mod_wsgi模块用于将HTTP请求转发给Django应用。

使用Django创建项目和应用要比自己从头编写来得更加简便,善用其中的工具链,可以更多专注于自己应用的业务逻辑,实现更高的效率。

本文来源自DigitalOcean Community。英文原文:How To Serve Django Applications with Apache and mod_wsgi on CentOS 7 by Justin Ellingwood

翻译:lazycai

阅读更多
换一批

没有更多推荐了,返回首页