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 enablesudo 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


免責聲明!

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



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