Nginx+Gunicorn+Flask+Supervisor 部署 Python 服务的详细教程!

虽然标题写的是 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

image

Gunicorn

Gunicorn 能够指定多个工做进程,有多种工做模式能够供你选择。默认是同步的 sync 工做模式,除此以外还有 gevent, tronado, gthread, gaiohttp 等。

这里推荐 gevent, gevent 是一个基于 Greenlet 库,利用 python 协程来实现,这样你的 web 服务才能实现并发的功能!

以前有写过关于 gunicorn 的一篇文章,详细使用指南点击查看!

一个高性能的web服务是如何搭建的?

Nginx

Nginx 实际上只能处理静态资源请求,那么对于动态请求怎么作呢。这就须要用到 Nginx 的 upstream 模块对这些请求进行转发,即反向代理。Nginx 在这里主要是用来作负载均衡,同时它能缓存一些动态内容

安装 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

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.

Supervisor

安装 supervisor

命令以下:

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,或者本身动手写个脚本测试!

推荐阅读

一个高性能的web服务是如何搭建的?

一文读懂Python web框架和web服务器之间的关系

Flask 蓝图机制及应用

利用 Flask 动态展现 Pyecharts 图表数据的几种方法

相关文章
相关标签/搜索