根據(jù)官方描述,Django是一個(gè)web框架,而不是一個(gè)web服務(wù),因此計(jì)劃在apache部署Django項(xiàng)目
軟件及環(huán)境信息
? ? python3
? ? Django v1.11.8
? ? Apache v2.4.18
? ? libapache2-mod-wsgi-py3
? ? Ubuntu 16.04.4
安裝 apache2 和 mod_wsgi
mod_wsgi是一個(gè)Apache模塊,可以托管任何Python WSGI應(yīng)用程序,包括Django, Django能使用支持mod_wsgi的任何Apache版本。
另外之所以選擇mod_wsgi,而不使用mod_python,主要有2點(diǎn):
? ? 1. 高版本的Django已經(jīng)不再支持mod_python,而用mod_wsgi不影響以后的編碼;
? ? 2. 性能更好
執(zhí)行安裝
? ? sudo apt-get install apache2
? ? sudo apt-get install libapache2-mod-wsgi-py3
小提示:
? ? 查看apache版本: apachectl -v
? ? 對(duì)于python2用戶,安裝libapache2-mod-wsgi
檢查項(xiàng)目配置文件
部署在生產(chǎn)環(huán)境,特別需要檢查安全設(shè)置、資源訪問策略等,官方提供了一份檢查清單,見部署前的checklist,通過執(zhí)行python3 manage.py check --deploy 可得到檢測(cè)報(bào)告,在此之前,需要注意:
? ? DEBUG,默認(rèn)是True,當(dāng)報(bào)錯(cuò)時(shí)可得到詳情,部署在生產(chǎn)環(huán)境,容易暴露關(guān)鍵信息,因此一定記得設(shè)置為False
? ? ALLOWED_HOSTS ,限制請(qǐng)求中的host,以防止黑客構(gòu)造包來發(fā)送請(qǐng)求,只有在列表中的host才能通過,另外當(dāng)設(shè)置DEBUG=False時(shí),必須設(shè)置,否則報(bào)錯(cuò)
? ? STATIC_ROOT ,部署在生產(chǎn)環(huán)境,必須配置,然后通過執(zhí)行collectstatic 收集所有的靜態(tài)資源到該環(huán)境中,否則會(huì)發(fā)現(xiàn)找不到資源而報(bào)404錯(cuò)誤
? ? ? STATIC_URL,可理解成訪問靜態(tài)文件的URL前綴,類似別名,可簡短使用
? ? ? MEDIA_ROOT 和 MEDIA_URL,定義用戶上傳文件的路徑,對(duì)于上傳的文件,本身是不可信任的,例如上傳一個(gè).php 文件,服務(wù)器不應(yīng)該執(zhí)行
? ? ADMINS,是一個(gè)二元元組,記錄開發(fā)人員的姓名和email,當(dāng)view發(fā)生500錯(cuò)誤時(shí)通知
? ? AUTH_USER_MODEL,如果使用了auth的User的擴(kuò)展對(duì)象,需要告訴程序User模型在哪里,即引引用app.model形式
如何在Apache和mod_wsgi中使用Django
在/etc/apache2/sites-available目錄下(centos 用戶在 /etc/httpd目錄)新建網(wǎng)站配置文件,這里取名:myDjangoProject.conf
<VirtualHost *:80>#網(wǎng)站端口
? ? 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對(duì)應(yīng)STATIC_ROOT路徑
? ? Alias /media? *? #django對(duì)應(yīng)MEDIA_ROOT路徑
? ? <Directory *> #對(duì)靜態(tài)資源文件的授權(quán)
? ? ? Require all granted
? ? </Directory>
? <Directory *>
? ? Require all granted
? </Directory>
? <Directory * >#項(xiàng)目目錄
? ? <Files wsgi.py>
? ? #Order deny,allow? aphache 2.2.* use
? ? #Allow from all
? ? Require all granted
? ? </Files>
</Directory>
????ErrorLog? *#定義錯(cuò)誤日志文件
????CustomLog *?common #定義接口請(qǐng)求記錄文件?
</VirtualHost>
設(shè)置目錄及文件權(quán)限
一般目錄權(quán)限設(shè)置為 755,文件權(quán)限設(shè)置為 644
? ? 設(shè)置項(xiàng)目權(quán)限(假設(shè)項(xiàng)目為mysite)
? ? sudo chmod -R 644 mysite
? ? sudo find mysite -type d -exec chmod 755 \{\} \;
/etc/apache2/envvars 是apache程序的參數(shù)配置文件,通過文件中的
????export APACHE_RUN_USER=www-data
????export APACHE_RUN_GROUP=www-data
可知,apache的用戶和組為www-data,上傳靜態(tài)資源時(shí),需要將文件夾授權(quán)為該組,否則會(huì)被拒絕
????設(shè)置上傳文件夾目錄【-R,包括子文件夾,因?yàn)樾枰獎(jiǎng)討B(tài)創(chuàng)建文件夾,所以使用了-R】
? ? sudo chgrp -R www-data **
? ? sudo chmod -R g+w **
激活新網(wǎng)站
????sudo a2ensite myDjangoProject或 sudo a2ensite myDjangoProject.conf#前面的編輯好的網(wǎng)站配置文件
重啟apache
????service apache2 restart