天天看点

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:监控服务进程的工具;

Flask Gunicorn Gevent Supervisor都可以用'pip'进行安装。这里我建议Supervisor用apt或yum源安装,这样省去了多余的配置,只需要写自己的配置文件即可。以apt为例:

<code># aptitude -y install nginx supervisor</code>

<code># pip install flask gunicorn gevent</code>

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

2.组件的启动

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

"myproject.py":

<code># -*- coding:utf-8 -*-</code>

<code># test code</code>

<code>from flask </code><code>import</code> <code>Flask</code>

<code>application = Flask(__name__)</code>

<code>@application.route(</code><code>"/"</code><code>)</code>

<code>def hello():</code>

<code>    </code><code>return</code> <code>"&lt;h1 style='color:blue'&gt;Hello There!&lt;/h1&gt;"</code>

<code>if</code> <code>__name__ == </code><code>"__main__"</code><code>:</code>

<code>    </code><code>application.run(host=</code><code>'0.0.0.0'</code><code>)</code>

测试Flask App:

<code>python myproject.py</code>

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

<a href="https://s5.51cto.com/wyfs02/M01/9C/E7/wKioL1l3bBXBht_dAABWk7YbuFg279.png-wh_500x0-wm_3-wmp_4-s_3598203761.png" target="_blank"></a>

2) 创建WSGI文件

<code># vim ~/myproject/wsgi.py</code>

导入flask app,然后run即可:

<code>from myproject </code><code>import</code> <code>application</code>

<code>    </code><code>application.run()</code>

3)用gunicorn启动:

<code>gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application</code>

参数解释:

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

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

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

最后指定app的位置。

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

<a href="https://s2.51cto.com/wyfs02/M00/9C/E7/wKiom1l3bqrCa9YvAAH5yR137fk523.png-wh_500x0-wm_3-wmp_4-s_2934309988.png" target="_blank"></a>

4)配置supervisor

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

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

<code># vim /etc/supervisor/conf.d/gunicorn.conf</code>

<code>[program:gunicorn]</code>

<code>command</code> <code>= </code><code>/usr/bin/gunicorn</code> <code>-w 4 -b 127.0.0.1:8000 -k gevent wsgi:application</code>

<code>directory = </code><code>/data/get_vm_info/</code>

<code>autorestart = </code><code>true</code>

<code>startsecs = 5</code>

<code>startretries = 3</code>

<code>user = root</code>

<code>nodaemon = </code><code>false</code>

需要注意的一点是directory的设置,否则会报错“Import Error”。

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

<code># supervisorctl  reload</code>

查看状态:

<code>root@localhost:~</code><code># supervisorctl  status</code>

<code>gunicorn                         RUNNING    pid 32505, uptime 5:21:30</code>

5)配置Nginx反向代理    

<code>root@localhost:~</code><code># cat /etc/nginx/sites-enabled/default</code>

<code>server {</code>

<code>    </code><code>listen 8001;</code>

<code>    </code><code>server_name localhost;</code>

<code>    </code><code>access_log  </code><code>/var/log/nginx/access</code><code>.log;</code>

<code>    </code><code>location / {</code>

<code>        </code><code>proxy_pass http:</code><code>//127</code><code>.0.0.1:8000;</code>

<code>        </code><code>proxy_set_header Host $host;</code>

<code>        </code><code>proxy_set_header X-Real-IP   $remote_addr;</code>

<code>        </code><code>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</code>

<code>    </code><code>}</code>

<code>  </code><code>}</code>

配置完成后重启Nginx即可。

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

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

继续阅读