概念介紹
什么是WSGI(WSGI是一種python專用的web協議 和http類似):
- WSGI是一種規范,它定義了使用python撰寫的web app(django)與web server(uWSGI)之間介面格式,實作web app與web server間的解耦,
- WSGI 沒有官方的實作, 因為WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行
- WSGI實質:WSGI是一種描述web服務器(如nginx,uWSGI等服務器)如何與web應用程式(如用Django、Flask框架寫的程式)通信的規范、協議,
為什么需要web協議:
- 不同的框架有不同的開發方式,但是無論如何,開發出的應用程式都要和服務器程式配合,才能為用戶提供服務,
- 這樣,服務器程式就需要為不同的框架提供不同的支持,只有支持它的服務器才能被開發出的應用使用,顯然這是不可行的,
- web協議本質:就是定義了Web服務器和Web應用程式或框架之間的一種簡單而通用的介面規范,
Web協議介紹:
- Web協議出現順序: CGI -> FCGI -> WSGI -> uwsgi
- CGI: 最早的協議
- FCGI: 比CGI快
- WSGI: Python專用的協議
- uwsgi: 比FCGI和WSGI都快,是uWSGI專案自有的協議,主要特征是采用二進制來存盤資料,之前的協議都是使用字串,所以在存盤空間和決議速度上,都優于字串型協議.
uWSGI(web服務器 和nginx類似):
- 什么是uWSGI: uWSGI是一個全功能的HTTP服務器,實作了WSGI協議、uwsgi協議、http協議等,
- uWSGI作用:它要做的就是把HTTP協議轉化成語言支持的網路協議,比如把HTTP協議轉化成WSGI協議,讓Python可以直接使用,
- uWSGI特點:輕量級,易部署,性能比nginx差很多
注:
如果架構是Nginx+uWSGI+APP,uWSGI是一個中間件
如果架構是uWSGI+APP,uWSGI是一個服務器
Nginx
- Nginx是一個Web服務器,其中的HTTP服務器功能和uWSGI功能很類似
- 但是Nginx還可以用作更多用途,比如最常用的反向代理、負載均衡、攔截攻擊等,而且性能極高
Django
- Django是一個Web框架,框架的作用在于處理request和 reponse,其他的不是框架所關心的內容,
- 所以如何部署Django不是Django所需要關心的,
區別介紹
nginx和uWSGI區別:
- nginx和uWSGI都是web服務器,都可以用來部署django等服務
- nginx:處理靜態資源能力非常強,還可以提供 負載均衡、反向代理、攻擊攔截等
- uWSGI:單點部署,容易部署,性能差一些,可以支持的web協議多
uWSGI 和 uwsgi區別:
- uWSGI:是一個web服務器
- uwsgi:是一種web協議
WSGI和uwsgi區別:
- uwsgi: 也是一種web協議,傳輸快(二進制存盤,其他web協議都是字串存盤)
- WSGI: python專業的web協議
部署的作用
請求處理整體流程:

