uwsgi + nginx 部署python專案(一)

阪田銅時發表於2019-12-20

uWSGI

uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI伺服器進行交換。

要注意 WSGI / uwsgi / uWSGI 這三個概念的區分。

  • WSGI是一種通訊協議,Flask,webpy,Django、CherryPy等等都自帶WSGI,不過效能都不好。
  • uwsgi同WSGI一樣是一種通訊協議。
  • 而uWSGI是實現了uwsgi和WSGI兩種協議的Web伺服器。

為什麼有了uWSGI為什麼還需要nginx?因為nginx具備優秀的靜態內容處理能力,然後將動態內容轉發給uWSGI伺服器,這樣可以達到很好的客戶端響應。

安裝

pip install uwsgi複製程式碼

編寫uwsgi.ini檔案

在專案目錄下touch一個ini檔案,名稱隨意,vim進去,複製以下程式碼

[uwsgi]
socket = 0.0.0.0:8000  # 設定0.0.0.0表示可以接收不同伺服器的nginx傳送過來的請求,127.0.0.1表示只接收同一伺服器傳送過來的請求, 8000為應用內的監聽埠# http = 0.0.0.0:8000  # http為直接作為web伺服器啟動

chdir = /knowledge   # 指向專案目錄

wsgi-file = app.py   # 程式啟動檔案

callable = app  # 程式內應用變數名

processes = 2   # 處理器數量

threads = 4    # 執行緒數複製程式碼

啟動應用

uwsgi --ini uwsgi.ini   # 啟動後直接進控制檯nohup uwsgi --ini uwsgi.ini &    # 後臺啟動uwsgi伺服器kill -9 pid   # 關閉服務,直接kill  uwsgi的埠複製程式碼

nginx

什麼是nginx?

nginx是一款輕量級的Web 伺服器 、反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。主要有反向代理,負載均衡的功能。

什麼是反向代理?

正向代理是伺服器經過正向代理伺服器把資料給到客戶端,反向代理就是多個不同的客戶端發出請求到反向代理伺服器(nginx),反向代理伺服器按照一定規則把請求分發給伺服器A,伺服器B,伺服器C。

正向代理客戶端非常明確要訪問的伺服器地址,伺服器只清除請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端。反向代理客戶端不知道訪問的伺服器地址是哪個,只能由反向代理伺服器去分配請求給某個具體的伺服器。

什麼是負載均衡?

將伺服器接收到的請求按照規則分發的過程。

  • weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器當機,nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重資料越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的。
  • ip_hash: 每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器,這也在一定程度上解決了叢集部署環境下session共享的問題。
  • fair: 智慧調整排程演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種排程演算法。但是需要注意的是nginx預設不支援fair演算法,如果要使用這種排程演算法,請安裝upstream_fair模組
  • url_hash: 按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態伺服器的情況下提高快取效率。同樣要注意nginx預設不支援這種排程演算法,要使用的話需要安裝nginx的hash軟體包

安裝nginx

apt-get install nginx複製程式碼

nginx常用命令

service nginx start    # 啟動
service  nginx  stop   # 停止
service  nginx  reload  # 重啟
service  nginx  status   # 檢視nginx狀態
nginx -v   # 檢視版本複製程式碼

配置檔案

cd 到安裝目錄,一般是/etc/nginx,裡面有個nginx.conf檔案

vim 進去,匹配順序是先ip > 埠 > location

http {
        server {
                listen 81;   # nginx的監聽埠,瀏覽器訪問的埠,等同於0.0.0.0:81, 表示可以接收任何IP發的請求
                server_name 0.0.0.0;   # 可以直接寫域名如:www.flasktest.com,但是需要在hosts檔案設定IP和域名的對應關係
                charset UTF-8;
                access_log /etc/nginx/FlaskTest_access.log;
                error_log /etc/nginx/FlaskTest_error.log;
                client_max_body_size 75M;  # 請求檔案的最大大小

                location / {
                        include uwsgi_params;
                        uwsgi_pass 127.0.0.1:82;  # 上面的匹配成功後,會請求這個地址
                        uwsgi_read_timeout 2;
                }

        }

        }複製程式碼

測試


相關文章