zoukankan      html  css  js  c++  java
  • 用uWSGI和Nginx部署Flask项目

    概况

    (虚拟环境已经搭好,不做演示)

    在开发过程中,我们一般直接用Python命令直接运行Flask程序。这样的运行只适合我们开发,方便我们调试。一旦程序部署到线上,这样运行的Flask程序性能会比较低。可以采用uWSGI+Nginx进行部署。
    uWSGI
    在部署之前,我们得先了解几个概念
    wsgi web应用程序之间的接口。它的作用就像是桥梁,连接在web服务器和web应用框架之间。
    uwsgi 是一种传输协议,用于定义传输信息的类型。
    uWSGI 是实现了uwsgi协议WSGI的web服务器。

    部署

    首先准备一个flask程序,名字run.py(自己的项目主目录app.py的名字)
    from flask import Flask
    ​
    app = Flask(__name__)
    ​
    @app.route("/")
    def index():
        return '部署'
    ​
    if __name__ == '__main__':
        app.run()
    

    安装uWSGI

     pip install uwsgi
    

    在项目的目录创建一个uwsgi的配置文件

    [uwsgi]
    #配合nginx使用
    socket = 127.0.0.1:8000
    #项目路径 /自己项目路径/flask_test
    chdir = 自己项目路径
    #wsgi文件 run就是flask启动文件去掉后缀名 app是run.py里面的Flask对象 
    module = run:app
    #指定工作进程
    processes = 4
    #主进程
    master = true
    #每个工作进程有2个线程
    threads = 2
    #指的后台启动 日志输出的地方
    daemonize = uwsgi.log
    #保存主进程的进程号
    pidfile = uwsgi.pid
    #虚拟环境环境路径(在root下的.virtualenvs下查看)
    virtualenv = /虚拟环境路径/flask_test
    

    然后配置Nginx,找到Nginx的配置文件nginx.conf,在http块下加上下面代码

    server {
    	# 监听端口
        listen 80;
        # 监听ip 换成服务器公网IP
        server_name 127.0.0.1;
     
    	#动态请求
    	location / {
    	  include uwsgi_params;
    	  uwsgi_pass 127.0.0.1:8000;
    	}
    	#静态请求
    	location /static {
    		alias /自己路径下的静态文件/static;
    ​
    	}
    }
    

    启动

    启动uWSGI

    uwsgi --ini uwsgi.ini 
    

    启动Nginx(nginx是已经搭好的,直接nginx启动即可)

    然后访问Nginx监听的IP,由于我在本地部署,就直接访问http://127.0.0.1:80/

    其他命令
    uwsgi重启

    uwsgi --reload uwsgi.pid 
    

    uwsgi停止

     uwsgi --stop uwsgi.pid 




    [uwsgi]
    socket = 127.0.0.1:8081
    #由于外部还要嵌套Nginx,这里可以使用socket进行通信,如果Nginx和uwsgi部署在同一台机器上,直接使用127.0.0.1
    #如果外部直接通过uwsgi访问服务,需将socket改为http-socket或者http,将127.0.0.1改为0.0.0.0
    chdir = /path/to/yourproject
    #项目目录
    virtualenv =/path/to/venv
    #虚拟环境所在路径
    wsgi-file = flask_web.py
    #编写flask代码的py文件
    callable = application
    #Flask应用对象
    plugin = python
    master = true
    #启动主进程,来管理其他进程
    vacuum = true
    #设置退出后清理文件
    chmod-socket = 664
    stats = 0.0.0.0:9191
    listen = 4096
    #监听队列大小,默认100,太小了一压测队列就满了,调大一点
    processes = 5
    #uwsgi启动的进程数,可设为机器核数+1
    thunder-lock = true
    #防止惊群
    harakiri = 60
    #超时时间(秒)
    daemonize = /path/to/uwsgi.log
    #进程会在后台运行,并输出日志
    pidfile = /path/to/uwsgi.pid
    server {
        listen XXXX default_server;#指定监听的端口
        charset utf-8;
       
        root /var/www/html;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
    
        server_name XX.XXX.XXX.XXX; # ip地址
    
        location /recognize {
            include      uwsgi_params;
            uwsgi_pass   127.0.0.1:8081;
            uwsgi_param  UWSGI_PYHOME /path/to/venv;
            uwsgi_param  UWSGI_CHDIR /path/to/project;
            uwsgi_param  UWSGI_SCRIPT flask_web:application;
            uwsgi_read_timeout 300;
            uwsgi_connect_timeout 300;
            uwsgi_send_timeout 300;
        }
    }
    #配置uwsgi时,UWSGI_CHDIR和UWSGI_SCRIPT这两条命令顺序敏感,如果脚本在目录上一行也会导致服务无法启动。
  • 相关阅读:
    第11周学习进度条
    人月神话阅读笔记03
    人月神话阅读笔记02
    第10周学习进度条
    对各团队的评价意见
    第九周学习进度条
    《构建之法阅读笔记05》
    站立会议10
    第十一周学习进度
    cnblogs.com的用户体验
  • 原文地址:https://www.cnblogs.com/xiondun/p/13455847.html
Copyright © 2011-2022 走看看