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为例:

1
2
# aptitude -y install nginx supervisor
# pip install flask gunicorn gevent

安装完成之后,supervisor的配置文件在/etc/supervisor/下,log文件在/var/log/supervisor/目录下。

2.组件的启动

1)Flask的项目启动比较简单,这里有一个hello world的示例,可以用来测试:

"myproject.py":

1
2
3
4
5
6
7
8
9
10
11
# -*- 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:

1
python myproject.py

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

wKioL1l3bBXBht_dAABWk7YbuFg279.png-wh_50

2) 创建WSGI文件

1
# vim ~/myproject/wsgi.py

导入flask app,然后run即可:

1
2
3
4
from myproject  import  application
 
if  __name__ ==  "__main__" :
     application.run()

3)用gunicorn启动:

1
gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application

参数解释:

-w: 指定worker的数量(根据实际情况设定)

-b:指定绑定的地址和端口号

-k: 指定worker-class模式,默认为sync,这里用gevent使之变为异步协程,提高性能。

最后指定app的位置。

启动成功后,用ps看一下会看到有四个进程已经在工作了。

wKiom1l3bqrCa9YvAAH5yR137fk523.png-wh_50

4)配置supervisor

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

  自己在conf.d目录下写一个gunicorn的配置:

1
2
3
4
5
6
7
8
9
# 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”。

配置完成之后,重新加载下配置文件即可:

1
# supervisorctl  reload

查看状态:

1
2
root@localhost:~ # supervisorctl  status
gunicorn                         RUNNING    pid 32505, uptime 5:21:30

5)配置Nginx反向代理    

1
2
3
4
5
6
7
8
9
10
11
12
13
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即可。

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






      本文转自Jx战壕  51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1950980,如需转载请自行联系原作者







相关文章
|
7月前
|
应用服务中间件 PHP nginx
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
简介: 本教程介绍如何基于 Dragonwell 的 Ubuntu 镜像创建一个运行 Nginx 的 Docker 容器。首先从阿里云容器镜像服务拉取基础镜像,然后编写 Dockerfile 确保 Nginx 作为主进程运行,并暴露 80 端口。最后,在包含 Dockerfile 的目录下构建自定义镜像并启动容器,确保 Nginx 在前台运行,避免容器启动后立即退出。通过 `docker build` 和 `docker run` 命令完成整个流程。
283 25
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
|
4月前
|
应用服务中间件 Linux 网络安全
技术指南:如何把docsify项目部署到基于CentOS系统的Nginx中。
总结 与其他部署方法相比,将docsify项目部署到基于CentOS系统的Nginx中比较简单。以上步骤应当帮助你在不花费太多时间的情况下,将你的项目顺利部署到Nginx中。迈出第一步,开始部署你的docsify项目吧!
194 14
|
11月前
|
前端开发 JavaScript 应用服务中间件
使用nginx部署网站
使用nginx部署网站
|
11月前
|
JavaScript 应用服务中间件 nginx
nginx部署vue项目
本文介绍了将Vue项目部署到Nginx的步骤,包括构建Vue项目、上传dist文件夹到服务器、安装Nginx、配置Nginx代理静态文件以及重启Nginx,确保了Vue应用可以通过域名或IP地址访问。
607 1
|
11月前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
3283 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
|
11月前
|
Kubernetes 应用服务中间件 nginx
k8s基础使用--使用k8s部署nginx服务
本文介绍了Kubernetes中核心概念Deployment、Pod与Service的基本原理及应用。Pod作为最小调度单元,用于管理容器及其共享资源;Deployment则负责控制Pod副本数量,确保其符合预期状态;Service通过标签选择器实现Pod服务的负载均衡与暴露。此外,还提供了具体操作步骤,如通过`kubectl`命令创建Deployment和Service,以及如何验证其功能。实验环境包括一台master节点和两台worker节点,均已部署k8s-1.27。
911 1
|
12月前
|
应用服务中间件 nginx Docker
docker应用部署---nginx部署的配置
这篇文章介绍了如何使用Docker部署Nginx服务器,包括搜索和拉取Nginx镜像、创建容器并设置端口映射和目录映射,以及如何创建一个测试页面并使用外部机器访问Nginx服务器。
|
11月前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
666 0
|
11月前
|
监控 应用服务中间件 nginx
详细解释容器以及虚拟机centos7.9容器化部署基础服务(容器化部署nginx)
容器是一种轻量级、可移植的软件打包和隔离技术,将应用程序及其依赖项打包,确保在任何环境中一致运行。容器共享主机操作系统内核,相比虚拟机更高效、轻量,具有快速启动和高资源利用率的特点。容器的关键技术包括命名空间(如 PID、NET 等)、控制组(cgroups)和联合文件系统(UnionFS)。使用容器可以提高开发和部署效率,简化管理,确保环境一致性。例如,在 CentOS 7.9 上部署 Nginx 时,可以通过 Docker 下载和运行 `nginx:1.20` 镜像,并通过端口映射使外部请求访问 Nginx 服务。此外,还可以将测试页面复制到容器中,进一步验证容器的功能。
296 0