參考文檔:
wsgi詳解:https://blog.csdn.net/li_101357/article/details/52748323
wsgi協議介紹(萌新版):https://blog.csdn.net/j163you/article/details/80919360
廖雪峰web編程講解:https://www.liaoxuefeng.com/wiki/897692888725344/923057027806560
WSGI是什么?
-
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協議:
1)不同的框架有不同的開發方式,但是無論如何,開發出的應用程序都要和服務器程序配合,才能為用戶提供服務。
2) 這樣,服務器程序就需要為不同的框架提供不同的支持,只有支持它的服務器才能被開發出的應用使用,顯然這是不可行的。
3)web協議本質:就是定義了Web服務器和Web應用程序或框架之間的一種簡單而通用的接口規范。
Web協議介紹
Web協議出現順序: CGI -> FCGI -> WSGI -> uwsgi
1. CGI: 最早的協議
2. FCGI: 比CGI快
-
WSGI: Python專用的協議
-
uwsgi: 比FCGI和WSGI都快,是uWSGI項目自有的協議,主要特征是采用二進制來存儲數據, 議都是使用字符串,所以在存儲空間和解析速度上,都優於字符串型協議.
uwsgi是什么?
-
它是一個二進制協議,可以攜帶任何類型的數據。
-
一個uwsgi分組的頭4個字節描述了這個分組包含的數據類型。
-
uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信;
uWSGI是什么?(web服務器 和nginx類似)
-
什么是uWSGI: uWSGI是一個全功能的HTTP服務器,實現了WSGI協議、uwsgi協議、http協議等。
-
uWSGI**作用:**它要做的就是把HTTP協議轉化成語言支持的網絡協議,比如把HTTP協議轉化成WSGI協議,讓Python可以直接使用。
-
uWSGI特點:輕量級,易部署,性能比nginx差很多
注:
如果架構是Nginx+uWSGI+APP,uWSGI是一個中間件 如果架構是uWSGI+APP,uWSGI是一個服務器
WSGI / uwsgi / uWSGI 這三個概念的區分。
-
WSGI是一種通信協議。通常用戶django框架和uWSGI服務器之間通信。(如果說的更細致的話就是用來和Python WSGI model)
-
uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。
-
而uWSGI是實現了uwsgi和WSGI等協議的Web服務器
nginx是什么?
-
Nginx是一個Web服務器,其中的HTTP服務器功能和uWSGI功能很類似
-
但是Nginx還可以用作更多用途,比如最常用的反向代理、負載均衡、攔截攻擊等,而且性能極高
django是什么?
1. Django是一個Web框架,框架的作用在於處理request和 reponse,其他的不是框架所關心的內容。
2. 所以如何部署Django不是Django所需要關心的。
請求處理整體流程
-
nginx接收到瀏覽器發送過來的http請求,將包進行解析,分析url
-
靜態文件請求:就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件
-
動態接口請求:那么nginx就將請求轉發給uWSGI,最后到達django處理
各模塊作用
1. nginx:是對外的服務器,外部瀏覽器通過url訪問nginx,nginx主要處理靜態請求
2. uWSGI:是對內的服務器,主要用來處理動態請求
3. uwsgi:是一種web協議,接收到請求之后將包進行處理,處理成wsgi可以接受的格式,並發給wsgi
4. WSGI:是python專用的web協議,根據請求調用應用程序(django)的某個文件,某個文件的某個函數
5. django:是真正干活的,查詢數據等資源,把處理的結果再次返回給WSGI, WSGI 將返回值進行打包,打包成uwsgi能夠接收的格式
6. uwsgi接收wsgi發送的請求,並轉發給nginx,nginx最終將返回值返回給瀏覽器
Django + uWSGI方案
1. 沒有nginx而只有uwsgi的服務器,則是Internet請求直接由uwsgi處理,並反饋到web項目中。
2. nginx可以實現安全過濾,防DDOS等保護安全的操作,並且如果配置了多台服務器,nginx可以保證服務器的負載相對均衡。
3. 而uwWSGI則是一個web服務器,實現了WSGI協議(Web Server Gateway Interface),http協議等,它可以接收和處理請求,發出響應等。所以只用uwsgi也是可以的。
nginx和uWSGI特點
1)nginx的作用
1.反向代理,可以攔截一些web攻擊,保護后端的web服務器
2.負載均衡,根據輪詢算法,分配請求到多節點web服務器
3.緩存靜態資源,加快訪問速度,釋放web服務器的內存占用,專項專用
2)uWSGI的適用
1.單節點服務器的簡易部署
2.輕量級,好部署
1、在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 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 # 修改完后,還需要讓這個環境變量在配置信息中生效,執行命令
2、初始化一個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/
3、安裝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
4、配置uWSGI文件
[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程序中產生一個子線程
5、安裝配置nginx
安裝nginx

'''1. 配置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
[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 { } }
6、啟動項目
[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