虽然标题写的是 Flask,可是下面这个教程不单单只适用于 Flask, 还适用于其余Python web 框架,记得帮忙点赞!python
众所周知 Flask 是一个同步的框架,处理请求的时候是以单进程的方式,当同时访问的人数过多时,Flask 服务就会出现阻塞的状况。nginx
就像咱们买火车票同样,当买火车票的人多的时候,排队的人就会不少,队伍就会很长,相应的等待的时间会变得很长!web
所以 Flask, Django,webpy 等框架自带的 web server 性能都不好,只能用来作测试用途,线上发布则须要选择更高性能的 wsgi server 。这里推荐的部署方式:nginx + gunicorn + flask + supervisorflask
其中每一个服务表明的含义以下:缓存
Nginx:高性能 Web 服务器+负载均衡;bash
gunicorn:高性能 WSGI 服务器;服务器
gevent:把 Python 同步代码变成异步协程的库;并发
Supervisor:监控服务进程的工具;app
这里有张图,能让你有个更直观的感觉echarts
Gunicorn 能够指定多个工做进程,有多种工做模式能够供你选择。默认是同步的 sync 工做模式,除此以外还有 gevent, tronado, gthread, gaiohttp 等。
这里推荐 gevent, gevent 是一个基于 Greenlet 库,利用 python 协程来实现,这样你的 web 服务才能实现并发的功能!
以前有写过关于 gunicorn 的一篇文章,详细使用指南点击查看!
Nginx 实际上只能处理静态资源请求,那么对于动态请求怎么作呢。这就须要用到 Nginx 的 upstream
模块对这些请求进行转发,即反向代理。Nginx 在这里主要是用来作负载均衡,同时它能缓存一些动态内容
安装命令以下:
sudo apt-get install nginx
复制代码
nginx 安装完后,咱们能够经过如下命令控制 nginx 的开启和关闭
sudo /etc/init.d/nginx restart // 重启sudo /etc/init.d/nginx start 开启
sudo /etc/init.d/nginx stop 关闭
复制代码
Nginx 配置文件位于 /usr/local/nginx/conf/nginx.conf
server {
listen 8080; # 监听8080端口,能够自行配置
server_name localhost; # 配置域名
# 动态请求转发到 9600 端口(gunicorn):
location / {
proxy_pass http://127.0.0.1:9600;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
复制代码
修改完以后保存,重启 nginx.
命令以下:
pip install supervisor
复制代码
初始化配置文件:
echo_supervisord_conf > supervisor.conf
复制代码
修改配置文件,在配置文件最底部添加相应配置
[include] 本身的项目配置
[program:project]
directory = /home/jerry/Code/project ; 程序的启动目录
command = /home/jerry/.virtualenvs/parsing/bin/gunicorn -w 4 -worker-class gevent -bind 0.0.0.0:9600 app:app ; 启动命令
numprocs=1 ; number of processes copies to start (def 1)
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 1 ; 启动 1 秒后没有异常退出,就看成已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪一个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 10 ; stdout 日志文件备份数
stdout_logfile=/home/jerry/Code/project/log/gunicorn.log ; log 日志
stderr_logfile=/home/jerry/Code/project/log/gunicorn.error ; 错误日志
复制代码
编辑完以后保存,启动 supervisor。这里的启动命令和在命令行用 gunicorn 启动的命令是一致的,其中 -w 是指服务的进程数,详细命令查看我以前写的那篇文章哈。
经过配置文件启动 supervisor
supervisord -c supervisor.conf
复制代码
查看 supervisor 的状态
supervisorctl -c supervisor.conf status
复制代码
从新载入配置文件,每次修改以后记得从新载入
supervisorctl -c supervisor.conf reload
复制代码
启动指定/全部 supervisor 管理的程序进程
supervisorctl -c supervisor.conf start [all]|[appname]
复制代码
关闭指定/全部 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname]
复制代码
这时候经过 http://127.0.0.1:8080 就能访问你的应用了! 想知道效果如何,能够本身测试一下,好比在代码中增长 sleep,或者本身动手写个脚本测试!
利用 Flask 动态展现 Pyecharts 图表数据的几种方法