华为云 Centos7 Flask+Gunicorn+Gevent+Supervisor+Nginx 多站点 生产环境部署

 近期在学习python,这里记录一下自己用的一套python web开发的部署环境Flask+Gunicorn+Gevent+Supervisor+Nginx 。

 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 可以用'pip'进行安装。

因为supervisor目前只支持python2,而flask项目已经用python3了,为解决这个冲突,我安装了虚拟环境

➜  ~ python3 -m venv venv
➜  ~ source venv/bin/activate
(venv) ➜  ~ pip install gunicorn gevent flask

而centos默认的python上python,虚拟环境却可以用python3,这个很棒。

接下来运行一下试试,先写个最小应用

(venv) ➜  ~ vim manage.py
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == "__main__":
    app.run()

(venv) ➜  ~ export FLASK_APP=manage.py
(venv) ➜  ~ python -V
Python 3.6.3
(venv) ➜  ~ python manage.py
 * Serving Flask app "manage" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

用 gunicorn来运行试试

(venv) ➜  ~ gunicorn -b localhost:5001 -w 4 manage:app
[2018-07-26 20:35:51 +0800] [112606] [INFO] Starting gunicorn 19.9.0
[2018-07-26 20:35:51 +0800] [112606] [INFO] Listening at: http://127.0.0.1:5001 (112606)
[2018-07-26 20:35:51 +0800] [112606] [INFO] Using worker: sync
[2018-07-26 20:35:51 +0800] [112609] [INFO] Booting worker with pid: 112609
[2018-07-26 20:35:51 +0800] [112611] [INFO] Booting worker with pid: 112611
[2018-07-26 20:35:51 +0800] [112612] [INFO] Booting worker with pid: 112612
[2018-07-26 20:35:51 +0800] [112613] [INFO] Booting worker with pid: 112613

# No problem

# 加上gvent试试
(venv) ➜  ~ gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app
[2018-07-26 20:38:24 +0800] [112772] [INFO] Starting gunicorn 19.9.0
[2018-07-26 20:38:24 +0800] [112772] [INFO] Listening at: http://127.0.0.1:8081 (112772)
[2018-07-26 20:38:24 +0800] [112772] [INFO] Using worker: gevent
[2018-07-26 20:38:24 +0800] [112775] [INFO] Booting worker with pid: 112775
[2018-07-26 20:38:24 +0800] [112776] [INFO] Booting worker with pid: 112776
[2018-07-26 20:38:24 +0800] [112777] [INFO] Booting worker with pid: 112777
[2018-07-26 20:38:24 +0800] [112779] [INFO] Booting worker with pid: 112779

# Prefect!! This is working~~

参数解释:

-w: 指定worker的数量(根据实际情况设定,一般是cpu核数*2 + 1)

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

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

最后指定app的位置manage:app,参数告诉g​​unicorn如何加载应用程序实例。冒号前面的名称是包含应用程序的模块,冒号后面的名称是此应用程序的名称。

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

➜  ~ ps aux | grep gunicorn
root     113843  0.5  0.6 245532 21528 pts/0    S+   20:54   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app
root     113846  0.3  0.8 275428 27120 pts/0    S+   20:54   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app
root     113847  0.3  0.8 275424 27072 pts/0    S+   20:54   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app
root     113848  0.3  0.8 275428 27072 pts/0    S+   20:54   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app
root     113849  0.3  0.8 275408 27100 pts/0    S+   20:54   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -b 127.0.0.1:8081 -w 4 -k gevent manage:app

继续安装nginx supervisor, 如果默认是python3,supervisor是无法工作的。。

➜  ~ python -V
Python 2.7.5
➜  ~ sudo yum -y install ngigx supervisor

安装完成之后,supervisor的配置文件是/etc/supervisor.conf。Supervisor用yum源安装,这样省去了多余的配置,只需要写自己的配置文件即可。以yum为例:

2、配置supervisor

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

➜  ~ vim /etc/supervisord.conf

# in the end
....
....
[include]
files = supervisord.d/*.conf
;files = supervisord.d/*.ini

# 注销ini,使用conf尾缀,这用就可以导入surpervior配置,
# 方便管理,特别是需要配置多个应用时

➜  ~ vim /etc/supervisord.d/manage.conf

[program:manage]

; supervisor启动命令 即在bash使用的命令,注意要是在虚拟环境下要写命令的绝对地址
command = /root/venv/bin/gunicorn -w 4 -b 127.0.0.1:8003 -k gevent manage:app

; 项目目录
directory = /root

; 是否自启动
autostart=true

; 是否自己重启
autorestart=true

; 启动时间
startsecs = 5

; 终止等待时间
startretries = 3

user = root

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

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

 ➜  ~ supervisorctl reload
Restarted supervisord
➜  ~ ps aux | grep gunicorn
root     117127 13.5  0.6 245544 21544 ?        S    21:34   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent /root/manage:app
root     117136  0.0  0.4 208976 14112 ?        R    21:34   0:00 
/root/venv/bin/python36 /root/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent /root/manage:app
root     117138  0.0  0.5 246492 18568 ?        R    21:34   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent /root/manage:app
root     117139  0.0  0.5 246492 18564 ?        R    21:34   0:00 /root/venv/bin/python36 /root/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent /root/manage:app

3、配置nginx反向代理端口8000

➜  ~ vim /etc/nginx/conf.d/manage.conf
server {
    listen       80;
    server_name  xxxxx;


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

# 重新加载配置
➜  ~ systemctl restart nginx.service

# ok,没报错

打开网站看下:

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

Prefect~~

备注:

如果希望搭设多站点,只需要在supervisor和nginx配置下新建站点,将端口同意更改,如都改为5001,5002等等,这样就可以做到多站点了,如有疑问,请留言。

猜你喜欢

转载自blog.csdn.net/gh254172840/article/details/81224921
今日推荐