天天看點

uwsgi啟動Django項目

概念

WSGI是Web伺服器網關接口。它是一個規範,描述了Web伺服器如何與Web應用程式通信,以及Web應用程式如何連結在一起以處理一個請求,(接收請求,處理請求,響應請求)
基于wsgi運作的架構有bottle,DJango,Flask,用于解析動态HTTP請求
支援WSGI的伺服器
    wsgiref
        python自帶的web伺服器
    Gunicorn
        用于linux的 python wsgi Http伺服器,常用于各種django,flask結合部署伺服器。
    mode_wsgi
        實作了Apache與wsgi應用程式的結合
    uWSGI
        C語言開發,快速,自我修複,開發人員友好的WSGI伺服器,用于Python Web應用程式的專業部署和開發。

在部署python程式web應用程式時,可以根據性能的需求,選擇合适的wsgi server,不同的wsgi server差別在于并發支援上,有單線程,多程序,多線程,協程的差別,其功能還是近似,無非是請求路由,執行對應的函數,傳回處理結果。




Django部署

Django的主要部署平台是 WSGI,這是用于Web伺服器和應用程式的Python标準。

Django的 startproject管理指令設定一個簡單的預設WSGI配置,可以根據需要為您的項目進行調整,并訓示任何符合WSGI的應用程式伺服器使用。

application 
使用WSGI部署的關鍵概念是應用程式伺服器用于與代碼通信的 application 可調用。它通常在伺服器可通路的Python子產品中作為名為 application 的對象提供。

startproject 指令建立包含這樣的 application 可調用的檔案 <project_name>/wsgi.py. ,它被Django的開發伺服器和生産WSGI部署使用。
WSGI伺服器從其配置中擷取 application 可調用的路徑。 Django的内置伺服器,即 runserver 指令,從 WSGI_APPLICATION 設定讀取它。
           
1 首先nginx 是對外的服務接口,外部浏覽器通過url通路nginx,

2nginx 接收到浏覽器發送過來的http請求,将包進行解析,分析url,如果是靜态檔案請求就直接通路使用者給nginx配置的靜态檔案目錄,直接傳回使用者請求的靜态檔案,

如果不是靜态檔案,而是一個動态的請求,那麼nginx就将請求轉發給uwsgi,uwsgi 接收到請求之後将包進行處理,處理成wsgi可以接受的格式,并發給wsgi,wsgi 根據請求調用應用程式的某個檔案,某個檔案的某個函數,最後處理完将傳回值再次交給wsgi,wsgi将傳回值進行打包,打包成uwsgi能夠接收的格式,uwsgi接收wsgi 發送的請求,并轉發給nginx,nginx最終将傳回值傳回給浏覽器。

3要知道第一級的nginx并不是必須的,uwsgi完全可以完成整個的和浏覽器互動的流程,但是要考慮到某些情況

1 安全問題,程式不能直接被浏覽器通路到,而是通過nginx,nginx隻開放某個接口,uwsgi本身是内網接口,這樣運維人員在nginx上加上安全性的限制,可以達到保護程式的作用。

2負載均衡問題,一個uwsgi很可能不夠用,即使開了多個work也是不行,畢竟一台機器的cpu和記憶體都是有限的,有了nginx做代理,一個nginx可以代理多台uwsgi完成uwsgi的負載均衡。

3靜态檔案問題,用django或是uwsgi這種東西來負責靜态檔案的處理是很浪費的行為,而且他們本身對檔案的處理也不如nginx好,是以整個靜态檔案的處理都直接由nginx完成,靜态檔案的通路完全不去經過uwsgi以及其後面的東西。
為什麼要用nginx,uwsgi
           

梳理

nginx、WSGI、uwsgi、uWSGI、django這幾個關系梳理一下

wsgi    全稱web server gateway interface,wsgi不是伺服器,也不是python子產品,隻是一種協定,描述web server如何和web application通信的規則。
運作在wsgi上的web架構有bottle,flask,django
           
uwsgi    和wsgi一樣是通信協定,是uWSGI伺服器的單獨協定,用于定義傳輸資訊的類型
           
uWSGI    是一個web伺服器,實作了WSGI協定,uwsgi協定。a
           
nginx    web伺服器,更加安全,更好的處理處理靜态資源,緩存功能,負載均衡,是以nginx的強勁性能,配合uWSGI伺服器會更加安全,性能有保障。
           
