• Flask部署| gunicorn、nginx部署flask项目,并用supervisor来管理进程


    本科的时候做公众号,开始提供学生教务查询服务,后端从PHP转到Python,无论是使用django还是flask,部署都没PHP那么方便,每次修改程序完,都是ps ax,然后再kill,再run。emmmmmm,其实一直都知道supervisor,之前配置过几次,都没配成功 ,也就没耐心好好去学一学,刚好寒假想重新学一下flask,就尝试了一下,配置成功,顺便记录下,以便以后的使用。

    Flask项目开发

    emmmmmm,这里就不赘述了,我这里部署的是自己根据Flask官方文档进行练习的项目,如果觉得还不错,可以给个star哦
    Github地址:https://github.com/LDouble/Flask-Learning

    用gunicorn运行Flask项目

    Flask自带server性能等问题,没办法部署到生产环境,之前用的时候,官方提供了很多种方案,详情见http://www.pythondoc.com/flask/deploying/,我是误打误撞选择了gunicorn,而且觉得用起来挺舒服的。

    • 安装gunicorn
      pip3 install gunicorn

    • 通过命令启动程序

    gunicorn --workers=2 test:app # test为模块名,test:app,意味着我的test.py中的服务器实例化对象为app workers=2 代表2个进程
    [2018-02-18 16:50:18 +0800] [4858] [INFO] Starting gunicorn 19.7.1
    [2018-02-18 16:50:18 +0800] [4858] [INFO] Listening at: http://127.0.0.1:8000 (4858) #默认运行在8000端口
    [2018-02-18 16:50:18 +0800] [4858] [INFO] Using worker: sync #
    [2018-02-18 16:50:18 +0800] [4863] [INFO] Booting worker with pid: 4863
    [2018-02-18 16:50:18 +0800] [4864] [INFO] Booting worker with pid: 4864
    

    其它更多参数以及说明参考
    http://docs.gunicorn.org/en/stable/run.html#commands
    http://blog.csdn.net/y472360651/article/details/78538188

    • 编写配置文件
      那么多配置文件,我们要是全部都在命令行输入,岂不是太麻烦了,所以我们可以通过加载配置文件来运行程序。配置文件的参数和上面提到的差不多,可以按照自己的需要选择何时的参数即可。
    import  os
    from  gevent import monkey
    monkey.patch_all()
    import multiprocessing
    debug = False
    bind = "0.0.0.0:5001"
    pidfile = "gunicorn.pid"
    logfile = "error.log"
    workers = multiprocessing.cpu_count()*2 + 1
    worker_class = "gevent" # 异步非阻塞
    reload = True # 自动重新加载
    #daemon = True
    
    gunicorn -c gunc.py hello:app #运行程序
    

    supervisor 配置管理进程

    • 安装supervisor并生成配置文件模板
    pip install supervisor #因为supervisor目前只支持py2,所以不能用pip3进行安装 emmmmmm
    echo_supervisord_conf > supervisor.conf # 导出配置模板
    # 然后supervisor.conf 尾部添加内容如下:
    [program:hello_world] ;hello_word 是自己给进程取的名,随意
    command=gunicorn -c gunc.py hello:app    ; supervisor启动命令
    directory=/www/Flask-Learning/hello_world                                             ; 项目的文件夹路径
    startsecs=0                                                                             ; 启动时间
    stopwaitsecs=0                                                                          ; 终止等待时间
    autostart=false                                                                         ; 是否自动启动
    autorestart=false                                                                       ; 是否自动重启
    stdout_logfile=/www/log/hello.log                           ; log 日志
    stderr_logfile=/www/log/hello.err                           ; 错误日志
    
    # 加载配置文件并启动supervisor
    supervisord -c supervisor.conf
    # 管理项目
    supervisorctl reload :修改完配置文件后重新启动supervisor
    supervisorctl status :查看supervisor监管的进程状态
    supervisorctl start 进程名 :启动XXX进程 进程名就是你刚刚配置文件的进程名
    supervisorctl stop 进程名 :停止XXX进程
    supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
    supervisorctl update:根据最新的配置文件,启动新配置
    
    • 开机自动启动supervisor
    # Ubuntu为例
    vim /etc/rc.local
    #添加以下内容
    supervisord -c path/supervisor.conf # path是supervisor.conf的路径
    supervisorctl start all #启动所有的程序
    

    Nginx实现反向代理

    至于为什么要用Nginx实现反向代理,各有自己的需求,这个在知乎上也有讨论,可以看看https://www.zhihu.com/question/38528616,我是因为一个服务器上有多个应用,而且期末的时候需要考虑到负载均衡。

    反向代理和平常的反向代理一样的,
    vim /etc/nginx/site-enable/default

    # 添加server
    server {
        listen    80;
        server_name hello_flask.it592.com;
        root /www/Flask-Learning/hello_world;
        location / {
    	    proxy_pass http://127.0.0.1:5001; #gunicorn运行的端口
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    

    部署完毕

    这大概就是完整的部署过程了,我的网站地址:http://hello_flask.it592.com/api/

  • 相关阅读:
    MarkDownPad2 注册码
    如何让你的.vue在sublime text 3 中变成彩色?
    字典树入门
    博弈论
    复杂度问题
    gets scanf以及缓冲区域的问题
    对象
    矩阵转置的一般算法
    二叉树的建立、遍历、叶子节点计数、深度计算
    D
  • 原文地址:https://www.cnblogs.com/xmxj0707/p/8452881.html
Copyright © 2020-2023  润新知