nginx、uwsgi部署django项目理论+实战
- 基本環(huán)境:
- Ubuntu 16.04.4 LTS
- python 3.5 virtualenv
- django project deployable
#理論分析
??部署django項(xiàng)目有很多方法,方法推薦可見 django官方文檔-deployment,作為一個(gè)強(qiáng)迫癥患者,當(dāng)然是要選擇一個(gè)既簡單又高效的部署方式了。在網(wǎng)上找到了一張這個(gè)對(duì)比圖:
??由此我就基本決定用uwsgi部署我的django項(xiàng)目了,下面我們正式來介紹一下uwsgi以及相關(guān)必要理論。
##WSGI
??WSGI,the Python Web Server Gateway Interface, 也就是說WSGI 是作為 Web 服務(wù)器與Web 應(yīng)用程序或應(yīng)用框架之間的一種低級(jí)別的接口,完成協(xié)議之間的轉(zhuǎn)換。WSGI 是基于現(xiàn)存的 CGI 標(biāo)準(zhǔn)而設(shè)計(jì)的。Django框架自帶了WSGI_Server,但是性能不好,所以自帶的web server更多的是測試(debug)用途,發(fā)布時(shí)則使用生產(chǎn)環(huán)境的WSGI server。
??從上圖來看WSGI就像一個(gè)橋梁連接服務(wù)器和應(yīng)用程序。當(dāng)瀏覽器發(fā)送請(qǐng)求時(shí),服務(wù)方調(diào)用應(yīng)用方并提供環(huán)境信息,以及一個(gè)回調(diào)函數(shù)(提供給應(yīng)用程序用來將消息頭傳遞給服務(wù)器方),并接收Web內(nèi)容作為返回值。故,我們可稱WSGI是一個(gè)中間件,主要功能如下:
-
重寫環(huán)境變量后,根據(jù)目標(biāo)URL,將請(qǐng)求消息路由到不同的應(yīng)用對(duì)象。
-
允許在一個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)應(yīng)用程序或應(yīng)用框架。
-
負(fù)載均衡和遠(yuǎn)程處理,通過在網(wǎng)絡(luò)上轉(zhuǎn)發(fā)請(qǐng)求和響應(yīng)消息。
-
進(jìn)行內(nèi)容后處理,例如應(yīng)用XSLT樣式表。
##uWSGI
??uWSGI是一個(gè)Web服務(wù)器,它實(shí)現(xiàn)了WSGI協(xié)議、uwsgi、http等協(xié)議。Nginx中HttpUwsgiModule的作用是與uWSGI服務(wù)器進(jìn)行交換。而前述WSGI是一種Web服務(wù)器網(wǎng)關(guān)接口,是一個(gè)Web服務(wù)器(如nginx,uWSGI等服務(wù)器)與web應(yīng)用通信的一種規(guī)范。
uWSGI的主要特點(diǎn)如下:
- 超快的性能
- 低內(nèi)存占用
- 多app管理
- 詳盡的日志功能
- 高度可定制(內(nèi)存大小限制,服務(wù)一定次數(shù)后重啟等)
##uwsgi
??uwsgi是一個(gè)協(xié)議,是一個(gè)uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型(type of information),每一個(gè)uwsgi packet前4byte為傳輸信息類型描述。而uWSGI是實(shí)現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務(wù)器。
nginx
??所以到現(xiàn)在你應(yīng)該清楚的明白一點(diǎn),我們要配置一個(gè) django項(xiàng)目,配置一個(gè)uWSGI服務(wù)器就夠了。但是考慮到性能問題,我們?cè)趗WSGI服務(wù)器之前再加一個(gè)nginx服務(wù)器。為什么呢?原因很簡單,因?yàn)閚ginx具備優(yōu)秀的靜態(tài)內(nèi)容處理能力,所以靜態(tài)內(nèi)容由nginx自己處理;動(dòng)態(tài)內(nèi)容轉(zhuǎn)發(fā)給uWSGI服務(wù)器,這樣就可以達(dá)到更好的客戶端響應(yīng)。
#部署實(shí)戰(zhàn)
??根據(jù)上面的分析,我們的部署架構(gòu)如下圖所示:
uWSGI部署
??uwsgi部署更詳細(xì)請(qǐng)參考uwsgi官方文檔,安裝命令pip install uwsgi,這里我就簡單列出條目:
# Django-related settings [uwsgi] socket = 127.0.0.1:8001# the base directory (full path) chdir = /share_dir/newsite/# Django s wsgi file wsgi-file = newsite/wsgi.py# process-related settings # master master = true# maximum number of worker processes processes = 10 enable-threads = true threads = 1# ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true daemonize = /share_dir/newsite/uwsgi.log pidfile=/share_dir/newsite/uwsgi.pid # 啟動(dòng)uwsgi的用戶名和用戶組 uid=root gid=rootnginx
?安裝apt install nginx,之后修改配置文件如下:
server {# the port your site will be served onlisten 80 default_server;# the domain name it will serve for#server_name 127.0.0.1; # substitute your machine's IP address or FQDNcharset utf-8;# max upload sizeclient_max_body_size 75M; # adjust to taste# Django medialocation /media {alias /share_dir/newsite/media; # your Django project's media files - amend as required}location /static {alias /share_dir/newsite/global_static; # your Django project's static files - amend as required}# Finally, send all non-media requests to the Django server.location / {include /etc/nginx/uwsgi_params; # the uwsgi_params file you installeduwsgi_pass 127.0.0.1:8001;} }uwsgi和nginx參數(shù)映射文件(uwsgi_params):
uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length;uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param UWSGI_SCHEME $scheme;uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name;然后再介紹幾個(gè)常用命令:
// uwsgi命令 ps -ax | grep uwsgi //查看uwsgi運(yùn)行進(jìn)程 uwsgi yourfile.ini //啟動(dòng)uwsgi服務(wù),必須說明這是其中一種方式,其他的請(qǐng)參考官方文檔 uwsgi --stop uwsgi.pid // 停止服務(wù) uwsgi --reload uwsgi.pid // 重啟服務(wù) // nginx 命令 systemctl status/stop/restart/start nginx.services??必須說這個(gè)總結(jié)的太簡單,當(dāng)時(shí)部署我是做了大量的工作,比如了解nginx的工作模型等,有時(shí)間我再總結(jié)!
總結(jié)
以上是生活随笔為你收集整理的nginx、uwsgi部署django项目理论+实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 程序设计
- 下一篇: pandas 数据分析常用技巧