uWSGI+Nginx+Flask在Linux下的部署

       搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,但愿给读者可以少走弯路。html

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

一、flask应用

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

        目录:nginx

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

  app.py的内容:web

 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()

 

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

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

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

假设个人配置文件叫作uwsgi.ini,注意这个文件能够放在任何地方,只要你喜欢:ubuntu

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

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

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

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

  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服务就搭建起来了。

三、配置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/
相关文章
相关标签/搜索