背景
服务端由第三方部署了一个基于 darknet
(一个较为轻型的完全基于C与CUDA的开源深度学习框架)的识别算法服务,通过 Flask
的 Web
服务对业务服务暴露 API
接口。作为测试,一开始是直接通过 python3 app.py
的命令行启动的服务,不过在控制台可以看到以下警告信息。
[root@localhost i-am-ai]# python3 app.py
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
也就是,不建议在生产环境中这样启动服务。前些年,我曾使用 uwsgi
成功部署过基于 Django
的 Web
应用开发环境方式启动Django,一段时间后应用没响应了。。。所以这次一开始也使用的是 uwsgi
,可这次在国产的操作系统、国产的芯片下,无论是通过 pip3
还是源码编译安装都报错:uwsgi /usr/bin/ld: 找不到 -lcrypto
什么玩意儿,果断放弃。。
安装gunicorn
Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP Server for UNIX. It’s a pre-fork worker model ported from Ruby’s Unicorn project. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy. Features:
- Natively supports WSGI, Django, and Paster
- Automatic worker process management
- Simple Python configuration
- Multiple worker configurations
- Various server hooks for extensibility
- Compatible with Python 3.x >= 3.5
以下通过 pip
安装 gunicorn
。
[root@localhost i-am-ai]# cd /home/ai/python/bin
# 通过pip安装gunicorn
[root@localhost bin]# pip3 install gunicorn
编写配置文件
我这里在 app.py
的同一目录下创建 wsgi.py
文件。
[root@localhost i-am-ai]# vi wsgi.py
from flaskapp import app
if __name__ == "__main__":
app.run()
启动应用
[root@localhost i-am-ai]# gunicorn -w 3 -b 0.0.0.0:8888 wsgi:app --timeout 120
Note:上述启动命令,除了基本的语句之外,还增加了一个 --timeout 120
的超时参数配置,主要是由于这个第三方开发的算法服务的 API
接口出奇地慢。。因此,这里类似于 Nginx
Nginx反向代理的一个算法API的接口调用超时:504,GateWay Timeout,怎么破?,也增加了一个超时配置,要不接口在默认的60s内是无法返回结果的。gunicorn超时时间
配置Flask应用开机自启
与常用的 Nginx
、 Redis
开机自启配置类似,不多解释了。
[root@localhost bin]# vi /etc/systemd/system/flaskapp.service
[Unit]
Description=A Gunicorn example to serve Flask App
After=network.target
[Service]
WorkingDirectory=/home/ai/source/i-am-ai
ExecStart=/home/ai/python/bin/gunicorn -w 3 -b 0.0.0.0:8888 wsgi:app --timeout 120
[Install]
WantedBy=multi-user.target
# 一开始是禁用自启的
[root@localhost bin]# systemctl list-unit-files | grep flaskapp
flaskapp.service disabled
# 设置开机自启
[root@localhost bin]# systemctl enable flaskapp
Created symlink /etc/systemd/system/multi-user.target.wants/flaskapp.service → /etc/systemd/system/flaskapp.service.
# 验证开机自启配置
[root@localhost bin]# systemctl list-unit-files | grep flaskapp
flaskapp.service enabled
以后在维护时常用的命令如下:
systemctl start flaskapp
systemctl enable flaskapp
systemctl status flaskapp
systemctl stop flaskapp
Reference
- gunicorn超时时间
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!