django 進階的python web架構,用于快速開發,解決web開發的大部分麻煩,程式員可以更專注業務邏輯,無須重新造輪子
           
uwsgi啟動Django項目
uwsgi啟動Django項目

web伺服器

傳統的c/s架構,請求的過程是
用戶端 > 伺服器 
伺服器 > 用戶端
伺服器就是:1.接收請求 2.處理請求 3.傳回響應
           

web架構層

HTTP的動态資料交給web架構,例如django遵循MTV模式處理請求。
HTTp協定使用url定位資源,urls.py将路由請求交給views視圖處理,然後傳回一個結果,完成一次請求。
web架構使用者隻需要處理業務的邏輯即可。
           

如果将一次通信轉化為“對話”的過程

Nginx:hello wsgi,我剛收到一個請求,你準備下然後讓django來處理吧

WSGI:好的nginx,我馬上設定環境變量,然後把請求交給django

Django:謝謝WSGI,我處理完請求馬上給你響應結果

WSGI:好的,我在等着

Django:搞定啦,麻煩wsgi吧響應結果傳遞給nginx

WSGI:太棒了,nginx,響應結果請收好,已經按照要求傳遞給你了

nginx:好滴。我把響應交給使用者。合作愉快
           

uwsgi啟動python web

讓你的django在linux上,支援并發形式啟動,支援多程序,多線程,乃至于協程的一個C語言編寫的高性能工具

1.安裝uwsgi工具
pip3 install -i https://pypi.douban.com/simple  uwsgi

2.編寫uwsgi.ini配置檔案,以多程序形式啟動tf_crm
touch uwsgi.ini  #手動建立此uwsgi的配置檔案,寫入如下的内容參數,去啟動crm
# 寫入如下的功能性的參數配置,用于啟動項目
# 這些部署的流程,是國外的uwsgi官網,給與的用法,我們照着用即可
# 注意要根據你自己的目錄,修改如下的參數

[uwsgi]
# Django-related settings
# the base directory (full path)
#  填寫crm項目的第一層絕對路徑
chdir           = /opt/sssss/
# Django's wsgi file
# 填寫crm項目第二層的相對路徑,找到第二層目錄下的wsgi.py
# 這裡填寫的不是路徑,是以上一個參數為相對,找到第二層項目目錄下的wsgi.py檔案
module          = sssss.wsgi
# the virtualenv (full path)
# 填寫虛拟環境解釋器的第一層工作目錄 
home            = /opt/sssss/saas
# process-related settings
# master
master          = true
# maximum number of worker processes
# 代表定義uwsgi運作的多程序數量,官網給出的優化建議是 2*cpu核數+1 ,單核的cpu填寫幾?
# 如果是單程序,十萬個請求,都丢給一個程序去處理
# 3個工作程序,十萬個請求,就分給了3個程序去分攤處理
processes       = 3

# the socket (use the full path to be safe
# 這裡的socket參數,是用于和nginx結合部署的unix-socket參數,這裡臨時先暫停使用
# socket          = 0.0.0.0:8000
#  線上不會用http參數,因為對後端是不安全的,使用socket參數是安全的連接配接,用nginx反向代理去通路
# 後端程式是運作在防火牆内部,外網是無法直接通路的
# 臨時使用http參數,便于我們用浏覽器調試通路
http =  0.0.0.0:8000

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true


3.此時可以用指令,基于uwsgi協定的一個高性能web後端啟動了
uwsgi  --ini  ./uwsgi.ini  #指定配置檔案啟動後端

4.此時crm項目,已經用uwsgi支援了3個程序的啟動了,但是由于uwsgi對靜态檔案的解析性能很弱,線上是丢給nginx去處理的

           
uwsgi啟動Django項目

配置uwsgi

[uwsgi]
#使用nginx連接配接時使用,Django程式所在伺服器位址
socket=0.0.0.0:8001
#直接做web伺服器使用,Django程式所在伺服器位址
#http=192.168.88.128:8003
#項目目錄
chdir=/home/yulinapp
#項目中wsgi.py檔案的目錄,相對于項目自錄
wsgi-file=yulinapp/industrial_infomation_api/wsgi.py
#程序數
processes=4
#線程數
threads=2
#uwsgi伺服器的角色
master=True
#存放程序編号的檔案
pidfile=uwsgi. pid
#使用者
uid=root
gid=root

           

nginx配置 https://www.cnblogs.com/zgboy/p/14680837.html