zoukankan      html  css  js  c++  java
  • nginx+uwsgi+flask+supervisor 项目部署

    环境

    - Linux: Ubuntu 16.04
    - uWSGI        2.0.18 
    - Flask         1.0.2
    - supervisor    3.2.0
    - nginx/1.8.1
    

    首先区分几个概念

    uwsgi和WSGI协议

    1. WSGI

      • Web Server Gateway Interface (web服务器网管接口)
      • 是一种规范,是web服务器和web应用(django/flask) 之间的接口,是二者之间的通信桥梁
      • 没有官方的实现,更像是一个协议,约定俗成的,规定WSGI application 应该实现为一个可调用的对象。只要遵循这些协议,WSGI应用都可以在任何服务器上运行
    2. uWSGI

      • 是一个web服务器,实现了WSGI协议,uwsgi、http等协议
      • 代码完全用c编写,效率高性能稳定,用于接收前端服务器转发的动态请求并处理后给web应用程序
    3. uwsgi
      是uWSGI服务器实现的独有的协议,是一种传输协议,用户uWSGI与其他服务器间通信(
      如与Nginx之间通信)

    在Django中启动文件是wsgi.py, 该文件在生成Django目录的时候便会自动生成,用于web server 与 Django 通信,相当于提供了一个可调用的application对象,在这个类中实现了call方法。

    在flask 中 app = Flask(name) 所在的启动文件 manager.py 便是与web server 进行通信的 application可调用对象

    简单的服务器项目准备

    新建一个项目并写一个简单的flask web 服务器app
    目录~/Desktop/flask_deploy/manager.py

    1 # coding=utf8
      2 from flask import Flask
      3 
    
      4 app = Flask(__name__)
      5 
      6 
      7 @app.route('/', methods=['GET'])
      8 def index():
      9    return 'hello world'
     10 
     11 
     12 if __name__ == '__main__':
     13    app.run(debug=False)
    

    1 配置python项目虚拟环境

    • 安装虚拟环境管理工具
        pip install virtualenv virtualenvwrapper
    
    • 编辑主目录下的.bashrc文件,添加以下内容
        export WORKON_HOME=$HOME/.virtualenvs  # ./virtualvenvs便是虚拟环境安装目录
        source /urs/local/bin/virtualenvwrapper.sh
    

    可以通过whereis virtaulenvwrapper.sh 查找该源文件
    inux命令和文件查找

    • 执行以下命令使配置生效

    source ./bashrc

    • 相关命令
    mkvirtualenv -p python3 env_name  # -p 指定python环境
    workon + tab*2 # 查看本机下有哪些虚拟环境
    workon env_nmae  # 进入虚拟环境
    deactivate       # 退出虚拟环境
    rmvirtualenv env_name    # 删除虚拟环境 
    

    2 uwsgi安装与配置

    在当前虚拟环境下,进行安装相应包

    pip install falsk uwsgi
    在当前项目目录下创建文件 ~/Desktop/flask_deploy/uwsgi.ini
    vi uwsgi.ini

    [uwsgi]
    # 使用nginx连接时使用socket通信
    socket=127.0.0.1:8000
    # 直接使用自带web server 使用http通信
    #http=127.0.0.1:8000
    # 指定项目目录
    chdir=/home/python/Desktop/flask_deploy
    # 指定python虚拟环境
    home=/home/python/.virtualenvs/deploy
    # 指定加载的WSGI文件
    wsgi-file=manager.py
    # 指定uWSGI加载的模块中哪个变量将被调用
    callable=app
    # 设置工作进程的数量
    processes=2
    # 设置每个工作进程的线程数
    threads=2
    # 将主进程pid写到指定的文件
    pidfile=%(chdir)/uwsgi.pid
    # 日志文件
    req-logger=file:/home/python/Desktop/flask_deploy/log/req.log
    logger=file:/home/python/Desktop/flask_deploy/log/err.log
    
    #uid=xxx # uWSGI服务器运行时的用户id,未设置则为当前启动的用户
    #gid=xxx # uWSGI服务器运行时的用户组id
    #procname-prefix-spaced=site # 指定工作进程名称的前缀
    

    配置文件中指定wsgi启动文件有几种方式

        # 指定加载的WSGI文件
        wsgi-file=manager.py
        # 指定uWSGI加载的模块中哪个变量将被调用
        callable=app
    
        # 模块名:可调用对象app
        module=manager:app
    
        module=manager
        callable=app
    
    uwsgi相关命令
    uwsgi --ini uwsgi.ini   # 启动   
    uwsgi --stop uwsgi.pip  # 停止  
    pkill -9 uwsgi          # 停止
    

    3 supervisor 安装与监控

    简介: supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

    安装:

    apt-get install supervisor

    默认配置文件在/etc/supervisro/supervisord.conf, 自己开发可以将配置文件写在 /etc/supervisor/conf.d/目录下,文件扩展名必须为*.conf

    配置解释
    [program:uwsgi]
    command=/home/python/.virtualenvs/deploy/bin/uwsgi /home/python/Desktop/flask_deploy/uwsgi.ini
    user=root
    autostart=true
    autorestart=true
    stdout_logfile=/home/python/Desktop/flask_deploy/log/uwsgi_supervisor.log
    stderr_logfile=/home/python/Desktop/flask_deploy/log/uwsgi_supervisor_err.log
    
    - [program:module_name]表示supervisor的一个模块名  
    - command 程序启动命令如: /usr/bin/python - app.py  
    - user 进程运行的用户身份
    - autostart=true  跟随Supervisor一起启动
    - autorestart=true 挂掉之后自动重启
    - stderr_logfile, stdout_logfile 标准输出,错误日志文件
    
    启动supervisor

    sudo supervisord -c /etc/supervisor/supervisord.conf # supervisord.conf 会自动包含conf.d/目录下的conf文件

    相关命令

    1️⃣supervisorctl status  # 查看启动的项目
    2️⃣supervisorctl start module_name  # 启动项目
    3️⃣supervisorctl stop module_name   # 停止木箱
    4️⃣supervisorctl shutdown   # 关闭所有项目和服务
    

    启动后可以 ps -aux | grep 查看 uwsgi 和supervisor 都在运行了

    4 Nginx安装与配置

    apt-get install nginx
    默认安装在/etc/nginx/目录下
    配置目录 /etc/nginx/conf/flask_deploy.conf

    http {
        include       mime.types;
        default_type  application/octet-stream;
        server {
            listen  80;
            server_name 127.0.0.1; #公网地址
    
        location / {
            include      uwsgi_params;
            uwsgi_pass   127.0.0.1:8000;
        }
        }
    }
    

    启动

    usr/sbin/nginx -c /etc/nginx/conf/flask_deploy.conf

    相关命令:

    1️⃣nginx -s reload  
    2️⃣nginx -s stop  
    

    nginx 详细介绍及语法参考:nginx:详细配置说明

    不出意外的话浏览器访问:127.0.0.1即可出现hello world。

    部署负载均衡

    nginx+uwsgi+flask+supervisor部署负载均衡,

    1. 只需要在项目目录下加一个uwsgi2.ini文件(uWSGI 应用启动配置),修改soket ip,pipfile,logfile路径即可
    2. 再根据以上步骤在supervisor 配置文件中增加一个uwsgi2的监控模块,增加相应配置
    3. nginx 负载均衡配置
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        upstream flask {
            server 127.0.0.1:8000;
            server 127.0.0.1:8001;
        }
    
        server {
            listen  80;
            server_name 127.0.0.1; #公网地址
    
        location / {
            include      uwsgi_params;
            uwsgi_pass   flask;
            proxy_
        }
        }
    }
    
    

    如此,便配置了一个简单的负载均衡的服务器。访问127.0.0.1,同时用tail 命令查看 两个uwsgi配置中文件中设置的req_logfile 可以观察到流量分发的现象。

    小结

    suervisor 是个后台进程管理工具,不仅局限于监控uwsgi 服务器,还可以监控其他 可能意外宕机的服务程序。

    其他

    相对的可作为web服务器的还有Gunicorn 是从Ruby 的(Unicorn)移植的python HTTP 服务器,兼容各种框架,不需要写配置文件,轻量级的资源消耗.

    安装

    pip install gunicorn
    启动服务器
    gunicorn -w 4 -b 127.0.0.1:8080 manager:app --daemon # 已守护进程方式启动,默认为False

    gunicorn 以配置文件方式启动

    文件名 gunicorn.conf

        # 指定web服务器监听的if和端口
        bind = '127.0.0.1:8080'
        # 指定工作进程
        workers = 4
        # 指定服务器后台运行
        daemon = True
        # 保存主进程id
        pidfile = 'gunicorn.pid'
        # 启动服务器之后生成 access.log 保存访问日志
        accesslog = 'access.log'
        # 启动服务器之后生成 errorlog , 保存错误日志
        errorlog = 'error.log'
    

    启动方式:

    gunicorn -c gunicorn.conf manager:app

    Reference

    Linux后台进程管理利器:supervisor
    flask+nginx+uwsgi+supervisor项目部署

  • 相关阅读:
    【HDOJ6687】Rikka with Stable Marriage(Trie树,贪心)
    【CF1244D】Paint the Tree(树形DP,树)
    【HDOJ6681】Rikka with Cake(扫描线,线段树)
    CPU亲和力
    iostat、vmstat和mpstat命令
    sar命令介绍
    Linux网络调试工具
    svn使用入门
    深入探究C/C++基本数据类型
    core文件与gdb调试
  • 原文地址:https://www.cnblogs.com/panlq/p/10642725.html
Copyright © 2011-2022 走看看