虽然标题是Flask,但是下面的教程不仅适用于Flask,也适用于其他Pythonweb框架,记得点个赞!众所周知,Flask是一个同步框架。在处理请求时,它使用单个进程。当同时访问人数过多时,Flask服务会被阻塞。就像我们买火车票一样,买火车票的人多的时候,排队的人就会很多,队伍就会排得很长,对应的等待时间也会变得很长!因此,Flask、Django、webpy等框架自带的web服务器性能很差,只能做测试用。在线发布需要选择性能更高的wsgi服务器。这里推荐部署方式:nginx+gunicorn+flask+supervisor各服务代表含义如下:Nginx:高性能web服务器+负载均衡;gunicorn:高性能WSGI服务器;gevent:将Python同步代码转为异步协程库;Supervisor:监控服务进程的工具;这里放一张图,可以让大家对Gunicorn有更直观的感受。Gunicorn可以指定多个工作进程,有多种工作模式供您选择。默认是同步sync工作模式,另外还有gevent、tronado、gthread、gaiohttp等。这里推荐gevent,gevent是一个基于Greenlet的库,使用python协程实现,让你的web服务实现并发功能!之前写过一篇关于gunicorn的文章,点击查看详细使用指南!一个高性能的Web服务是如何构建的?NginxNginx其实只能处理静态资源请求,那么动态请求呢?这就需要使用Nginx的upstream模块来转发这些请求,也就是反向代理。Nginx在这里主要是用来做负载均衡的,可以缓存一些动态的内容。nginx的安装命令如下:sudoapt-getinstallnginxnginx安装完成后,我们可以通过以下命令控制nginx的开启和关闭sudo/etc/init.d/nginxrestart//重启sudo/etc/init.d/nginxstart打开sudo/etc/init.d/nginxstop关闭配置nginxNginx配置文件位于/usr/local/nginx/conf/nginx.confserver{listen8080;#监听8080端口,可以自己配置server_namelocalhost;#配置域名#动态请求转发到9600端口(gunicorn):location/{proxy_passhttp://127.0.0.1:9600;proxy_redirect关闭;proxy_set_headerX-Real-IP$remote_addr;proxy_set_header主机$host;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_read_timeout300;proxy_send_timeout300;修改配置文件,在配置文件底部添加相应的配置[include]自己的项目配置[program:project]directory=/home/jerry/Code/project;程序启动目录command=/home/jerry/.virtualenvs/parsing/bin/gunicorn-w4-worker-classgevent-bind0.0.0.0:9600app:app;启动命令numprocs=1;要启动的进程副本数(def1)autostart=true;supervisord启动时自动启动startsecs=1;如果启动1秒后没有异常退出,则视为正常启动。自动重启=真;程序异常退出后自动重启startretries=3;启动失败自动重试次数,默认3次user=root;使用哪个用户启动redirect_stderr=true;将stderr重定向到stdout,默认为falsestdout_logfile_maxbytes=20MB;stdout日志文件大小,默认50MBstdout_logfile_backups=10;stdout日志文件备份数stdout_logfile=/home/jerry/Code/project/log/gunicorn.log;日志日志stderr_logfile=/home/jerry/Code/project/log/gunicorn.error;编辑后保存错误日志,并启动supervisor。这里的启动命令和命令行中用gunicorn启动的命令是一样的,其中-w指的是服务进程数,详细命令见我之前写的文章。通过配置文件启动supervisor的基本命令supervisord-csupervisor.conf查看supervisor的状态supervisorctl-csupervisor.confstatusreload配置文件,每次修改后记得重新加载supervisorctl-csupervisor.confreload启动指定/所有supervisor管理程序进程supervisorctl-csupervisor.confstart[all]|[appname]关闭指定/所有supervisor管理的程序进程supervisorctl-csupervisor.confstop[all]|[appname]此时通过http://127.0.0.1:8080然后你就可以访问你的应用了!想知道效果可以自己测试一下,比如在代码中加入sleep,或者自己写个脚本测试!推荐阅读一个高性能的web服务是如何构建的?一篇文章了解Pythonweb框架与web服务器的关系Flask蓝图机制及应用使用Flask动态展示Pyecharts图表数据的几种方法了解更多请关注我公众号,Python编程与实战
