由于最近要做一個(gè)創(chuàng)新項(xiàng)目,需要用到python web開發(fā)停撞,于是研究了一下django這個(gè)很全能的python web框架捏悬。
為什么需要ngix呢佩脊?
首先說(shuō)一下為什么需要這三者組合建站,只用django的話随闽,不能做到負(fù)載均衡父丰,比如需要請(qǐng)求一些靜態(tài)資源,就需要django全部去處理橱脸,不能將請(qǐng)求合理分發(fā)础米,而ngix正好能解決這樣的問(wèn)題(似乎這個(gè)項(xiàng)目也不用怎么考慮負(fù)載均衡哈~~但是提高逼格總是必須的),ngix通過(guò)配置可以將一些動(dòng)態(tài)請(qǐng)求發(fā)給django處理添诉,而對(duì)于靜請(qǐng)求則自己處理屁桑,另外如果網(wǎng)站上還要運(yùn)行php頁(yè)面,那么ngix絕對(duì)是一個(gè)很好的選擇栏赴,將對(duì)php的請(qǐng)求分發(fā)給apache處理蘑斧,ngix和apache通過(guò)socket端口通信,然后返回給客戶端處理后的結(jié)果须眷。
然后為什么又需要uwsgi呢竖瘾?
WSGI是一種Web服務(wù)器網(wǎng)關(guān)接口。它是一個(gè)Web服務(wù)器(如nginx)與應(yīng)用服務(wù)器(如uWSGI服務(wù)器)通信的一種規(guī)范花颗。然后uwsgi是實(shí)現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務(wù)器捕传。簡(jiǎn)單點(diǎn)說(shuō)就是運(yùn)用uwsgi我們可以實(shí)現(xiàn)由uwsgi啟動(dòng)django,然后ngix通過(guò)端口與uwsgi通信扩劝,在這個(gè)過(guò)程中庸论,gjango實(shí)現(xiàn)了wsgi服務(wù)器的功能,ngix實(shí)現(xiàn)了wsgi客戶端的功能棒呛,只不過(guò)在web里面聂示,ngix扮演的又是服務(wù)器(計(jì)算機(jī)中的軟件通信有很多都是客戶端服務(wù)器模式。如文件資源就是一個(gè)服務(wù)簇秒,然后應(yīng)用程序?qū)崿F(xiàn)了了相應(yīng)的協(xié)議從而去調(diào)用這個(gè)服務(wù))鱼喉。這樣就實(shí)現(xiàn)了uwsgi在ngix和django的中轉(zhuǎn)。
為什么不讓ngix直接與django通信呢趋观?
uWSGI扛禽,既不用wsgi協(xié)議也不用fcgi協(xié)議,而是自創(chuàng)了一個(gè)uwsgi的協(xié)議皱坛,據(jù)說(shuō)該協(xié)議大約是fcgi協(xié)議的10倍那么快旋圆。
uWSGI的主要特點(diǎn)如下:
- 超快的性能。
- 低內(nèi)存占用(實(shí)測(cè)為apache2的mod_wsgi的一半左右)麸恍。
- 多app管理灵巧。
- 詳盡的日志功能(可以用來(lái)分析app性能和瓶頸)搀矫。
- 高度可定制(內(nèi)存大小限制,服務(wù)一定次數(shù)后重啟等)刻肄。
這三者之間的原理如下瓤球,
the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django
開始部署
安裝ngix sudo apt-get install ngix
由于我的機(jī)器上面還有apache,我需要修改ngix的監(jiān)聽端口為8080
修改如下
server {
listen 8080 default_server;
listen [::]:8080 default_server ipv6only=on;
root /var/ngix; #將根目錄改為/var/ngix
index index.html index.htm;
}
安裝django
用python自帶的包管理器easy_install安裝 easy_install django會(huì)自動(dòng)安裝最新版本
安裝uwsgi
apt-get install python-dev #不安裝這個(gè)敏弃,下面的安裝可能會(huì)失敗
pip install uwsgi
如果是apt-get安裝就需要
sudo apt-get install uwsgi-plugin-python
工具安裝好以后就可以開始配置項(xiàng)目了卦羡,我用的開發(fā)環(huán)境是pycharm,可以自動(dòng)生成django項(xiàng)目麦到,如果不是需要運(yùn)行django的admin.py生成相應(yīng)的項(xiàng)目文件下面是我的項(xiàng)目的結(jié)構(gòu)
.
└── myproject
├── app
│ ├── admin.py
│ ├── init.py
│ ├── migrations
│ │ └── init.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
├── myproject
│ ├── django.xml
│ ├── init.py
│ ├── init.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── wsgi.py
│ └── wsgi.pyc
├── templates
django.xml文件內(nèi)容為:
<uwsgi>
<socket>127.0.0.1:8630</socket>
<chdir>/var/ngix/myproject/myproject</chdir>
<pythonpath>..</pythonpath>
<module>wsgi</module>
</uwsgi>
這里需要注意的是wsgi模塊绿饵,網(wǎng)上很多都是錯(cuò)誤的,直接用自動(dòng)生成的就行瓶颠。
用socket和ngix進(jìn)行通信拟赊,端口號(hào)為本機(jī)的8630端口
然后需要在ngix的配置文件中添加
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8630;
}
uwsgi是ngix自帶的模塊
重啟ngix服務(wù),然后啟動(dòng)uwsgi服務(wù)
$ uwsgi -x django.xml --plugin python
需要在django.xml所在目錄執(zhí)行
最后在瀏覽器輸入127.0.0.1:8080就可以看見django的調(diào)試頁(yè)面了~~
總結(jié)一下學(xué)到的其他東西:刪除/etc/dpkg/info/下面對(duì)應(yīng)的安裝文件粹淋,可以解決apt子進(jìn)程啟動(dòng)出錯(cuò)的問(wèn)題吸祟。刪了以后需要autoremove一下
資料分享:wsgi概念 uwsgi概念 基于nginx和uWSGI在Ubuntu上部署Django
如何把uwsgi交給supervisor管理 unavailable-modifier-requested-0解決辦法
uwsgi手冊(cè) uwsgi部署django常見問(wèn)題匯總 django中文教程 還是建議去看英文教程,完整點(diǎn)
如上便是我參考的資料