Flask+uwsgi+Nginx部署应用

作者: 伸个懒腰 | 来源:发表于2016-04-21 09:01 被阅读14300次

    之前用Flask写了个网站,然后就想部署到云主机上。搜索了一番,决定采用的部署方案是:

    • Web 服务器采用uWSGI
    • 用Supervisor引用uwsgi 作为常规启动服务
    • 基于Nginx作反向代理

    安装Python环境,Flask

    在Vultr上申请了个云主机,系统采用Ubuntu 15.10。上来先安装python环境,安装pip、virtualenv。新建一个虚拟环境venv并激活:

    wb@vultr:~/myBlog$ source venv/bin/activate
    (venv) wb@vultr:~/myBlog$
    

    接下来安装Flask和Flask的依赖,这个根据项目来定。
    我项目的启动文件manage.py如下:

    import os
    
    if os.path.exists('.env'):
        print('Importing environment from .env...')
        for line in open('.env'):
            var = line.strip().split('=')
            if len(var) == 2:
                os.environ[var[0]] = var[1]
    
    from app import create_app, db
    from app.models import User, Post
    from flask.ext.script import Manager,Shell
    
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    manager = Manager(app)
    
    def make_shell_context():
        return dict(app=app,db=db,User=User)
    
    manager.add_command("shell",Shell(make_context=make_shell_context))
    
    
    if __name__=='__main__':
        manager.run()
    

    所以运行Flask的方式如下:

    python manage.py runserver --host 0.0.0.0
    

    然后打开浏览器,输入你的云主机IP加端口号(5000)如:1.2.3.4:5000,就可以看到你的网站了。

    安装uWSGI

    安装uWSGI的方式也很简单,pip安装即可:

    (venv) wb@vultr:~/myBlog$pip install uwsgi
    

    安装完了之后就是配置了。在项目目录下新建config.ini,在config.ini中输入以下内容:

    [uwsgi]
    master = true
    home = venv
    wsgi-file = manage.py
    callable = app
    socket = :3031
    processes = 4
    threads = 2
    buffer-size = 32768
    

    其中,home是虚拟环境的目录,wsgi-file是python启动文件,callable=app这个app是 manage.py 程序文件内的一个变量,这个变量的类型是 Flask的 application 类 。socket指定了启动时使用的端口。之前写的是http = 0.0.0.0:3031,但是发现运行不起来,查了Stack Overflow之后改成了socket。
    运行uwsgi:

    (venv) wb@vultr:~/myBlog$uwsgi config.ini
    [uWSGI] getting INI configuration from config.ini
    *** Starting uWSGI 2.0.12 (64bit) on [Thu Apr 21 08:41:52 2016] ***
    compiled with version: 5.2.1 20151010 on 19 April 2016 02:03:42
    

    此时已经正常启动 uWSGI 并将 Flask 项目载入其中了,ctrl+c 关闭程序。此时在浏览器中输入1.2.3.4:3031就可以看到项目了。但这只是命令启动形式,关闭了就无法访问了。要使其随同服务器启动并作为后台服务运行才是运行环境的实际所需要。因此需要另外的工具引导uWSGI。

    安装supervisor

    我们使用supervisor引导uWSGI。安装方法:

    sudo apt-get install supervisor
    

    supervisor的全局配置文件在/etc/supervisor/supervisor.conf中,但是我们一般不改动,我们新建一个文件blog_supervisor.conf放在/etc/supervisor/conf.d目录下,里面输入以下内容:

    [program:blog] 
    # 启动命令入口 
    command=/home/wb/myBlog/venv/bin/uwsgi /home/wb/myBlog/config.ini            
    # 命令程序所在目录 
    directory=/home/wb/myBlog
    #运行命令的用户名 
    user=wb
    autostart=true
    autorestart=true
    #日志地址 
    stdout_logfile=/home/wb/myBlog/logs/uwsgi_supervisor.log
    

    启动supervisor服务:sudo service supervisor start

    安装Nginx

    Nginx是个著名的反向代理服务器。安装方法:

    sudo apt-get install nginx
    

    配置文件在/etc/nginx/sites-available中的default中,将其替换掉即可。新的default文件内容如下:

    server { 
      listen 80; 
      server_name X.X.X.X; #公网地址 
      location / { 
      include uwsgi_params;
      uwsgi_pass 127.0.0.1:3031; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理 
      uwsgi_param UWSGI_PYHOME /home/wb/myBlog/venv; # 指向虚拟环境目录 
      uwsgi_param UWSGI_CHDIR /home/wb/myBlog; # 指向网站根目录 
      uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
      uwsgi_read_timeout 100; 
     }  
    }
    

    重启Nginx服务:sudo service nginx restart
    这时候打开浏览器,输入你的主机IP,就可以看到你的项目了。

    参考:http://www.cnblogs.com/Ray-liang/p/4173923.html

    相关文章

      网友评论

      • Pocket:想问下,flask启动是通过manager框架添加的,本地启动的时候命令需要加runserver 已经指定端口号,但是配置到uwsgi是如何配置这些命令的?还是根本不需要配置,直接uwsgi指定监听哪个ip端口,flask的.py文件自动按着这个端口启动?
      • QuiryRain:uwsgi访问的少了一个参数 protocol=http 我的是没有这参数就无法访问
        QuiryRain:@西湖个莲 这个问题后来我发现了,在单使用uwsgi时我的如果不加那个参数没法访问,但是到nginx中加上那个参数就无法访问了,很抱歉啊忘了在这里说了
        e9329bd2b1c5:兄弟你把我坑了,加了这个参数虽然uwsgi可以被外网访问,但是nginx是用无法转发给uwsgi了
      • ad75e9946488:换域名怎么弄?直接把server_name换成域名就好了?
      • ImmortalZ:python manage.py runserver --host 0.0.0.0
        然后打开浏览器,输入你的云主机IP加端口号(5000)如:1.2.3.4:5000,就可以看到你的网站了。


        这一步好像不行,我用的阿里云centos
        e9329bd2b1c5:防火墙和安全组都开启试试

      本文标题:Flask+uwsgi+Nginx部署应用

      本文链接:https://www.haomeiwen.com/subject/okazlttx.html