之前搞的小程序后端服务是Flask写的,然后投产实际使用中,采用的是Nginx+uWSGI+Flask的架构,简单记录下配置过程
uWSGI
uWSGI是一个应用服务器,它是生产上常用的处理高并发问题的中间件。Flask本身是自带了服务的,更多的是开发阶段的本地调试使用。如果部署到生产后访问量很大的情况下,Flask本身的性能是不足以支撑的,所以就需要在前面增加一层uWSGI来进行请求的处理。
即使只有一个 Flask 服务节点 , uWSGI 可以启动并管理多个 Flask 应用进程,并且可以多个进程之间均衡请求负载,优化性能。
架构
在Nginx+uWSGI+Flask的架构中,简化如下
使用
uWSGI的安装很简单
pip install uwsgi
假设我们有一个flask的应用
from flask import Flask
app = Flask(__name__)
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
那么这个时候,我们通过uWSGI来启动这个服务的方式如下
uwsgi --http :5000 --wsgi-file app.py --callable app
这会在端口 5000
上启动 uWSGI,并将请求传递给 Flask 应用中的 app
对象。即此时通过 http://127.0.0.1:5000 即可访问。
配置文件
上述仅仅是命令启动,更多的时候会使用配置文件的方式启动,例如:
[uwsgi]
http = 127.0.0.1:5000
wsgi-file = server.py
callable = app
processes = 5
daemonize = uwsgi.log
pidfile = uwsgi.pid
上述只是一个简单的配置,通过如下命令启动即可:
uwsgi --ini app.ini
这样的话便会在后台启动5个服务进程
Nginx联动
当uWSGI的服务启动后,例如 127.0.0.1:5000,那么在Nginx中把该地址作为location后的代理地址即可
http {
server {
listen 80;
server_name xxx.com;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
}
上述方法比较简单,
或者通过uWSGI生成的app.sock进行转发
首先,在uWSGI的配置文件中加上socket的参数
[uwsgi]
...
processes = 5
socket = app.sock
...
这样会在启动目录下生成一个app.sock的socket文件
随后在Nginx中配置如下
http {
server {
listen 80;
server_name xxx.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/path/app.sock;
}
}
}
也可以完成反代联动
原文始发于微信公众号(飞羽技术工坊):使用uWSGI在生产环境下部署Flask服务
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论