使用gunicorn和supervisor部署

代码测试

  1. 在本地用 pycharm 运行测试
    • 看 log 输出,有没有报错,错误可能在输出中间。
    • 按 f12 看前端有没有报错。
  2. 用虚拟机测试
    • python3 server.py
    • 看 log 输出,有没有报错,错误可能在输出中间。
    • gunicorn wsgi --bind 0.0.0.0:80
    • 看 log 输出,有没有报错,错误可能在输出中间。
    • 最后再用 supervisor 运行。
    • 看 supervisor 状态:service supervisor status
    • 看 supervisor 日志:cat /var/log/supervisor/web*.log
    • 按 f12 看前端有没有报错。
  3. 如果虚拟机可以运行,再部署到服务器,并重复虚拟机的调试步骤。

(0)部署前准备

pip3 install gunicorn
apt-get install supervisor
  • pip3安装的是python3内部使用的包
  • apt-get安装的是应用软件

(1)将server.py的app放在函数外

app = Flask(__name__)
app.register_blueprint(user_view)
app.register_blueprint(static_view)
app.register_blueprint(todo_view)
app.register_blueprint(api_todo_view)
app.register_blueprint(index_weibo)
app.register_blueprint(api_weibo)

if __name__ == '__main__':
    config = dict(
        debug = True,
        host='127.0.0.1',
        port=8000,
    )
    app.run(**config)

(2)gunicorn文件配置

server.py同目录下添加wsgi.py文件

#!/usr/bin/env python3

import sys
from os.path import abspath
from os.path import dirname

# 设置当前目录为工作目录
# 这一行是给 Apache 用的
# sys.path.insert(0, abspath(dirname(__file__)))

# 引入 server.py
import server

# 必须有一个叫做 application 的变量
# gunicorn 就要这个变量
# 这个变量的值必须是 Flask 实例
# 这是规定的套路(协议)
application = server.app

"""
这是把代码部署到 gunicorn 后面的套路
gunicorn wsgi --bind 0.0.0.0:80

"""
"""
supervisor 套路

➜  ~ cat /etc/supervisor/conf.d/xx.conf

[program:web13]
command=/usr/local/bin/gunicorn wsgi --bind 0.0.0.0:80
directory=/root/web13
autostart=true
"""

使用gunicorn必须要有这个文件,目前来说,这个文件就两行有用:

import server
application = server.app

(3)supervisor文件配置

server.py新建文件:web.confsupervisor配置内容如下:

[program:web]
command=/usr/local/bin/gunicorn wsgi --bind 0.0.0.0:80
directory=/root/web
autostart=true
environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"

这是gunicorn部署的套路,记住就行;
supervisor的作用:守护监控程序,自动重启开服务;

  • program代表文件名,因为supervisor可以监控多个程序;
  • command代表运行路径,用哪个路径来运行;
  • directory表示工作目录,在哪个目录下运行;
    更改文件夹名:mv web10_2 web10
  • autostart表示自动开启;
  • 最后一行指定用unicode编码,不然如果日志里面有中文,那么supervisor会挂掉,这是它的一个bug

(4)gunicorn部署

  1. web项目上传至/root目录下(和web_22222同目录)
  2. 杀掉所有python3进程:
    killall python3
  3. 如有文件更新,可用catlesstail命令查看
  4. 进入web目录,运行gunicorn命令:
    gunicorn wsgi --bind 0.0.0.0:80
使用gunicorn和supervisor部署_第1张图片
图片.png

表示成功,就可以在浏览器输入服务器网址和ip进行访问了;
结束任务,输入:ctrl + c

图片.png

(五)启动supervisor

  1. web项目里面的web.conf文件复制到supervisor的配置目录下:
    cp web.conf /etc/supervisor/conf.d/web.conf
图片.png
  1. 重启 supervisor 服务:service supervisor restart
  2. 通过 service supervisor status 查看状态:
使用gunicorn和supervisor部署_第2张图片
图片.png
  1. ctrl + c 进入到控制台界面,输入 service supervisor status 查看:
使用gunicorn和supervisor部署_第3张图片
图片.png

1.可以看到程序的进程是挂在supervisor之下的;
2.supervisor先启动gunicorn,再由gunicorn启动我们的程序;
为什么有两个gunicorn进程呢?
是因为gunicorn可以实现负载均衡,一个是主进程,一个是从进程,一个主进程下可以有多个从进程。(就是多核多线程这种功能)
gunicorn开进程肯定有一个主进程,从进程是真正干活的。如果有两个或三个从进程,那么主进程负责派发请求,由从进程去处理。

流程

  • 以前:①请求通过防火墙,到server.py文件,处理后响应给浏览器。
  1. 客户端发送请求给服务器,会经过防火墙过滤(比如80端口),如果可以通过,则把请求发送给监听80端口的程序。
  2. 监听80端口的程序是gunicorn,有两部分(目前),一个主进程,一个从进程,主进程会把请求转发给从进程,通过wsgi协议和flask沟通,flask再调用路由,路由调用相应的函数,再把响应返回给flaskflask再返回给gunicorn,再通过gunicorn返回给客户端。(应用服务器flaskweb服务器gunicorn,通过wsgi沟通)
使用gunicorn和supervisor部署_第4张图片
图片.png

如果程序出错,那么怎么查找程序输出呢?
1.linux的输出在 /var/log 下面
可以通过 ls /var/log 查看(感觉无论在哪个目录都可以)

图片.png

2.那么supervisor的输出在:

图片.png

有三个文件:
第一个是supervisor.log,记录它的状态,server supervisor status就是显示的这个文件;
第二个是具体项目的标准错误输出;第三个是项目的标准输出;这两个文件都需要查看,错误可能在其中一个。

使用gunicorn和supervisor部署_第5张图片
图片.png
图片.png
使用gunicorn和supervisor部署_第6张图片
图片.png

最后一个就是pycharm下面显示的。
service supervisor restart


这里遇到了个问题,没有权限,ajax实现跳转的时候报错

你可能感兴趣的:(使用gunicorn和supervisor部署)