1. 程式人生 > >淺析Python專案伺服器部署

淺析Python專案伺服器部署

## 基礎理論 ### 關於Web伺服器和應用伺服器 基本概念: - Web伺服器主要功能就是儲存、處理、傳遞網頁,客戶端和伺服器之間基於HTTP協議進行通訊。 - 應用伺服器主要是處理動態請求,呼叫相應的物件完成對請求的處理,返回響應的結果。 兩者之間的區別: - Web伺服器主要是以HTTP為核心,WEB UI為嚮導的應用,處理一些靜態請求。 - 應用伺服器雖然也支援HTTP協議,但應用伺服器可以通過很多協議為應用程式提供商業邏輯。 ### Python專案部署架構 在我們平時搭建一個Python Web專案時,比如Django框架的專案,這時候常見的服務端架構: 1. Nginx伺服器作為代理伺服器,代理處理靜態資源(js,css,圖片)請求,以及動態請求(增刪改查)轉發以及返回處理結果。 2. uWSGI伺服器負責接受Nginx伺服器,處理過後轉發給Django應用,接受Django應用處理返回的資訊,在轉發給nginx 3. Django應用從uWSGI伺服器接收請求,呼叫相應的業務邏輯,處理資料渲染相應的頁面並且返回給uWSGI伺服器。 ### 關於cgi、wsgi、uwsgi、http協議 接下來針對上文提到Django專案部署架構,聊聊這幾個協議在這過程中的作用: - http協議:客戶端程式和Nginx伺服器通訊就是基於http協議,而Nginx伺服器作為一個代理伺服器,會根據HTTP請求返回靜態資源還是轉發動態請求。 - cgi協議:cgi協議是外部應用程式和Web伺服器之間的介面標準,簡而言之,就是規定如何讓一個程式與Web伺服器程式之間通訊。 - wsgi協議:基於現存的CGI標準設計,一個Python web框架編寫的應用程式和Web伺服器之間通訊的規範。 - uwsgi:uWSGI伺服器獨有的協議,用於uWSGI伺服器和其他Web伺服器之間的資料通訊 ### 關於cgi、fastcgi、php-fpm、FastCGI(額外) - CGI:是 Web Server 與 Web Application 之間資料交換的一種協議。 - FastCGI:同 CGI,是一種通訊協議,但比 CGI 在效率上做了一些優化。同樣,SCGI 協議與 FastCGI 類似。 - PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI 協議的介面程式。 - PHP-FPM:是 PHP(Web Application)對 Web Server 提供的 FastCGI 協議的介面程式,額外還提供了相對智慧一些任務管理。 ### 關於uWSGI、Nginx伺服器 簡單來講,uWSGI也是一個Web伺服器,他雖然同時實現了http、uwsgi、wsgi協議,但是更多被作為應用伺服器和應用程式之間進行通訊。 那麼這裡就有個疑問了,為什麼uWSGI都能直接處理http請求了,還需要Nginx伺服器?這樣處理有幾點原因: - 首先Nginx伺服器在這過程中屬於代理伺服器的角色,每當一個http請求進來,就需要經過Nginx伺服器,而Nginx伺服器的優勢就在於非同步非阻塞的網路模型,它能夠在單執行緒的情況下處理大量的請求,針對處理靜態資源請求;而對於動態請求,能夠通過快取的功能,並且配合CDN進行優化,這樣能夠極大降低系統的負載,降低客戶端響應時間。 - 其次,Nginx伺服器能夠進行負載均衡,啟用多個後端伺服器,通過Nginx對HTTP請求進行分配,這樣能夠極大優化架構的效率,提高處理的效能。 - 最後,Nginx有很多模組支援一些比如白名單,黑名單功能,並且配合keepalive實現高可用的架構. 總而言之,Nginx伺服器在處理http請求上,都有著uWSGI沒有的優勢,所以在日常部署環境中,經常會使用到Nginx+uWSGI。 ## uWSGI ### 安裝部署 uWSGI有兩種安裝方式,一種是通過pip安裝,一種是通過原始碼安裝。這裡就簡單介紹pip安裝方式,原始碼安裝有興趣可以私下自己瞭解。 ``` pip install uwsgi ``` ### 相關檔案 uWSGI伺服器在啟動的過程中主要涉及到以下這幾個檔案,其中uwsgi.sock還會涉及到Nginx相關部署的問題,在Nginx配置的時候回繼續展開講。 ``` (venv) [root@mbb-48 uwsgi]# tree . . |-- uwsgi.ini # uwsgi配置檔案 |-- uwsgi.log # uwsgi日誌檔案 |-- uwsgi.pid # uwsgi執行程序pid |-- uwsgi.sock # uwsgi socket `-- uwsgi.status # uwsgi狀態檔案 ``` ### 配置示例 以下配置是自己一個專案中用到的,其中的配置引數都是比較常見通用。 ``` [uwsgi] chdir=/data/Novel/novel_test module=novel_test.wsgi:application home=/data/Novel/venv static-map=/static=/data/Novel/novel_test/static threads=8 http=0.0.0.0:23606 master=true vacuum=true thunder-lock=true uid=root gid=root harakiri=30 post-buffering=4096 socket=%(chdir)/uwsgi/uwsgi.sock stats=%(chdir)/uwsgi/uwsgi.status pidfile=%(chdir)/uwsgi/uwsgi.pid daemonize=%(chdir)/uwsgi/uwsgi.log ``` #### 配置解析 - chdir: 定義專案的目錄 - module: 要使用的 WSGI 模組,不同的Python web框架中使用方式也不太一樣。 - home: 指定Python執行環境,這個引數針對有不同Python執行環境,比如virtualenv建立獨立Python環境的情況。 - static-map: 對映靜態目錄 - threads: 執行緒數量 - http: 指定啟動地址和埠 - master: 啟用主程序 - vacuum: 退出時,清理產生的中間檔案(sock,pid,stats) - thunder-lock: 序列化接收的內容 - uid: 指定啟動使用者 - gid: 指定啟動組 - harakiri: 設定伺服器響應時間 - post-buffering: 啟用緩衝 - socket: socket檔案存放路徑 - stats: stats檔案存放路徑 - pidfile: pid檔案存放路徑 - daemonize: 日誌檔案輸出檔案路徑 #### 額外配置 - processes: 程序數量 - buffer-size: 設定緩衝大小 - listen: 設定監聽佇列大小(預設100) - max-requests: 每個工作程序請求書的最高上限 - procname-prefix-spaced: 工作程序的字首名 - wsgi-file: 指定載入WSGI檔案 ### 常用命令 上面介紹了相關常用的配置引數,當設定uWSGI引數後,需要啟動指定配置檔案,以及有關暫停,重啟的動作。 ``` uwsgi --ini uwsgi.ini # 啟動uWSGI uwsgi --stop uwsgi.pid # 暫停uWSGI uwsgi --reload uwsgi.pid # 重啟uWSGI ``` ### 服務監控 uWSGI之一Stats伺服器機制,它能將uWSGI狀態作為一個JSON物件匯出一個socket中,只需要像我們前面配置uWSGI配置檔案一樣,新增stats選項,跟著一個有效的socket地址介面。
當你配置完畢後,就可以通過客戶端連線到指定的socket地址,將會獲得一個包含uWSGI內部統計資料的JSON物件。 ``` uwsgi --connect-and-read uwsgi.status ``` 執行完這個命令後,讀取的返回的結果是一個json字串,字串中包括每個執行緒的狀態,整個應用的負載,版本,監聽佇列等詳細的資訊。 #### uwsgitop檢視實時狀態 uwsgitop是一個開源的實時監控uWSGI伺服器狀態的工具,安裝也十分簡單: ``` pip install uwsgitop ``` 具體uwsgitop像一個top命令,監聽應用程式並且使用socket地址進行呼叫,檢視程序執行狀態,執行詳細資訊: ``` uwsgitop uwsgi/uwsgi.status uwsgi-2.0.19.1 - Sun Sep 20 15:58:48 2020 - req: 6 - RPS: 0 - lq: 0 - tx: 67.6K node: mbb-48 - cwd: /data/Novel/novel_test - uid: 0 - gid: 0 - masterpid: 15109 WID % PID REQ RPS EXC SIG STATUS AVG RSS VSZ TX ReSpwn HC RunT LastSpwn 1 100.0 15144 6 0 0 0 idle 15ms 0 0 67.6K 1 0 125.449 15:48:08 :2 16.7 - 1 0 - - idle - - - - - :3 16.7 - 1 0 - - idle - - - - - :0 33.3 - 2 0 - - idle - - - - - :1 33.3 - 2 0 - - idle - - - - - ``` 具體有興趣的同學可以參考github地址: > https://github.com/xrmx/uwsgitop ## 總結 關於uWSGI伺服器相關使用就總結到這裡,因為在平時工作中會經常接觸到,但是由於沒有應用到一些高併發的場景,對於uwsgi調優方面沒有多少經驗,等待以後遇到此類問題再繼續總結效能調優方面的問題。同時有關Nginx方面的配置留到下一篇文章繼續講,未完待續。。。。。 ### 參考文章: > https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/StatsServer.html
> https://uwsgi-docs.readthedocs.io/en/latest/Options.html#harakiri
> https://www.jianshu.com/p/c3b13b5ad3d7
> https://docs.djangoproject.com/zh-hans/2.2/howto/deployment/wsgi/uwsgi/
> https://blog.51cto.com/mbb97/