ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

前后端项目部署-2, flask+Gunicorn+gevent+supervisor+nginx,docker部署,1111

2021-10-06 14:03:50  阅读:310  来源: 互联网

标签:web supervisor Gunicorn Nginx 部署 nginx 进程 gunicorn


####

部署方案flask+Gunicorn+gevent+supervisor+nginx

每个组件的作用:

1,. gunicorn:高性能WSGI服务器;

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。
和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

目前Gunicorn只能运行在Linux环境中,不支持windows平台

部署 Flask 应用时,为什么会需要 gunicorn 或 uWSGI?

简单说就是 Flask自带的wsgi性能低下

只适合你开发调试的时候用,

线上你必须用Gunicorn+Nginx才能获得更强的性能,和更高的安全性

下面我说一些废话:

django、flask 都有自带的http server,

仅仅是方便我们开发的时候调试代码而已

这些开源框架的维护者不可能投入大量精力来优化自带的wsgi服务器,

他们需要把更多的精力投入到框架自身的优化中,

因为服务器方面已经有Gunicorn/uWSGI、nginx等优秀的开源解决方案

假设我们用自带的来部署到线上,会有什么问题呢?

性能很差,差到不好意思出门见人(如果你的网站就几十个人访问,那性能应该问题不大)

最后我个人建议的方案是 flask+Gunicorn+gevent+supervisor+nginx

所以说为什么使用Gunicorn,简单点就是为了并发。利用异步,提高性能。

 

2. gevent:把Python同步代码变成异步协程的库;

gevent:gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好,我们很方便地顺手套一个gevent来增加并发量

 

3,nginx:高性能Web服务器+负责反向代理;

Nginx 是高效的 Web 服务器和反向代理服务器,可以用作负载均衡(当有 n 个用户访问服务器时,可以实现分流,分担服务器的压力),与 Apache 相比,Nginx 支持高并发,可以支持百万级的 TCP 连接,十万级别的并发连接,部署简单,内存消耗少,成本低,但 Nginx 的模块没有 Apache 丰富。Nginx 支持 uWSGI 的 uwsgi 协议,因此我们可以将 Nginx 与 uWSGI 结合起来,Nginx 通过 uwsgi_pass 将动态内容交给 uWSGI 处理。

nginx是一个功能强大的反向代理服务器,我们使用nginx来转发gunicorn服务。为什么要在gunicorn之上再加层nginx呢?一方面nginx可以补充gunicorn在某些方面的不足,如SSL支持、高并发处理、负载均衡处理等,另一方面如果是做一个web网站,除了服务之外,肯定会有一些静态文件需要托管,这方面也是nginx的强项.

有了gunicorn和gevent后,gunicorn可以实现多进程http服务,不过其性能还是相对nginx这种专业的web服务要差一些,主要体现在对高并发的处理、安全问题、静态资源文件的处理等。因此一般情况会在gunicorn之上再配置一层nginx服务。其基本架构示意如下(图来源于百度):

uWSGI+Flask就可以实现一个完整的web服务,似乎不需要Nginx服务器。
当一个服务访问量过大时,我们可能会考虑多部署几台web服务器,这几台web服务器都可以处理客户端请求,但问题是如何将客户端请求分发到各个web服务器上?这就是Nginx的作用->反向代理服务器。它们的关系如下图所示:

4,. supervisor:监控服务进程的工具;

web服务跑起来之后,为了保证服务的稳定性,需要加一个收获进程。supervisor非常好用,配置也简单方便,它是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。

nginx一般不会莫名其妙被关闭,但gunicorn是一个进程,完成有有可能因为一些原因被关闭或者阻塞,为了保证gunicorn进程,需要使用看护进程插件。这里使用supervisor来解决这个问题。

supervisor专门用户linux端进程管理,

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

###

启动主程序的命令传递:supervisor->gunicorn->flask

###

看着步骤很多,其实除了Gunicorn都不是必须的,Supervisor和Nginx你要是不想使用其实也可以不使用,我说得比较啰嗦,不过其实很容易。

####

第一步,准备一个简单的flask项目,

很简单只需要一个文件,

 

启动测试

 

###

第二步,gunicorn 安装,Gevent安装

pip install gunicorn

pip install gevent

 

###

第三步,在根目录下新建文件 /gunicorn.conf.py

启动测试

gunicorn start:app -c gunicorn.conf.py

用这种py文件的方式启动是比较简单的,

否则就要用命令行的方式启动,比较麻烦:

gunicorn --workers 3 --bind 0.0.0.0:5000  --user nginx --worker-class gevent start:app

 

#####

第四步,nginx配置

server {

    listen 80;
    server_name 0.0.0.0;
    charset utf-8;

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

 

第五步, supervisor

你要先搞懂,supervisor和gunicorn,和flask的关系,

其次你要搞懂,supervisor和docker的关系,

 

#####

build and up

$ cd docker-compose-flask
$ docker-compose build
$ docker-compose up -d
Starting dockercomposeflask_redis_1 ... done
Starting dockercomposeflask_web_1 ... done
Starting dockercomposeflask_nginx_1 ... done

Check the service running information

$ docker-compose ps
           Name                         Command               State           Ports
--------------------------------------------------------------------------------------------
dockercomposeflask_nginx_1   /usr/sbin/nginx                  Up      0.0.0.0:80->80/tcp
dockercomposeflask_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
dockercomposeflask_web_1     /runserver.sh                    Up      0.0.0.0:8000->8000/tcp

Check the web service

$ curl 127.0.0.1
Hello Container World! I have been seen 1 times and my hostname is 09ad15ad1b51.
$ curl 127.0.0.1
Hello Container World! I have been seen 2 times and my hostname is 09ad15ad1b51.
$ curl 127.0.0.1
Hello Container World! I have been seen 3 times and my hostname is 09ad15ad1b51.

stop the service

$ docker-compose stop
Stopping dockercomposeflask_nginx_1 ... done
Stopping dockercomposeflask_web_1   ... done
Stopping dockercomposeflask_redis_1 ... done

 

#####

docker-Compose 简介
docker-Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

这个很重要,

 

 

 

 

#####

标签:web,supervisor,Gunicorn,Nginx,部署,nginx,进程,gunicorn
来源: https://www.cnblogs.com/andy0816/p/15371152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有