1. 程式人生 > >使用Flask+uwsgi+Nginx部署Flask正式環境

使用Flask+uwsgi+Nginx部署Flask正式環境

宣告:本文轉載自https://www.missshi.cn/api/view/blog/5b1511a213d85b1251000000,用以參考學習。

在本文中,我們將以實際專案為例,講解如何使用Flask+uwsgi+Nginx部署Flask正式環境。

環境準備

在開始正式講解之前,我們將首先進行環境準備。

Step1:安裝Python,pip以及nginx:
sudo apt-get update
sudo apt-get install python-pip python-dev nginx
Step2:安裝Python庫:uwsgi和flask
pip install uwsgi flask

建立Flask專案

下面,我們以一個簡單的單檔案Flask專案為例:

假設專案目錄為/home/nianshi/flask_project。
編輯/home/nianshi/flask_project/main.py:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "<h1 style="color:blue">Hello There!</h1>"
if __name__ == "__main__":
    app.run(host='0.0.0.0')

編輯/home/nianshi/flask_project/run.py:

from main import app
if __name__ == "__main__":
    app.run()

執行 python run.py ,然後本地訪問 http://127.0.0.1:5000 將會看到:
在這裡插入圖片描述

當然直接使用python run.py執行服務的方式只適合本地開發。線上執行時要保證更高的效能和穩定性,我們需要使用uwsgi進行部署。

使用uwsgi部署Flask專案

使用uwsgi部署Flask專案只需要換一種命令來啟動服務即可:

uwsgi --socket 0.0.0.0:5000 --protocol=http -p 3 -w run:app

我們來對uwsgi的引數進行分別講解:

1.--socket 0.0.0.0:5000:指定暴露埠號為5000。
2.--protocol=http:說明使用 http 協議,即埠5000可以直接使用HTTP請求進行訪問。
3.-p 3表示啟動的服務佔用3個程序。
4.-w run:app:-w 指明瞭要啟動的模組,run 就是專案啟動檔案 run.py 去掉副檔名,app 是 run.py 檔案中的變數 app,即 Flask 例項。

啟動完成後,我們可以在任意網路連通的機器上開啟瀏覽器,並訪問如下地址:
http://server_domain_or_IP:5000

可以看到結果同樣如下:
title
至此,我們已經正常使用uwsgi部署了Flask專案。

使用nginx + uwsgi部署Flask專案

既然我們已經可以好似用uwsgi來部署Flask專案了,那麼我們為什麼還要使用Nginx + uwsgi來部署呢?
使用Nginx有如下一些優點:

  • 安全:不管什麼請求都要經過代理伺服器,這樣就避免了外部程式直接攻擊web伺服器
  • 負載均衡:根據請求情況和伺服器負載情況,將請求分配給不同的web伺服器,保證伺服器效能
  • 提高web伺服器的IO效能:對於一些靜態檔案,可以直接由反向代理處理,不經過web伺服器

那麼,應該如何將Nginx與uwsgi結合來部署Flask專案呢?

在開始講解Nginx之前,我們首先講解如何將複雜的uwsgi命令引數儲存在配置檔案中,從而每次啟動uwsgi時,無需新增繁瑣的引數,只需要指定配置檔案即可。
編輯/home/nianshi/flask_project/uwsgi.ini:

[uwsgi]
module = run:app
master = true
processes = 3
chdir = /home/nianshi/flask_project
socket = /home/nianshi/flask_project/myproject.sock
socket = 127.0.0.1:8000
logto = /home/nianshi/flask_project/myproject.log
chmod-socket = 660
vacuum = true

其中,檔案引數說明如下:

  • module相當於之前命令列中的-w引數;
  • processes相當於之前的-p引數;
  • socket此處包含兩個,一個是指定了暴露的埠,另外指定了一個myproject.sock檔案儲存socker資訊。
  • chdir是專案路徑地址。
  • logto是日誌輸出地址。

可以看到,此處我們沒有新增--protocol=http對應的配置資訊。
即此時我們暴露的埠不能使用HTTP請求直接訪問,當時需要經過Nginx進行反向代理。
此時,我們可以執行如下命令來通過配置檔案啟動uwsgi:

uwsgi --ini /home/nianshi/flask_project/uwsgi.ini

此時,我們已經正常啟動了uWsgi服務,但是無法直接訪問,需要繼續部署Nginx服務。

下面,我們來編輯Nginx的配置檔案/home/nianshi/flask_project/nginx.conf:

worker_processes 4;
events { worker_connections 1024; }
http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen 80;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
        }
    }
}

其中,如下兩行指定反向代理的資訊:

include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;

兩個分別指明瞭代理的解析方式是通過uwsgi解析以及uWsgi暴露的埠地址為127.0.0.1:8000。
下面,我們啟動Nginx服務:

nginx -c /home/nianshi/flask_project/nginx.conf

啟動完成後,由於nginx本身監聽的埠是80埠,因此我們可以直接訪問機器地址進行訪問:
title