nginx + uwsgi + flask 多应用

浏览: 4900

问题: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之间的关系?-新乡seo|网站优化,网站建设—昊天博客                 

             单应用                                                                  多应用

三、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

推荐 2
本文由 safa 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册