Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署

老毛病了,在用某个新框架或新架构之前,总得花时间谷歌和自己折腾一番,才能知道这个框架和架构的优缺点,才会发现自己最喜欢、用的最顺手的的一种。近期在学习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:监控服务进程的工具;

  1. 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 "<h1 style=‘color:blue‘>Hello There!</h1>"

if __name__ == "__main__":
    application.run(host=‘0.0.0.0‘)

测试Flask App:

python myproject.py

这时候打开浏览器,访问5000端口应该能看到类似页面:

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看一下会看到有四个进程已经在工作了。

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

查看状态:

[email protected]:~# supervisorctl  status
gunicorn                         RUNNING    pid 32505, uptime 5:21:30

5)配置Nginx反向代理

[email protected]:~# 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即可。

整个环境基本初步搭建完成。

时间: 2024-11-05 18:39:07

Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署的相关文章

Django + Uwsgi + Nginx 的生产环境部署

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: 1.确保有一个能够用runserver正常启动的django项目 2.项目已上传到linux 3.linux上已部署好python环境,且已安装好项目所需的模块 安装uwsgi uwsgi是python的一个模块,安装u

【原创】大数据基础之Airflow(2)生产环境部署airflow研究

一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在scheduler的dags目录变动dag文件来提交流程 官方分布式部署方案 多个webserver 多个worker CeleryExecutor(依赖redis或rabbitmq) MesosExecutor(依赖mesos) 第三方开源方案ASFC 针对scheduler单点问题,有第三方方案:ht

生产环境部署squid服务

网络拓扑 该实验使用虚拟机模拟搭建,准备开启2台虚拟机,客户端用本记代替. 1.Squid服务器使用2块网卡.如下图显示: 2.Web服务器与squid服务器配置在同一个网段即可.如下图显示: 3.客户端IP与squid服务器网卡1是在同一网段上即可.如下图显示: 4.查看squid服务器上的eth0和eth1网卡ip地址 5.查看web服务器的ip地址 6.先测试客户端能否ping通squid服务器的网卡1. 7.测试客户端能否ping通web服务器,ping不通正常. 8.安装squid软件

奉上SCCM生产环境部署Error Logs

奉上SCCM生产环境部署Error Logs SCCM生产环境部署报错日志,供大家查看,如有此类问题,可共同探讨,附件为日志查看器及相关日志.

生产环境部署容器的五大挑战及应对之策

Docker容器使应用程序开发变得更容易,但在生产中部署容器可能会很难. 环境复杂性.生态系统易变性.跨不同分布式基础架构的部署...... 本文将为你解析生产环境部署容器的五大挑战及应对之策. 软件开发人员通常只关注在特定基础架构上运行的单个应用程序.应用程序堆栈或工作负载.然而,在生产环境中,一组不同的应用程序常需在各种技术(例如Java,LAMP等)上运行,而这些技术又需在本地.云上或二者结合的异构基础设施上部署.这给生产环境中容器化应用程序的运行带来了一些挑战: 控制高度密集.快速变化的

Vue生产环境部署

前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue生产环境部署 生产环境 如果用 Vue 完整独立版本 (直接用 <script> 元素引入 Vue),生产时应该用精简版本 (vue.min.js) 如果用 Webpack 或 Browserify 类似的打包工具时,生产状态会在 Vue 源码中由 process.env.NODE_ENV 决定,

生产环境部署单台redis

生产环境部署redis方案1.腾讯云有redis主从2.自己部署redis也很简单 (1)redis使用编译安装方式,所以需要安装编译基本组件# yum install gcc cpp glibc glibc-devel gcc-c++ (2)redis依赖jemalloc,所以先安装此组件# wget http://www.canonware.com/download/jemalloc/jemalloc-4.2.1.tar.bz2后续读者可以查看此链接获取更新版本jemalloc,http:/

HyperLedger Fabric 1.2 kafka生产环境部署(11.1)

11.1 Kafka模式简介       上一章介绍的Solo模式只存在一个排序(orderer)服务,是一种中心化结构,一旦排序(orderer)服务出现了问题,整个区块链网络将会崩溃,为了能在正式环境中稳定运行,需要对排序(orderer)服务采用集群方式,Hyperledger Fabric采用kafka方式实现排序(orderer)服务的集群,kafka模块被认为是半中心化结构.       顺便提一下,去中心化的BFT(拜占庭容错)排序(orderer)服务集群方式目前还在开发,还没有

Django + Uwsgi + Nginx 实现生产环境部署

一.如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 二.uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uwsgi / uWSGI 这三个概念的区分. WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask