zoukankan      html  css  js  c++  java
  • nginx+supervisor+gunicorn+flask

    一、 更新系统

    #yum -y install epel-release

    #yum clean all && yum makecache

    #yum -y update

    二、安装python3

    系统自带的python版本是2,并且没有安装pip

    1、python2安装pip

    #yum -y install python-pip (前提已安装epel-release)

    更新pip: pip install --upgrade pip

    [root@localhost ~]# pip -V

    2、安装python3

    系统自带的python2还有好多其他系统组件在使用,比如yum,所以要把python3安装到其他目录下

    (1)安装相关包

    # yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

    (2)下载 Python 3.7.0源码包

    #cd /usr/local/src &&

    wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

    (3)#tar xf Python-3.7.0.tar.xz (yum -y install xz  #若失败,重建yum缓 yum clean all ,yum makecache)

    (4)#cd Python-3.7.0

    (5)#./configure --prefix=/usr/local/python3

    (6)#make && make install

    安装成功后的提示:

    Collecting setuptools

    Collecting pip

    Installing collected packages: setuptools, pip

    Successfully installed pip-10.0.1 setuptools-39.0.1

    //从 Python 3.4 开始就已经自带了 pip 和 easy_install(setuptools 包带的命令) 包管理命令,你可以在 /usr/local/python3/bin/ 目录下看到,查看一下已经安装的扩展包:

    (7)#/usr/local/python3/bin/pip3 list

    Package    Version

    ---------- -------

    pip        10.0.1

    setuptools 39.0.1 

    // 更新pip(若上述命令提示pip版本不是最新则需要更新)

    (8)#/usr/local/python3/bin/pip3 install --upgrade pip

    (9)创建软连接

    执行ln -s /usr/local/python3/bin/python3 /usr/bin/python3命令创建python3软连接。

    执行ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3命令创建pip3软连接

    查看Python3和pip3是否安装成功。

    # python3 -V

    Python 3.7.0

    # pip3 -V

    pip 10.0.1 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)

    这样一来,python出来的是python2.7,python3出来的是python3.5.2,互不干扰。

    三、创建项目目录,安装虚拟环境

    (1)创建项目目录,安装虚拟环境

    #mkdir –p /home/microblog && cd /home/microblog && python3 -m venv venv

    (2)激活虚拟环境,安装项目所需的依赖包

    需要事先把requirements.txt放入项目所在目录中

    [root@localhost microblog]# source venv/bin/activate

    (venv) [root@localhost microblog]#pip3 install -r requirements.txt

    (3)上传项目代码

    演示使用,本例用一个最简单的flask应用:mocroblog.py

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    from flask import Flask

    app = Flask(__name__)

    @app.route('/')

    @app.route('/index')

    def index():

        return "Hello World!"

    if __name__ == '__main__':

    app.run()

    (4)测试

    (venv) [root@localhost microblog]# python3 microblog.py

     * Serving Flask app "microblog" (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)

    再打开一个窗口,运行:

    [root@localhost ~]# curl -i http://127.0.0.1:5000

    HTTP/1.0 200 OK

    Content-Type: text/html; charset=utf-8

    Content-Length: 12

    Server: Werkzeug/0.14.1 Python/3.7.0

    Date: Sat, 07 Jul 2018 03:52:31 GMT

    Hello World!

    一切正常!

    四、安装项目使用的web服务

    1、安装nginx

    # yum install nginx

    默认安装目录:/etc/nginx

    2、安装supervisor

    注意:此软件要求系统Python版本不能高于3

    #yum install supervisor

    3、安装gunicorn

    注意,这个要安装在项目使用的虚拟环境中

    [root@localhost nginx]# cd /home/microblog/

    [root@localhost microblog]# source venv/bin/activate

    (venv) [root@localhost microblog]# pip3 install gunicorn

    五、相关配置文件设置

    (1)nginx相关配置

    把nginx.conf中server{}块注释,在/etc/nginx/conf.d/目录中添加项目使用的以conf结尾的文件,比如:m.conf,内容如下:

    server {

        listen 80; #nginx监听端口

        server_name 192.168.109.128; #域名或IP

        location / {

            proxy_pass http://127.0.0.1:9000; #监听代理端口

            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;

        }

    }

    重载nginx服务:service nginx start

    (2) supervisor配置

    默认配置文件:(1)/etc/supervisord.conf

    在该文件最后一行有这样的信息:

    [include]

    files = supervisord.d/*.ini

    也就说说我们在这个目录下创建一个以ini结尾的文件即可

    比如:/etc/supervisord.d/m.ini

    其内容如下:

    [program:microblog]

    directory = /home/microblog

    command = /home/microblog/venv/bin/gunicorn -b 127.0.0.1:9000 -w 2 microblog:app #一定要是虚拟环境中的绝对路径

    user = root

    autostart = true

    autorestart = true

    stopasgroup = true

    killasgroup = true

    startsecs = 5

    startretries = 3

    redirect_stderr = true

    stdout_logfile_maxbytes = 20MB

    stdout_logfile_backups = 20

    stdout_logfile = /var/log/usercenter_stdout.log

    启动:supervisord -c /etc/supervisord.conf

    汇总介绍:(个人拙见,不知道对不对)

    nginx监听本机的80端口,然后把监听到的信息转发给http:127.0.0.1:9000指定的位置,

    这个地址是gunicorn在监听所以就把这个信息又转发给虚拟环境中去。

    supervisor是用来管理gunicorn的,就跟管理使用php-fpm管理php

    若是有多个项目的话,除了nginx需要配置外,supervisor也需要配置

     

    五、测试

    使用浏览器访问:ip即可得到flask响应的结果:

    注意防火墙放行80端口

     

    若是项目中没有设置debug=True,则更改项目内容后想看到效果需要重载一下supervisor服务:supervisorctl reload

    nginx+gunicorn+flask:这种模式就是不使用supervisor管理gunicorn
    单独执行gunicorn命令:gunicorn -b 127.0.0.1:9000 microblog:app

    扩展1:supervisorctl的使用
    supervisorctl status       # 查询进程状态
    supervisorctl stop node    # 关闭 [program:node] 的进程
    supervisorctl start node   # 启动 [program:node] 的进程
    supervisorctl restart node # 重启 [program:node] 的进程
    supervisorctl stop all     # 关闭所有进程
    supervisorctl start all    # 启动所有进程
    supervisorctl reload       # 重新读取配置文件,读取有更新(增加)的配置文件,不会启动新添加的程序
    supervisorctl update       # 重启配置文件修改过的程序  

    扩展2:常见的gunicorn配置
    [program:microblog]
    directory = /home/microblog ; 程序的启动目录
    command = gunicorn -c gunicorn.py wsgi:app  ; 启动命令,可以看出与手动在命令行启动的命令是一样的,使用虚拟环境中的绝对路径
    autostart = true     ; 在 supervisord 启动的时候也自动启动
    startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
    autorestart = true   ; 程序异常退出后自动重启
    startretries = 3     ; 启动失败自动重试次数,默认是 3
    user = leon          ; 用哪个用户启动
    redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
    stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
    stdout_logfile_backups = 20     ; stdout 日志文件备份数
    ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
    stdout_logfile = /data/logs/usercenter_stdout.log

  • 相关阅读:
    redis
    Ubuntu 用VSFTP搭建FTP服务器
    ADO.NET中高效地使用数据库连接
    类型后面加问号 int?
    system.data.sqlclient.sqlexception:timeout expired
    BackgroundWorker超级详细的用法
    异步调用WCF服务,并将数据填入GridLookUpEdit中
    linq to entity报"不允许启动新事务,因为有其他线程正在该会话中运行."错误解决方法
    sql2005 数据库备份 对于服务器失败
    调用WCF服务返回list集合时出错的解决方法
  • 原文地址:https://www.cnblogs.com/smallleiit/p/10111222.html
Copyright © 2011-2022 走看看