Flask學習之旅--Flask項目部署


一、寫在前面

  Flask 作為一個輕量級的 Web 框架,具有諸多優點,靈活方便,擴展性強,開發文檔也很豐富。在開發調試的過程中,我們往往會使用 Flask 自帶的 Web 服務器,但如果要投入到生產環境中,就需要選擇使用功能完整的服務器了。說到部署 Flask,就不得不提 WSGI 了,那么 WSGI 又是什么呢? Flask 項目又要怎么部署呢?

 

二、基礎知識

1.WSGI

  WSGI(Python Web Server Gateway Interface):Python Web 服務器網關接口,是 Python 語言定義的 Web 服務器和 Web 應用程序之間一種簡單通用的接口。WSGI 分為兩個部分,一個是“服務器”或“網關”,一個是“應用程序”或“應用框架”,在處理一個請求時,服務器為應用程序提供環境信息及一個回調函數,當應用程序完成處理請求后,通過回調函數將結果回傳給服務器。

2.幾種部署方式

1)mod_wsgi(Apache)

  Apache 是一個模塊化的服務器,由於其多平台和安全性,成為世界排名第一的 Web 服務器軟件,它可以運行在幾乎所有廣泛使用的計算機平台上。Apache 是以進程為基礎的結構,進程比線程開銷大,因而不適用於多處理器環境。要使用 Apache 來部署 Flask 的時候,需要先安裝 mod_wsgi。

2)獨立的 WSGI 容器

  (1)Gunicorn:是一個 unix 上被廣泛使用的高性能的 WSGI HTTP 服務器,和大多數的web框架兼容,並具有實現簡單,輕量級,高性能等特點。Gunicorn 會開啟大量進程,等待並處理接收到的請求,每個單獨進程能同時處理它們接收到的請求,避免進程啟動和銷毀的開銷。

  (2)Tornado是一款開源的可伸縮、非阻塞式的 Web 服務器和工具集,在高並發的應用場景中有不錯的效果。同樣,要想通過 Tornado 來部署 Flask 也是很簡便的。

  (3)Gevent是一個基於協同程序的python庫,與tornado的部署方式類似,通過gevent部署flask也是十分的便利。

3)uWSGI

   uWSGI 也是部署 Flask 的途徑之一,類似的部署途徑還有 nginx。使用 uWSGI 協議來部署 WSGI 應用的先決條件是 需要一個 uWSGI 服務器。 uWSGI 既是一個協議也是一個服務器,如果作為一個服務器, 它可以服務於 uWSGI 、 FastCGI 和 HTTP 協議。

 

三、Windows 下部署 Flask 項目

1.安裝 Python 和 Flask

  Python 版本:3.7.0,下載地址:https://www.python.org/downloads/release/python-370/

  Flask 版本:1.1.1,下載安裝:pip install flask==1.1.1。

2.安裝 Apache

  Apache 版本:2.4,下載地址:https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.41-win64-VS16.zip。下載完成后解壓,例如解壓到 E:/Apache 目錄下。

  在 cmd 中切換到該目錄,再進入 bin 目錄,然后輸入 httpd,打開瀏覽器,輸入 http://localhost,若頁面上顯示 “It works!”,則表明 Apache 啟動成功。

  1)若輸入 httpd 后報錯:Syntax error on line 39 of E:/Apache24/conf/httpd.conf: ServerRoot must be a valid directory

  解決辦法:根據顯示的目錄信息找到 httpd.conf 文件,打開后找到 Define SRVROOT "" 這一行,"" 內的內容改為 Apache 路徑,保存后重啟 Apache,則問題解決。

  2)若輸入 httpd 后報錯: Could not reliably determine the server's fully qualified domain name...

  解決辦法:還是找到 httpd.conf 文件,打開后找到 ServerName www.example.com:80 這一行,若這行被注釋則取消注釋,若找不到則添加此內容。

3.安裝 mod_wsgi  

  mod_wsgi 要下載對應的版本,比如我的電腦是 Windows 64位,Python 版本是3.7,Apache 版本是2.4,最后下載的 mod_wsgi 就是 mod_wsgi-4.5.24+ap24vc14-cp37-cp37m-win_amd64.whl,至於具體的版本,可以在這里查找和下載。下載完成之后將 .whl 文件移動到 Python/Scripts 下,然后使用 pip 進行安裝。

pip install "mod_wsgi-4.5.24+ap24vc14-cp37-cp37m-win_amd64.whl"

  安裝成功之后,在 Scripts 目錄下運行如下命令:

mod_wsgi-express module-config

  運行成功之后會輸出三行結果,截圖如下:

  

   將這三行內容復制下來,打開 Apache/conf/httpd.conf ,其中有幾十條 LoadModule 命令,然后將復制的內容粘貼到后面,再將下面兩條命令的注釋取消掉。

LoadModule rewrite_module modules/mod_rewrite.so

LoadModule vhost_alias_module modules/mod_vhost_alias.so 

   保存后重啟 Apache 即可。

