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


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

 

環境准備

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

Step1:安裝Python,pip以及nginx:

  1. sudo apt-get update
  2. sudo apt-get install python-pip python-dev nginx

Step2:安裝Python庫:uwsgi和flask

  1. pip install uwsgi flask

創建Flask項目

下面,我們以一個簡單的單文件Flask項目為例:
假設項目目錄為/home/nianshi/flask_project
編輯/home/nianshi/flask_project/main.py

  1. from flask importFlask
  2. app =Flask(__name__)
  3. @app.route("/")
  4. def hello():
  5. return"<h1 style="color:blue">Hello There!</h1>"
  6. if __name__ =="__main__":
  7. app.run(host='0.0.0.0')

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

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

運行 python run.py ,然后本地訪問 http://127.0.0.1:5000 將會看到:

title

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

使用uwsgi部署Flask項目

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

  1. 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


至此,我們已經正常使用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

  1. [uwsgi]
  2. module = run:app
  3. master = true
  4. processes =3
  5. chdir =/home/nianshi/flask_project
  6. socket =/home/nianshi/flask_project/myproject.sock
  7. socket =127.0.0.1:8000
  8. logto =/home/nianshi/flask_project/myproject.log
  9. chmod-socket =660
  10. vacuum = true

其中,文件參數說明如下:
- module相當於之前命令行中的-w參數;
- processes相當於之前的-p參數;
- socket此處包含兩個,一個是指定了暴露的端口,另外指定了一個myproject.sock文件保存socker信息。
- chdir是項目路徑地址。
- logto是日志輸出地址。

可以看到,此處我們沒有添加--protocol=http對應的配置信息。
即此時我們暴露的端口不能使用HTTP請求直接訪問,當時需要經過Nginx進行反向代理。
此時,我們可以執行如下命令來通過配置文件啟動uwsgi:

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

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

下面,我們來編輯Nginx的配置文件/home/nianshi/flask_project/nginx.conf

  1. worker_processes 4;
  2. events { worker_connections 1024;}
  3. http {
  4. include mime.types;
  5. default_type application/octet-stream;
  6. server {
  7. listen 80;
  8. location /{
  9. include uwsgi_params;
  10. uwsgi_pass 127.0.0.1:8000;
  11. }
  12. }
  13. }

其中,如下兩行指定反向代理的信息:

  1. include uwsgi_params;
  2. uwsgi_pass 127.0.0.1:8000;

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM