问题:flask开发了程序,只支持单进程,网页浏览速度太慢。
解决:负载均衡+多进程+多个flask应用
一、flask自带werkzeug,它默认是单线程。
app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。
1.threaded : 多线程支持,默认为False,即不开启多线程;
2.processes:进程数量,默认为1.
范例:
if __name__ == '__main__':
app.run(threaded=True)
app.run(processes=3)
或者flask_script 的manage.py
manage.py runserver --host 0.0.0.0 --port 5001 --threaded
二、理解Nginx、uWSGI和Flask之间的关系
WSGI 是只适用于 Python 语言,连接web服务器与web框架的一种接口。web服务器是接活儿的,wsgi是工头分配活儿的,web框架是干活儿的。见 https://www.168seo.cn/jianzhan/django/2986.html 和 https://www.jianshu.com/p/42b91d26baa4
单应用 多应用
三、nginx + uwsgi +flask
- Nginx 作为反向代理服务器:
- uWSGI 作为Web服务器:
- 负责接收 Nginx 请求转发并处理后发给 Flask 并接收 Flask 返回信息转发给 Nginx;
- Flask 作为应用框架:
- 收到请求后处理数据并响应结果给 uWSGI 服务器。
https://windard.com/project/2016/12/01/Deploy-Flask-APP
上面网址说最快组合
过程:用Nginx转发多个端口到多个uwsgi,每个uwsgi分别启动各自flask应用。如下方法,可以在同一个80端口下,通过不同路由,用uwsgi启动不同的flask应用。
安装uwsgi
pip3 install uwsgi
注意pip install uwsgi会安装默认python2.7的uwsgi,后期会碰到错误 ImportError: No module named
多个uwsgi和多个flask应用的配置:
配置uwsgi
第一个应用的uwsgi设置文件:
vi uwsgi.ini
添加内容
[uwsgi]
socket = 127.0.0.1:3031
chdir = /cnn/flasky-v0.3/mbflasky/
wsgi-file = manage.py
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9191
master = true
第二个uwsgi设置文件:
vi uwsgi_download_pic.ini
添加内容
[uwsgi]
socket = 127.0.0.1:3032
chdir = /cnn/download_pic/
wsgi-file = app.py
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9292
master = true
配置Nginx
sudo vi /etc/nginx/nginx.conf
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}
location /download_pic {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3032;
}
location /pic {
alias /cnn/caffe/mb/pic;
}
location /pic/resized {
alias /cnn/caffe/mb/pic/resized;
}
}
这段配置表明Nginx会将收到的 / 所有请求都转发到”127.0.0.1:3031″端口上,即uWSGI服务器1;
将收到的 /download_pic 所有请求都转发到”127.0.0.1:3032″端口上,即uWSGI服务器2上。
静态资源如图片,/pic用alias指定对应的实际目录。
如果不用uwsgi,直接用Nginx:
server {
listen 80;
server_name localhost;
location / {
root /cnn/caffe/mb/pic;
index index.html index.htm;
}
location /pic {
alias /cnn/caffe/mb/pic;
}
}
参考:https://www.digitalocean.com/community/questions/nginx-image-folder-and-declaration
https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx/
nginx默认的配置放在 /etc/nginx/sites-available/default,而 /etc/nginx/sites-enabled/default 其实是前面那个文件的link。
重启Nginx
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx start
或
sudo service nginx stop
sudo service nginx start
或
sudo service nginx reload
sudo nginx -t --测试conf语句是否合法
启动uWSGI服务器1
eval "$(pyenv init -)"
pyenv activate env3web
. /cnn/flasky-v0.3/init_env.sh
uwsgi /cnn/flasky-v0.3/mbflasky/uwsgi.ini
另开一个终端,启动uWSGI服务器2:
eval "$(pyenv init -)"
pyenv activate env3web
uwsgi /cnn/download_pic/uwsgi_download_pic.ini
可同时开启两个应用。
在应用二注意,例如下app.py中,一定要设置 /download_pic 的路由,否则nginx和uwsgi都是通的,但是前端不会显示网页的。
from flask import Flask
app = Flask(__name__)
@app.route('/download_pic')
def index():
return '<h1>Hello World</h1>'
另外,应用二是用uwsgi启动flask应用app.py,是callable,因此不用下面这两句
if __name__ == '__main__':
app.run()
参考文档:
http://www.bjhee.com/nginx-uwsgi.html
https://blog.csdn.net/youzi_yun/article/details/78538593