uWSGI+Nginx+Flask在Linux下的部署
搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,希望给读者能够少走弯路。
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/