Nginx+gunicorn+flask+docker演算法部署
目錄
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"]
其中,第二行WORKDIR
為伺服器的路徑,最後一行為啟動檔案。完成這兩個檔案建立後,開始構建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-1 flask_demo