在CentOS 7上通过Apache和mod_wsgi运行Django应用
提供:ZStack云计算 前言Django是一款强大的Web框架,可用于快速搭建起一套Python应用。Django包含一套简单的开发服务器用于进行本地测试,不过线上生产环境一般都使用更加安全强大的Web服务器。本文将示范如何在CentOS 7上的一个Python虚拟环境中安装配置Django。我们在前端配置Apache用于处理客户端请求并将需要应用逻辑反馈的请求发送给Django应用,这将通过m
提供: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的默认主页:
在URL后加上/admin
进入管理员界面,输入刚才设置的用户名密码:
认证之后,应该能看到如下界面:
确认没有问题后,回到服务器终端窗口按下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
更多推荐
所有评论(0)