• uWSGI+Nginx+Flask在Linux下的部署


           搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,希望给读者能够少走弯路。

           简单来说,uWSGI是一个web服务器,Nginx进行反向代理的其实跟这些服务器可以说没有任何关系,你提供动态内容的服务器可以是apache/nginx/tomcat,当然也可以是uWSGI,他们之间的代理关系其实都是通过tcp/ip协议进行通信的。当然uWSGI相对于其它服务器来说有其特殊的地方,不同之处在于它可以提供独特的uwsgi协议进行通信。也就是说,nginx和uWSGI之间的通信协议可以有多种选择,但常用http和uwsgi这两种。
     
      搞懂了这个之后,整个部署过程就就剩下相对独立的几步:
        1、首先要有一个flask应用
        2、然后用uWSGI对flask应用进行部署
        3、配置nginx的反向代理,指向uWSGI的ip和端口,或者指向sock文件

    1、flask应用

            这里的flask应用随意就好了。下面是一个简单的应用:

            目录:

    /home/ubuntu/flask_test/
            app.py
            templates/
                    index.html
            static/    

      app.py的内容:

     1 from flask import Flask,render_template
     2 
     3 app = Flask(__name__)
     4 
     5 @app.route('/')
     6 def index():
     7     return render_template('index.html')
     8 
     9 if __name__ == '__main__':
    10     app.run()

    2、用uWSGI对flask应用进行部署

    既然uWSGI是一个服务器,使用前就一定要安装,在python下,可以直接使用命令pip install uwsgi安装即可。注意,这里如果是在virtualenv中安装的话,在启动的时候有一定要使用对应的虚拟环境。

    uWSGI的启动非常简单,但是它的参数多到让人发指,当然,可以把这些配置信息全部放到配置文件中,跟直接在命令行中使用的效果一样的。由于是最简单的配置方法,所以下面的配置文件只写了最简单的几个参数,能够部署成功就可以了。(另外吐槽一下uWSGI的文档的配置文件读起来好混乱...)

    假设我的配置文件叫做uwsgi.ini,注意这个文件可以放在任何地方,只要你喜欢:

    [uwsgi]
    http=127.0.0.1:8888
    wsgi-file=/home/ubuntu/flask_test/app.py
    callable=app
    touch-reload=/home/ubuntu/flask_test/

    没错就是这么少的参数,至于其他参数,有需要回去再慢慢看吧。简单说一些这些参数的含义:

      http-socket:使用的通讯协议,除了这个协议之外,还有http和socket,这三者的区别是,http和http-socket都是http协议,两者的区别我也没怎么分,官方文档推荐使用http-socket,socket就是uwsgi协议,官方解释是uwsgi协议通讯效率更高,这里我暂且先使用更加简单的http协议吧。另外如果用socket协议的话,nginx的配置会有所不同,后面会再说。

      wsgi-file:这个就是你的flask应用所在的文件

      callable:这个是你的flask应用实例的名称,是flask独有的配置项

      touch-reload:动态监控文件变化,然后重载服务,是跟uWSGI的emperor有关的配置项,当这个路径下面的文件发生变化,服务就会重新加载,这在部署上线之后对项目内容进行修改的时候十分有用

    配置好之后就可以使用命令行工具启动uWSGI服务器:

    1 $ uwsgi --ini /path/to/uwsgi.ini

    如无意外,服务就启动了,如果想实现持续监控应用,可以使用emperor功能,顾名思义,emperor帝王的意思,这是动态监控配置文件的选项,对应的vassal(诸侯)是被监控的对象,具体使用是:

    1 $ uwsgi --emperor  /path/to/vassals/

    注意了,这里--emperor后面的参数是一个文件夹的路径,这个文件夹里面放置了你所有需要监控的应用的配置文件,一旦这些配置文件发生变更,uwsgi就会动态加载,所以虽然对上面的配置文件放置位置没什么特殊要求,但是最好将你的配置文件用软链接的方式放到这个配置文件中:

    1 $ ln -s /file/path/of/conf.ini   /path/to/vassals/

            最后,配置完成之后,要放在后台持续运行,可以使用nohup命令:

    1 $ nohup uwsgi --emperor  /path/to/vassals/  &

      到此为止,简单的uWSGI服务就搭建起来了。

    3、配置nginx反向代理

      安装nginx:sudo apt-get install nginx

      启动nginx服务:sudo service nginx start

      重载nginx服务:nginx -s reload

      这里说一下nginx的配置文件的读写顺序问题:nginx的配置文件是/etc/nginx/nginx.conf,这个配置文件中又引用了/etc/nginx/conf.d/和/etc/nginx/sites-enabled/这两个文件夹的配置文件,通过include来实现。所以,无论是直接在nginx.conf或者在conf.d、sites-enabled中配置都是可以的。

    简单的配置文件:

    server{
      listen  80;
      server_name  localhost;
      location /xxx/yyy/zzz{
        proxy_pass  http://127.0.0.1:8888;
      }
    }

    上面就是一般的nginx反向代理的配置,如果使用http协议的话,与代理其它服务器的方式没有什么不同。如果是使用uwsgi协议就要使用nginx提供的协议,则需要改变一下写法:

    server{
        listen  80;
        server_name  localhost;
        location /xxx/yyy/zzz{
            include uwsgi_params;
            uwsgi_pass  unix://path/to/uwsgi.sock
        }
    }    

    注意,如果使用uwsgi协议进行通信,则在uWSGI的配置文件中应该使用socket配置项而不是http或者http-socket,也就是类似于下面这种形式:   

    [uwsgi]
    socket=/path/to/uwsgi.sock
    wsgi-file=/home/ubuntu/flask_test/app.py
    callable=app
    touch-reload=/home/ubuntu/flask_test/
  • 相关阅读:
    如何用SendInput模拟键盘的组合键使用?
    Js获取当前日期时间及其它操作
    如何动态修改窗口的Style
    js时间加减
    遍历子窗口
    使用SampleGrabber过滤器扑获图像
    js 字符串日期 yyyyMMdd 转化为 date
    ModifyStyle函数的用法
    有谁用过sendinput摸拟一个鼠标击键?
    在VC中如何才能得到当前屏幕的分辨率
  • 原文地址:https://www.cnblogs.com/zhangjpn/p/6876412.html
Copyright © 2020-2023  润新知