4.Flask 項目創建

  假設 flask 項目目錄為:E:/Code/flask_test,其中有兩個文件:app.py 和 test.wsgi。

  app.py 中的代碼為:

 1 from flask import Flask
 2 
 3 
 4 app = Flask(__name__)
 5 
 6 
 7 @app.route('/hello')
 8 def hello():
 9     return "<h1>Hello World</h1>"
10 
11 
12 if __name__ == '__main__':
13     app.run()

  test.wsgi 中的內容為:

1 import sys
2 
3 sys.path.insert(0, "E:/Code/flask_test")
4 
5 from app import app as application

5.Apache 配置

  打開 httpd.conf 文件,找到 Listen 80,修改為 Listen 8000。然后添加如下配置信息:

<VirtualHost *:8000>    
    ServerAdmin admin@example.com
    WSGIScriptAlias / E:/Code/flask_test/test.wsgi
    <Directory 'E:/Code/flask_test/'>
        Require all granted
        Require host ip    
    </Directory>
</VirtualHost>

  保存后重啟 Apache 服務器。

6.測試

  打開瀏覽器,輸入http://127.0.0.1:8000/hello,若網頁上顯示“Hello World”,則表明部署成功,除此之外,還可以使用 postman 進行測試,地址為 http://<本機IP>:8000/hello。

 

四、Ubuntu 下部署 Flask 項目

1.環境配置

  由於我使用的 Ubuntu 自帶有 Python3.6,因此就不用再安裝 Python 了,需要做的就是安裝 pip、Flask 和 uwsgi,使用的命令如下:

sudo apt-get update

sudo apt-get install python3-pip

pip3 install flask uwsgi

  除了安裝 Python 和相應的庫之外,還需要安裝 nginx,使用 sudo apt-get install nginx 安裝即可。環境配置的過程不都是一帆風順的,下面記錄幾個可能出現的問題及解決方案:

  1)在安裝 pip 時報如下錯誤:Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

  解決辦法: sudo apt-get install python3-pip --fix-missing

  2)安裝 uwsgi 時出錯:plugins/python/uwsgi_python.h:2:10: fatal error: Python.h: No such file or directory

  出錯原因時系統缺少 python-dev,解決辦法:先安裝 python-dev,再安裝 uwsgi

sudo apt-get install python-dev

sudo apt-get install python36-dev (若上面的命令執行失敗可以嘗試用這一條,版本依據你自己實際情況而定)

pip3 install uwsgi

2.創建 Flask 項目

   假設 flask 項目目錄為:/home/tm/Desktop/flask_test,其中一個文件:app.py,其中的代碼為:

 1 from flask import Flask
 2 
 3 
 4 app = Flask(__name__)
 5 
 6 
 7 @app.route('/hello')
 8 def hello():
 9     return "<h1>Hello World</h1>"
10 
11 
12 if __name__ == '__main__':
13     app.run()

3.使用 uwsgi 部署

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

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

  其中幾個參數的含義如下:

  --socket 0.0.0.0:8000:指定暴露端口號8000;

  --protocol=http:指定使用的協議為 HTPP 協議;

  -p 3:表示啟動的服務占用3個進程;

  -w app:app:-w 指明要啟動的模塊,第一個 app 指明 py 文件,第二個 app 指明 Flask 實例。

  啟動完成之后,就可以在任意網絡連通的機器上訪問了,下面是在瀏覽器中訪問的示例截圖:

  

   至此,我們就已經成功使用 uwsgi 部署 Flask 項目了。

4.使用 nginx + uwsgi 部署

  首先需要編寫一個配置文件,那樣我們啟動服務的時候就不用手動輸入參數了,例如編輯 /home/tm/Desktop/flask_test/uwsgi.ini:

[uwsgi]
module = app:app
master = true
processes = 3
chdir = /home/tm/Desktop/flask_test
socket = 127.0.0.1:8000
chmod-socket = 660
vacuum = true

  此時,就可以使用如下命令開啟 uwsgi 服務了:

uwsgi --ini /home/tm/Desktop/flask_test/uwsgi.ini

  此時,我們已經正常啟動了uWsgi服務,但是無法直接訪問,需要繼續部署Nginx服務。下面需要編輯 nginx 的配置文件 /home/tm/Desktop/flask_test/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;
    }
  }
}

  配置結束之后運行如下命令啟動 nginx 服務,啟動無誤后,由於 nginx 監聽的是80端口,所以我們就可以通過本機地址訪問了。

nginx -c /home/tm/Desktop/flask_test/nginx.conf

  在運行的時候可能會報錯,下面是幾個可能出現的問題及對應的解決方案:

  1)報錯信息:nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)

  解決方案:報此錯誤信息是因為權限不夠,加上權限執行即可。

  2)報錯信息:open() "/home/sgx/Desktop/flask_test/mime.types" failed (2: No such file or directory) 

  解決方案:報此錯誤信息是因為項目目錄下沒有 mime.types 文件,找到 nginx 目錄,將目錄下的 mime.types 文件復制到項目目錄即可。

 


免責聲明!

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



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