- nginx接收到瀏覽器發送過來的http請求,將包進行決議,分析url
- 靜態檔案請求:就直接訪問用戶給nginx配置的靜態檔案目錄,直接回傳用戶請求的靜態檔案
- 動態介面請求:那么nginx就將請求轉發給uWSGI,最后到達django處理
各模塊作用:
- nginx:是對外的服務器,外部瀏覽器通過url訪問nginx,nginx主要處理靜態請求
- uWSGI:是對內的服務器,主要用來處理動態請求
- uwsgi:是一種web協議,接收到請求之后將包進行處理,處理成wsgi可以接受的格式,并發給wsgi
- wsgi:是python專用的web協議,根據請求呼叫應用程式(django)的某個檔案,某個檔案的某個函式
- django:是真正干活的,查詢資料等資源,把處理的結果再次回傳給WSGI, WSGI 將回傳值進行打包,打包成uwsgi能夠接收的格式
- uwsgi接收wsgi發送的請求,并轉發給nginx,nginx最終將回傳值回傳給瀏覽器
Django + uwsgi方案:
- 沒有nginx而只有uwsgi的服務器,則是Internet請求直接由uwsgi處理,并反饋到web專案中,
- nginx可以實作安全過濾,防DDOS等保護安全的操作,并且如果配置了多臺服務器,nginx可以保證服務器的負載相對均衡,
- 而uwsgi則是一個web服務器,實作了WSGI協議(Web Server Gateway Interface),http協議等,它可以接收和處理請求,發出回應等,
- 所以只用uwsgi也是可以的,
nginx和uWSGI特點:
nginx的作用
反向代理,可以攔截一些web攻擊,保護后端的web服務器
負載均衡,根據輪詢演算法,分配請求到多節點web服務器
快取靜態資源,加快訪問速度,釋放web服務器的記憶體占用,專項專用
uWSGI的適用
單節點服務器的簡易部署
輕量級,好部署
為什么使用nginx放在最前面,而不是發送給uWSGI
注:
- 如果架構是Nginx+uWSGI+APP,uWSGI是一個中間件
- 如果架構是uWSGI+APP,uWSGI是一個服務器
- uWSGI性能比nginx差一些
- nginx還提供反向代理、負載均衡、安全攔截等
打一個比方:
- Nginx比如是一個日本人,django專案比如是一個中國人
- uwsgi相當于日語,WSGI相當于漢語
- 日本人如果想和中國人交流必須使用一個翻譯官,這個翻譯官必須要董很多種語言
- uWSGI:相當于就是一個即董uwsgi(日語)又董WSGI(漢語)
生產環境部署
在centos 7中安裝python3環境:
# 1、yum更新yum源 yum update # 2、安裝Python 3.7所需的依賴否則安裝后沒有pip3包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make # 3、在官網下載所需版本,這里用的是3.7.0版本 wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
安裝Python:
# 1、yum更新yum源 yum update # 2、安裝Python 3.7所需的依賴否則安裝后沒有pip3包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make # 3、在官網下載所需版本,這里用的是3.7.0版本 wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz 2、安裝Python # 1、解壓 tar -xvf Python-3.7.0.tgz #2、配置編譯 cd Python-3.7.0 ./configure --prefix=/usr/local/python3 # 配置編譯的的路徑(這里--prefix是指定編譯安裝的檔案夾) ./configure --enable-optimizations # 執行該代碼后,會編譯安裝到 /usr/local/bin/ 下,且不用添加軟連接或環境變數 make && make install ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # 添加軟連接 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #3、將/usr/local/python3/bin加入PATH [root@linux-node1 testProj]# vim /etc/profile #然后在檔案末尾添加 export PATH=$PATH:/usr/local/python3/bin [root@linux-node1 testProj]# source /etc/profile # 修改完后,還需要讓這個環境變數在配置資訊中生效,執行命令
初始化一個Django專案:
[root@linux-node1 /]# pip3 install django==2.0.4 [root@linux-node1 /]# mkdir /code/ [root@linux-node1 /]# cd /code/ [root@linux-node1 testProj]# django-admin startproject mmcsite [root@linux-node1 testProj]# cd /code/mmcsite [root@linux-node1 testProj]# python3 manage.py runserver 0.0.0.0:8000 # 頁面中訪問:http://192.168.56.11:8000/
安裝使用uwsgi并使用uWSGI啟動這個服務:
'''1. 安裝uwsgi''' [root@linux-node1 /]# pip3 install uwsgi [root@linux-node1 /]# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi '''2. 配置uwsgi.ini啟動檔案''' [root@linux-node1 /]# vim uwsgi.ini [uwsgi] socket = 0.0.0.0:3031 chdir = /code/mmcsite wsgi-file = /code/mmcsite/wsgi.py processes = 5 threads = 30 master = true daemonize = /code/mmcsite/uwsgi.log module=mmcsite.wsgi pidfile = /code/mmcsite/uwsgi.pid chmod-socket=666 enable-threads = true '''3. 使用uwsgi啟動django:一定要在這個專案目錄中''' [root@linux-node1 /]# uwsgi --http 192.168.56.11:80 --file mmcsite/wsgi.py --static-map=/static=static 訪問專案:http://192.168.56.11
[root@linux-node2 demo2]# vim /code/mmcsite/uwsgi.ini # uwsgi.ini檔案 [uwsgi] socket = 0.0.0.0:3031 # 指定socket監聽的地址和埠 chdir = /code/mmcsite # 專案路徑 wsgi-file = /code/mmcsite/wsgi.py # django的wsgi檔案路徑 processes = 5 # 啟動五個行程 threads = 30 # 每個行程啟動30個執行緒 master = true daemonize = /code/mmcsite/uwsgi.log # 日志存放路徑 module=mmcsite.wsgi # 使用mmcsite.wsgi模塊 pidfile = /code/mmcsite/uwsgi.pid # uwsgi啟動行程id存放路徑 chmod-socket=666 # socket權限 enable-threads = true # 允許用內嵌的語言啟動執行緒,這將允許你在app程式中產生一個子執行緒
安裝Nginx:
'''配置nginx YUM源''' [root@linux-node1 /] vim /etc/yum.repos.d/nginx.repo ``` [nginx] name=nginx repo # 下面這行centos根據你自己的作業系統修改比如:OS/rehel # 6是你Linux系統的版本,可以通過URL查看路徑是否正確 baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 ``` '''2. 安裝nginx''' [root@linux-node1 /] yum -y install nginx
配置Nginx:
'''配置Nginx''' [root@linux-node1 /]# vim /etc/nginx/conf.d/django.conf server { listen 8888; server_name 192.168.56.11; client_max_body_size 5M; gzip on; gzip_buffers 32 4K;#壓縮在記憶體中緩沖32塊 每塊4K gzip_comp_level 6 ;#壓縮級別 推薦6 gzip_min_length 4000;#開始壓縮的最小長度4bit gzip_types text/plain application/json application/javascript application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; uwsgi_ignore_client_abort on; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
啟動專案
[root@linux-node1 demo2]# systemctl restart nginx # 開啟nginx [root@linux-node1 demo2]# uwsgi --ini uwsgi.ini # 啟動uwsgi的django專案 # http://192.168.56.11:8888/ 訪問專案 [root@linux-node1 demo2]# uwsgi --stop uwsgi.pid # 關閉uwsgi
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/184120.html
標籤:Python
上一篇:Python——一些特殊的變數
