Apache和Django整合
为了能够安装一些额外的包,需要先安装EPEL repository
sudo yum install epel-release
接下来就可以安装 pip httpd mod_swgi了
sudo yum install python-pip httpd mod_wsgi
接下来,为了能够让我们的Django项目和其他的系统工具和Python项目独立,我们需要创建一个Python virtual environment
A Virtual Environment is a tool to keep the dependencies required by different projects in separate places, by creating virtual Python environments for them. It solves the “Project X depends on version 1.x but, Project Y needs 4.x” dilemma, and keeps your global site-packages directory clean and manageable.
For example, you can work on a project which requires Django 1.3 while also maintaining a project which requires Django 1.0.
sudo pip install virtualenv
安装完后,在你想创建项目的地方创建文件夹并进入该文件夹
mkdir ~/myproject
cd ~/myproject
在该文件夹下运行
virtualenv myprojectenv
这会在你的目录下创建一个myprojectenv文件夹,在这里面,它会安装一个当前版本的Python和pip,我们可以用这些来安装和配置为这个项目独立的python环境
在为我们项目安装Python需要的东西前,我们需要先激活当前环境
source myprojectenv/bin/activate
命令行提示会变成 (myprojectenv)user@host:~/myproject$. 这个样子,提示你当前正在Python virtual 环境中操作
在当前激活的环境下,安装Django
pip install django
创建和配置新的Django项目
现在Django已经安装到我们的虚拟环境中了,我们可以创建项目了
创建Django项目
在当前目录下创建项目,注意那个’.‘,表示我们希望Django将文件创建在当前目录下
django-admin.py startproject myproject .
调整项目设置
为了当前项目的简单,我们使用默认的SQLite数据库,不去进行配置,但是我们需要配置静态文件放置的目录,通过在myproject/settings.py增加STATIC_ROOT属性来指定静态目录为我们工程文件夹下的static文件夹
vim myproject/settings.py
添加
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
完成初始化项目
cd ~/myproject
./manage.py makemigrations
./manage.py migrate
给我们项目创建一个管理员用户
./manage.py createsuperuser
接下来我们将所有静态的内容收集到我们指定的目录
./manage.py collectstatic
最后,启动服务器
./manage.py runserver 0.0.0.0:8000
然后我们就可以通过浏览器访问了
当前对django的配置就告一段落了,我们通过以下命令退出当前的虚拟环境
deactivate
配置Apache
现在Django工程已经工作了,我们可以将Apache配置为前端.它接收到客户端的链接后将会通过mod_wsgi翻译成WSGI格式,这个格式就是Django应用期待的.
为了配置WSGI路由,我们需要创建一个新的配置文件定义WSGI路由,使用sudo命令创建并打开在 /etc/httpd/conf.d目录下的django.conf文件
sudo vim /etc/httpd/conf.d/django.conf
我们首先配置静态文件,使用一个别名告诉Apache将所有以/static开头的请求映射到我们的static目录下,并且给予它访问的权限
Alias /static /home/user/myproject/static
<Directory /home/user/myproject/static>
Require all granted
</Directory>
接下来,我们给予wsgi.py授权让其可以访问我们的Django代码存储的文件夹.
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路由的部分了.我们将会使用daemen模式去运行WSGI进程,这是推荐的配置.我们可以使用WSGIDaemonProcess指示设置这个.
这个指示接受任意一个名字给进程.我们使用myproject来保持一致性.接着,我们设置Python path以便于Apache可以找到所有需要的组件.因为我们使用了虚拟环境,所以我们需要设置两部分path.第一个是我们工程的父目录,这里可以找到我们的工程文件.第二个是我们虚拟环境目录中的lib/pythonx.x/site-packages path,这样,Apache就可以找到运行我们项目所需要的所有的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会分别锁住每个用户的home目录,所以我们可以将apache用户添加到我们的用户组中.
将apache用户添加到用户组中
sudo usermod -a -G user apache
接下来我们将我们的目录添加可执行权限,这样,apache可以进入我们的目录
chmod 710 /home/user
如果使用SQLite,那么需要允许Apache单独处理数据库文件的访问
第一步就是改变权限,让用户组和拥有者可以读或写.
chmod 664 ~/myproject/db.sqlite3
Afterwards, we need to give the group Apache runs under, the apache group, group ownership of the file:
sudo chown:apache ~/myproject/db.sqlite3
为了能够读写文件,我们还需要给Apache组父目录的所有权
当这一切都做完了,你可以启动Apache Service了
sudo systemctl start httpd
如果一切正常,使用下面命令让apache开机启动
sudo systemctl enable httpd
本文摘录翻译自How To Serve Django Applications with Apache and mod_wsgi on CentOS 7