搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,但愿给读者可以少走弯路。html
这里的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是一个服务器,使用前就必定要安装,在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: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/