设为首页 收藏本站
查看: 988|回复: 0

[经验分享] Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署

[复制链接]

尚未签到

发表于 2018-11-10 06:31:50 | 显示全部楼层 |阅读模式
  老毛病了,在用某个新框架或新架构之前,总得花时间谷歌和自己折腾一番,才能知道这个框架和架构的优缺点,才会发现自己最喜欢、用的最顺手的的一种。近期在学习python,这里记录一下自己用的一套python web开发的部署环境。
  简介
  之所以选择Flask,而没选择用的最多的django,是因为现在这个小项目是一个简单的web工具,提供上传文件、数据处理、并下载的功能。简单小巧,没必要折腾Django。而Flask正好是一个Python实现的Web开发微框架,它基于Werkzeug 和 Jinja2,虽然小巧但也足够强大。像其他几个Python轻量级的框架,比如Bottle、web.py、web2等这里不多说。没有最好,只有更好,所谓适合自己的才是最合适的。
  Flask的部署可以选择独立的wsgi,也可以用uWSGI,FastCGI等。独立容器除了Gunicorn还可以选择Tornado、Gevent来部署。
  1)Gunicorn是一个Python WSGI UNIX的HTTP服务器。这是一个预先叉工人模式,从Ruby的独角兽(Unicorn)项目移植。该Gunicorn服务器与各种Web框架兼容,我们只要简单配置执行,轻量级的资源消耗,以及相当迅速。它既支持 eventlet ,也支持 greenlet。部署简单、方便是我选择他的主要原因,另外跟gevent结合之后,性能一点不属于tornado。
  2)Tornado 是一个开源的可伸缩的、非阻塞式的 web 服务器和工具集,它驱动了FriendFeed 。因为它使用了 epoll 模型且是非阻塞的,它可以处理数以千计的并发固定连接,这意味着它对实时 web 服务是理想的。
  3)Gevent 是一个基于协同程序的 Python 网络库,使用 greenlet 来在 libevent 的事件循环上提供高层的同步 API。
  每种方式都有自己的优缺点,建议根据个人喜好和应用场景灵活运用。
  部署
  每个组件的作用:
  1). nginx:高性能Web服务器+负责反向代理;
  2). gunicorn:高性能WSGI服务器;
  3). gevent:把Python同步代码变成异步协程的库;
  4). supervisor:监控服务进程的工具;

  •   Flask Gunicorn Gevent Supervisor都可以用'pip'进行安装。这里我建议Supervisor用apt或yum源安装,这样省去了多余的配置,只需要写自己的配置文件即可。以apt为例:
# aptitude -y install nginx supervisor  
# pip install flask gunicorn gevent
  安装完成之后,supervisor的配置文件在/etc/supervisor/下,log文件在/var/log/supervisor/目录下。
  2.组件的启动
  1)Flask的项目启动比较简单,这里有一个hello world的示例,可以用来测试:
  "myproject.py":
# -*- coding:utf-8 -*-  
# test code
  
from flask import Flask
  
application = Flask(__name__)
  

  
@application.route("/")
  
def hello():
  
    return "Hello There!"
  

  
if __name__ == "__main__":
  
    application.run(host='0.0.0.0')
  测试Flask App:
python myproject.py  这时候打开浏览器,访问5000端口应该能看到类似页面:
DSC0000.png

  2) 创建WSGI文件
# vim ~/myproject/wsgi.py  导入flask app,然后run即可:
from myproject import application  

  
if __name__ == "__main__":
  
    application.run()
  3)用gunicorn启动:
gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application  参数解释:
  -w: 指定worker的数量(根据实际情况设定)
  -b:指定绑定的地址和端口号
  -k: 指定worker-class模式,默认为sync,这里用gevent使之变为异步协程,提高性能。
  最后指定app的位置。
  启动成功后,用ps看一下会看到有四个进程已经在工作了。
DSC0001.png

  4)配置supervisor
  web服务跑起来之后,为了保证服务的稳定性,需要加一个收获进程。supervisor非常好用,配置也简单方便,它是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。
  自己在conf.d目录下写一个gunicorn的配置:
# vim /etc/supervisor/conf.d/gunicorn.conf  
[program:gunicorn]
  
command = /usr/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application
  
directory = /data/get_vm_info/
  
autorestart = true
  
startsecs = 5
  
startretries = 3
  
user = root
  
nodaemon = false
  需要注意的一点是directory的设置,否则会报错“Import Error”。
  配置完成之后,重新加载下配置文件即可:
# supervisorctl  reload  查看状态:
root@localhost:~# supervisorctl  status  
gunicorn                         RUNNING    pid 32505, uptime 5:21:30
  5)配置Nginx反向代理
root@localhost:~# cat /etc/nginx/sites-enabled/default  
server {
  
    listen 8001;
  
    server_name localhost;
  
    access_log  /var/log/nginx/access.log;
  

  
    location / {
  
        proxy_pass http://127.0.0.1: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;
  
    }
  
  }
  配置完成后重启Nginx即可。
  整个环境基本初步搭建完成。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-632977-1-1.html 上篇帖子: golang angular5 nginx web程序部署说明 下篇帖子: Nginx1.14.0 编译安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表