前言
最近在用django部署網(wǎng)站www.aihunter.cc,經(jīng)歷各種坑后覺(jué)得有必要總結(jié)一下流程以備日后遺忘憎妙。在下閱讀眾多教程后覺(jué)得網(wǎng)上還是缺少介紹Ngnix+Uwsgi+virtualenv+django工作流程的概念文章遵班,結(jié)合網(wǎng)上的材料和自己消化本教程將分為概念部分(上篇)以及操作部分(下篇)灾螃,文中操作內(nèi)容均為自己實(shí)際部署時(shí)的流程地回。另外在下職業(yè)非專業(yè)程序員若有錯(cuò)誤可以在評(píng)論中指出浙宜,我會(huì)必第一時(shí)間糾正稍坯,以下將實(shí)際部署分為4個(gè)部分進(jìn)行說(shuō)明酬荞。
環(huán)境說(shuō)明
服務(wù)器:阿里云ecs
系統(tǒng):ubantu16.04 32位
語(yǔ)言版本:Python 2.7.12
部署方式:Ngnix +Uwsgi + virtualenv
django路徑說(shuō)明:流程中django項(xiàng)目路徑為/home/virtuweb/testproject
其中virtuweb是虛擬環(huán)境文件夾,testproject是django的項(xiàng)目名字,django下的app名為testmodel
Step1 安裝ngnix\uwsgi\virtualenv
nginx安裝(真實(shí)環(huán)境)
注意:nginx的 gzip模塊需要 zlib 庫(kù)混巧、rewrite模塊需要 pcre 庫(kù)糟把、ssl 功能需要openssl庫(kù)
apt-get install nginx
uwsgi安裝(真實(shí)環(huán)境+虛擬環(huán)境)
pip install uwsgi
Virtualenv安裝(真實(shí)環(huán)境)
apt-get install python-virtualenv 或pip install virtualenv
Step2 配置uwsgi 和啟動(dòng)
uWSGI可以通過(guò)diango項(xiàng)目的wsgi.py文件啟動(dòng),也可以用初始化文件啟動(dòng)牲剃。在下是用ini初始化文件啟動(dòng)uWSGI的遣疯,因此需要配置django項(xiàng)目中的wsgi.py文件和創(chuàng)建一個(gè)ini文件。再次說(shuō)明在下django項(xiàng)目路徑為/home/virtuweb/testproject凿傅,具體流程如下
step2.1 編輯django項(xiàng)目中的wsgi.py文件
首先進(jìn)入django項(xiàng)目中的wsgi.py路徑下
CD /home/virtuweb/testproject/testproject
然后編輯wsgi.py文件
vim wsgi.py
編輯wsgi.py內(nèi)容如下
import os,sys,django
from django.core.wsgi import get_wsgi_application
from django.core.handlers.wsgi import WSGIHandler
reload(sys)
sys.setdefaultencoding('utf-8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testproject.settings") #變量testproject.settings為django項(xiàng)目下的settings
django.setup() #避免在虛擬環(huán)境下找不到django的app
application = WSGIHandler() #實(shí)例化一個(gè)WSGI application用作接受nginx服務(wù)器傳遞的envrion缠犀、start_response參數(shù)
step2.2 創(chuàng)建一個(gè)uwsgi.ini文件
返回到django項(xiàng)目下
CD /home/virtuweb/testproject
創(chuàng)建和編輯testproject.ini (文件名稱可任意)
vim testproject_uwsgi.ini
testproject_uwsgi.ini文件配置如下
[uwsgi]
socket =127.0.0.1:8080 # uWSGI服務(wù)器啟動(dòng)占用的地址和端口
static-map =/static=/home/virtuweb/testproject/testmodel/static #設(shè)置django靜態(tài)文件夾的路徑
chdir =/home/virtuweb/testproject #設(shè)置django的路徑
module =testproject.wsgi:application
virtualenv = /home/aihunter #設(shè)置虛擬環(huán)境路徑,不設(shè)置的話在會(huì)找不到django
master = true #設(shè)置是否允許主進(jìn)程存在
process = 5 #設(shè)置進(jìn)程數(shù)量
harakiri =30 #客戶端請(qǐng)求超過(guò)設(shè)置
vacuum = true #設(shè)置服務(wù)器退出時(shí)自動(dòng)清理環(huán)境
step2.3 以上內(nèi)容完成后在虛擬環(huán)境下運(yùn)行
uwsgi --ini testproject_uwsgi.ini (省略--ini也行)
詳細(xì)的wsgi官方介紹http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html
Step3 配置nginx 步驟
安裝好Nginx后其實(shí)已經(jīng)可以啟動(dòng)服務(wù)器了聪舒,但是我們目的要讓Nginx和uWSGI連接起來(lái)辨液,因此需創(chuàng)建一個(gè)新的配置文件xx.conf。xx.conf存放的位置在Nginx文件夾下的sites-available和sites-enabled文件夾中(一式兩份)箱残,另外要保證Nginx中存在uwsgi_params文件(一般都有的),設(shè)置完畢后執(zhí)行service nginx start命令啟動(dòng)nginx即可(關(guān)閉命令為service nginx stop)滔迈。具體流程如下
step3.1 創(chuàng)建Nginx配置文件
進(jìn)入到nginx文件夾下
cd /etc/nginx/sites-available
刪除默認(rèn)設(shè)置文件default
rm deault
創(chuàng)建配置文件test.conf (文件名稱隨意)
Vim test.conf
編輯test.conf .py內(nèi)容如下(注意文件夾權(quán)限,注意不要缺少句后分號(hào)被辑,創(chuàng)建完成后復(fù)制一份到 sites-enabled中燎悍,也要?jiǎng)h除 sites-enabled的default文件)
server {
listen 80; #設(shè)置nginx服務(wù)器開(kāi)啟的端口號(hào)
server_name www.aihunter.cc;
charset utf-8;
client_max_body_size 75M;
location /static {
alias home/virtuweb/testproject/testmodel/static; #設(shè)置django靜態(tài)文件路徑
}
location / {
uwsgi_pass 127.0.0.1:8080; #設(shè)置為uwsgi服務(wù)器開(kāi)啟的端口
include /etc/nginx/uwsgi_params; #設(shè)置uwsgi_params文件路徑
}
}
step3.2 啟動(dòng)服務(wù)器
執(zhí)行以下命令,Nginx啟動(dòng)成功后沒(méi)有返回值,錯(cuò)誤才返回值盼理√干剑可以使用netstat -nltp命令查看
service nginx start
step4 阿里云服務(wù)器端口開(kāi)啟
設(shè)置阿里云服務(wù)器安全組規(guī)則以及django中settings文件的host參數(shù)后外網(wǎng)才可以訪問(wèn)。
1.首先在阿里云服務(wù)器上開(kāi)啟安全組規(guī)則(開(kāi)啟80端口)
2.django的settings文件中設(shè)置allowed_hosts設(shè)置為服務(wù)器的域名(若沒(méi)有域名則填服務(wù)器ip地址)
部署程中出現(xiàn)的錯(cuò)誤以及解決
不知道是環(huán)境或者是版本不同的問(wèn)題宏怔,在下參考網(wǎng)上其他教程后在實(shí)踐時(shí)還是遇到些關(guān)于wsgi設(shè)置的坑以下內(nèi)容為當(dāng)時(shí)遇到的問(wèn)題和解決方法奏路。
第一坑 app不能加載
錯(cuò)誤提示:django.core.exceptions.AppRegistryNotReady:loadr yet.
處理方式:不能加載那就補(bǔ)充加載咯,于是在wspy文件中加入代碼 django.setup()后解決成功臊诊。
第二坑 找不到django 庫(kù)
錯(cuò)誤提示:ImportError:No module named django
錯(cuò)誤顯示
處理方式:原來(lái)是由于沒(méi)有設(shè)置虛擬環(huán)境的路徑導(dǎo)致的鸽粉,需要在虛擬環(huán)境下運(yùn)行django項(xiàng)目的朋友一定要在uwsgi.ini文件中補(bǔ)上虛擬環(huán)境的路徑virtualenv=path
參考文章和視頻
淺談cgi、wsgi抓艳、uwsgi 與 uWSGI Python uwsgiu WSGI nginx CGI
Nginx工作原理和優(yōu)化触机、漏洞。
【教程】Nginx + uWsgi 部署 Django + Mezzanine 生產(chǎn)服務(wù)器...