根据官方描述,Django是一个web框架,而不是一个web服务,因此计划在apache部署Django项目
软件及环境信息
python3
Django v1.11.8
Apache v2.4.18
libapache2-mod-wsgi-py3
Ubuntu 16.04.4
安装 apache2 和 mod_wsgi
mod_wsgi是一个Apache模块,可以托管任何Python WSGI应用程序,包括Django, Django能使用支持mod_wsgi的任何Apache版本。
另外之所以选择mod_wsgi,而不使用mod_python,主要有2点:
1. 高版本的Django已经不再支持mod_python,而用mod_wsgi不影响以后的编码;
2. 性能更好
执行安装
sudo apt-get install apache2
sudo apt-get install libapache2-mod-wsgi-py3
小提示:
查看apache版本: apachectl -v
对于python2用户,安装libapache2-mod-wsgi
检查项目配置文件
部署在生产环境,特别需要检查安全设置、资源访问策略等,官方提供了一份检查清单,见部署前的checklist,通过执行python3 manage.py check --deploy 可得到检测报告,在此之前,需要注意:
DEBUG,默认是True,当报错时可得到详情,部署在生产环境,容易暴露关键信息,因此一定记得设置为False
ALLOWED_HOSTS ,限制请求中的host,以防止黑客构造包来发送请求,只有在列表中的host才能通过,另外当设置DEBUG=False时,必须设置,否则报错
STATIC_ROOT ,部署在生产环境,必须配置,然后通过执行collectstatic 收集所有的静态资源到该环境中,否则会发现找不到资源而报404错误
STATIC_URL,可理解成访问静态文件的URL前缀,类似别名,可简短使用
MEDIA_ROOT 和 MEDIA_URL,定义用户上传文件的路径,对于上传的文件,本身是不可信任的,例如上传一个.php 文件,服务器不应该执行
ADMINS,是一个二元元组,记录开发人员的姓名和email,当view发生500错误时通知
AUTH_USER_MODEL,如果使用了auth的User的扩展对象,需要告诉程序User模型在哪里,即引引用app.model形式
如何在Apache和mod_wsgi中使用Django
在/etc/apache2/sites-available目录下(centos 用户在 /etc/httpd目录)新建网站配置文件,这里取名:myDjangoProject.conf
ServerName * #My site Name
WSGIDaemonProcess * python-path=* #Demon process for multiple virtual hosts
WSGIScriptAlias / *#Pointing wsgi script to config file
WSGIProcessGroup *
#Your static files location
Alias /static * #django对应STATIC_ROOT路径
Alias /media * #django对应MEDIA_ROOT路径
Require all granted
Require all granted
#Order deny,allow aphache 2.2.* use
#Allow from all
Require all granted
ErrorLog *#定义错误日志文件
CustomLog * common #定义接口请求记录文件
设置目录及文件权限
一般目录权限设置为 755,文件权限设置为 644
设置项目权限(假设项目为mysite)
sudo chmod -R 644 mysite
sudo find mysite -type d -exec chmod 755 \{\} \;
/etc/apache2/envvars 是apache程序的参数配置文件,通过文件中的
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
可知,apache的用户和组为www-data,上传静态资源时,需要将文件夹授权为该组,否则会被拒绝
设置上传文件夹目录【-R,包括子文件夹,因为需要动态创建文件夹,所以使用了-R】
sudo chgrp -R www-data **
sudo chmod -R g+w **
激活新网站
sudo a2ensite myDjangoProject或 sudo a2ensite myDjangoProject.conf#前面的编辑好的网站配置文件
重启apache
service apache2 restart