最简单的Flask Web应用:
新建文件夹myproject,里面就一个文件:myapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hi! It works!'
if __name__=='__main__':
app.run(host='0.0.0.0')
想启动该应用,只要运行python myapp.py
就可以在浏览器http://localhost:5000看到运行结果了。开心!
然鹅,这里的问题是:这个应用是单进程单线程的,如果在多个用户(高并发)的场景,这个就要跪了。
这时候Gunicorn登场了,它就是来解决这个高并发的问题的。它全名叫Green Unicorn,是一个被广泛使用的高性能的Python WSGI Unix HTTP服务器。
安装
$ pip install gunicorn
使用
在命令行下,键入:
$ gunicorn -w 4 myapp:app
可以看到输出:
[2018-10-25 20:21:12 +0800] [28597] [INFO] Starting gunicorn 19.9.0
[2018-10-25 20:21:12 +0800] [28597] [INFO] Listening at: http://127.0.0.1:8000 (28597)
[2018-10-25 20:21:12 +0800] [28597] [INFO] Using worker: sync
[2018-10-25 20:21:12 +0800] [28600] [INFO] Booting worker with pid: 28600
[2018-10-25 20:21:12 +0800] [28601] [INFO] Booting worker with pid: 28601
[2018-10-25 20:21:12 +0800] [28602] [INFO] Booting worker with pid: 28602
[2018-10-25 20:21:12 +0800] [28603] [INFO] Booting worker with pid: 28603
在浏览器键入http://localhost:8000就可以访问。
其中-w
表示启动的进程数,myapp
是Python文件名,app
是文件中的变量名或者函数名。可以看到,默认是绑定8000端口的,也就是说Python文件里那个main函数可以忽略了。
多进程高并发的问题解决了,开心!
然鹅,使用这个命令时,当我们退出终端时,这个应用就跪了,不能继续在后台运行,当然我们可以用nohup gunicorn -w 4 myapp:app &
这个命令让它在后台运行,但是后续的状态监控呀什么的,可能就要用什么ps
、kill
这种原生态命令了,这真是太TM烦了。
这时候Supervisor闪亮登场!
Supervisor是一个进程管理系统,它通过fork/exec的方式将这些被管理的进程当作它的子进程来启动,若该子进程异常中断,则父进程可以准确地获取子进程异常中断的信息。
安装
$ sudo apt install supervisor
使用
在项目文件夹下新建supervisor_app.conf文件:
[include]
files=/etc/supervisord.conf
[program:awesome_app]
directory=/home/gld/myproject
command=gunicorn -w 4 myapp:app
启动supervisord:
sudo supervisord -c myproject/supervisor_app.conf
启动我们的应用:
$ sudo supervisorctl start awesome_app
常用管理命令:
$sudo supervisorctl start [program_name]
$sudo supervisorctl stop [program_name]
$sudo supervisorctl restart [program_name] # 重启服务,注意这里不会重新加载配置文件
重新加载配置文件,重新启动正在运行的服务:
$sudo supervisorctl reload
重新加载修改过的配置并重启该服务:
$sudo supervisorctl reread
$sudo supervisorctl update
常用参数:
-w
:进程数,如-w 4
-b
:绑定地址和端口,如-b 0.0.0.0:5000
Supervisor只能监控前台程序, 如果你的程序是通过fork方式实现的daemon服务,则不能用它监控,否则会提示:BACKOFF Exited too quickly (process log may have details)。 因此像Apache、Tomcat服务默认启动都是按daemon方式启动的,则不能通过Supervisor直接运行启动脚本(service httpd start),相反要通过一个包装过的启停脚本来完成。(参考)
CentOS 7.4默认的日志打印在/var/log/supervisor/supervisord.log文件下。
Permission权限问题
有时候提示往/tmp文件夹写入文件提示PermissionErr,检查supervisor配置文件,可以设置为user=root。
exit status 127; not expected
127表示命令没找到,首先可能是directory写错,用cd命令看一下,然后可能是command命令写错,复制命令在控制台试试是否gunicorn无法使用。
supervisor: couldn’t exec celery: EACCES
CentOS Linux release 7.6.1810
安装Python3:
yum install python36u
安装pip3:
yum install python36u-pip
安装gunicorn:
pip3 install gunicorn
安装supervisor:
yum install supervisor