Nginx+gunicorn+flask+docker算法部署
本篇主要記錄較為基礎算法的部署流程,不涉及到高並發內容,適合想把自己的算法部署到服務器展示給其他人。
1. 部署准備
- Flask: Python中有兩個Web開發框架,一個是Django,另一個就是flask,屬於輕量級的Web框架。
- Gunicorn: 是一個高性能的Python WSGI的HTTP Server,並且具有簡單,輕量級,高性能的特點。
- Nginx: 高性能的HTTP和反向代理Web服務器。
- Docker: 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux或Windows機器上
下面為算法部署流程圖,PC用戶請求到Nginx進行分流負載均衡,然后uwsgi協議傳輸給Web服務器gunicorn,最后傳輸給應用服務器Flask.
2. 創建Flask項目
推薦使用conda創建虛擬環境,首先安裝pip install Flask
這里為了方便理解部署整個流程,用flask官方的給的經典示例:
#main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
通常使用python main.py
運行這個應用,打開瀏覽器,輸入網址127.0.0.1:5000
回車會打開我們的網站,這種方法一般用於本地調試,因此我們需要更穩定的部署。
3. Gunicorn
pip install Gunicorn
安裝Gunicorn, 在根目錄下新建gunicorn.conf.py:
workers = 5 # 定義同時開啟的處理請求的進程數量,根據網站流量適當調整
worker_class = "gevent" # 采用gevent庫,支持異步處理請求,提高吞吐量
bind = "0.0.0.0:20020"
然后,使用命令gunicorn -w 4 -b 0.0.0.0:20020 main:app
啟動main.py
, 如果需要在后台運行加上-D
注意是大寫,gunicorn -D -w 4 -b 0.0.0.0:20020 main:app
- w:表示worker
- b: 表示ip地址和port端口號
- c: 為配置文件
或者可以直接啟動gunicorn main:app -c gunicorn.conf.py
4. Nginx
下載並安裝Nginx,有sudo apt install nginx
和源碼安裝兩種方式,注意第一種方法的配置文件在/etc/nginx/sites-available/default
路徑下,第二種默認配置文件在/usr/local/nginx/conf/nginx.conf
。
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure && make && install
如果安裝失敗,需要完全卸載Nginx
sudo apt-get --purge remove nginx #刪除nginx,–purge包括配置文件
sudo apt-get autoremove #自動移除全部不使用的軟件包
dpkg --get-selections|grep nginx #列出與nginx相關的軟件 並刪除顯示的軟件
sudo apt-get --purge remove nginx
sudo apt-get --purge remove nginx-common
sudo apt-get --purge remove nginx-core
dpkg --get-selections|grep nginx #查看
which nginx # 不在顯示nginx
Nginx運行、停止、重啟、查看狀態
sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx restart
sudo /etc/init.d/nginx status
我選擇的是第一種方式配置nginx,修改nginx配置文件vim /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:20020;
}
其中server_name為域名,localhost代表通過ip訪問,配置好Nginx后就可以啟動了,可以通過ps aux | grep nginx
查看nginx進程,然后在瀏覽器上輸入http://ip看是否正常運行。
如果發現無法訪問,可以查看一下防火牆sudo ufw status
, 打開對應端口sudo ufw allow 20020
(防火牆打開和重啟命令分別為sudo ufw enable
、sudo ufw reload
)
5. 使用Docker封裝Flask應用
首先安裝docker, 具體教程參見官網, 下面將我們為應用創建requirements.txt
,文件包括需要安裝的python庫:
gunicorn
gevent
flask
requirements.txt
是python工程部署必須要的文件,可以直接通過pip install -r requirements.txt
安裝所需依賴安裝包,然后還需要創建Dockefile
文件,以便構建Docker鏡像。
FROM python:3.6
WORKDIR /Project/demo
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "main:app", "-c", "./gunicorn.conf.py"]
FORM
指定將在其中構建新鏡像的基礎容器鏡像WORKDIR
為服務器的路徑RUN
執行任意命令COPY
將文件從你的機器復制到容器文件系統CMD
為啟動Falsk服務(demo是我們項目啟動文件:啟動應用名變量app)
接下來開始構建docker鏡像
sudo docker build -t 'flask_demo'
由於文件接近1G,所以構建需要一段時間,然后可以查鏡像是否存在:
sudo docker images
然后將鏡像push到docker hub上,具體步驟查看官網Dockers Hub Quickstart。接下來部署到服務器上,將鏡像從docker hub上拉下來,然后可以直接運行了:
- 臨時運行docker鏡像
sudo docker run -it --rm -p 20020:20020 flask_demo
- 生產環境運行(以daemon方式運行)
sudo docker run -d -p 20020:20020 --name flask_demo-server flask_demo