一、寫在前面
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 文件復制到項目目錄即可。