Flask官方有個樣例項目flaskr 指南路徑 http://flask.palletsprojects.com/en/1.1.x/tutorial/
這裏通過systemd+gunicorn(http)+venv+python3.6方式部署。flask項目打包可以參考相關文檔
python setup bdist_whell
build/lib/flaskr 這裏是項目文件,第二種方式會使用到
dist/flaskr-1.0.0-py3-none-any.whl 這個是whell類型包,可以通過pip安裝
備註:gunicorn出了http方式之外,還有unix socket方式(與nginx配合使用),文檔 http://docs.gunicorn.org/en/stable/deploy.html
配置環境
# 安裝python3
yum install python36
https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
# 配置python虛擬化環境
cd /opt
python3 -m venv venv
第一種方式:將Flask項目通過pip安裝到site-packages目錄
第一步:安裝項目
. /opt/venv/bin/activate
(venv) [root@cloudlab ~]# pip install flaskr-1.0.0-py3-none-any.whl #自動安裝setup.py配置的依賴
(venv) [root@cloudlab ~]# pip list
Package Version
------------------ -------
atomicwrites 1.3.0
attrs 19.1.0
Click 7.0
Flask 1.1.1
flaskr 1.0.0 # 這個就是flask項目
// 省略 ....
# 初始化數據庫
FLASK_APP=flaskr flask init-db
Initialized the database.
/opt/venv/var/flaskr-instance/flaskr.sqlite
第二步:配置gunicorn+systemd
# 虛擬化環境裏面安裝gunicorn
. /opt/venv/bin/activate
(venv) [root@cloudlab ~]# pip install gunicorn
# 編寫gunicorn.service
vi /usr/lib/systemd/system/gunicorn.service
[Unit]
Description='demo project'
After=network.target
[Service]
Type=forking
PrivateTmp=true
Restart=on-failure
PIDFile=/run/gunicorn.pid
ExecStart=/opt/venv/bin/gunicorn -D --access-logfile /var/log/gunicorn.log --pid /run/gunicorn.pid flaskr:create_app() -b 0.0.0.0:8080 # 也可以指定配置文件啓動
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
啓動服務
systemctl daemon-reload
systemctl start gunicorn.service
netstat -pltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1421/python3
驗證 創建user1
第二種方式:將Flask項目放置到指定目錄啓動
第一步 將項目目錄build/lib/flaskr 放置到/opt/app/下面
mv build/lib/flaskr /opt/app/
tree /opt/app/flaskr
/opt/app/flaskr
├── static
│ └── style.css
├── templates
│ ├── auth
│ │ ├── login.html
│ │ └── register.html
│ ├── base.html
│ └── blog
│ ├── create.html
│ ├── index.html
│ └── update.html
├── __init__.py
├── auth.py
├── blog.py
├── db.py
├── schema.sql
└── requirements.txt
配置gunicorn+systemd
. /opt/venv/bin/activate
# 安裝項目依賴
(venv) [root@cloudlab ~]# pip install -r requirements.txt
# 安裝gunicorn
(venv) [root@cloudlab flaskr]# pip install gunicorn
# 編寫gunicorn.service
vi /usr/lib/systemd/system/gunicorn.service
[Unit]
Description='demo project'
After=network.target
[Service]
Type=forking
PrivateTmp=true
Restart=on-failure
PIDFile=/run/gunicorn.pid
WorkingDirectory=/opt/app # 可以看到這裏比第一種方式多了一個家目錄的設置
ExecStart=/opt/venv/bin/gunicorn -D --access-logfile /var/log/gunicorn.log --pid /run/gunicorn.pid flaskr:create_app() -b 0.0.0.0:8080 # 也可以指定配置文件啓動
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
# 數據庫初始化
FLASK_APP=/opt/app/flaskr flask init-db
Initialized the database.
ll /opt/app/instance/flaskr.sqlite
-rw-r--r-- 1 root root 5120 Aug 7 19:59 /opt/app/instance/flaskr.sqlite
啓動服務
systemctl daemon-reload
systemctl start gunicorn.service
netstat -pltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1421/python3
驗證服務 創建user2