使用gunicorn和supervisor部署
2017-12-14 本文已影响1352人
马梦里
代码测试
- 在本地用 pycharm 运行测试
- 看 log 输出,有没有报错,错误可能在输出中间。
- 按 f12 看前端有没有报错。
- 用虚拟机测试
-
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 看前端有没有报错。
-
- 如果虚拟机可以运行,再部署到服务器,并重复虚拟机的调试步骤。
(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.conf,supervisor配置内容如下:
[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部署
- 将
web项目上传至/root目录下(和web_22222同目录) - 杀掉所有
python3进程:
killall python3 - 如有文件更新,可用
cat或less或tail命令查看 - 进入
web目录,运行gunicorn命令:
gunicorn wsgi --bind 0.0.0.0:80
图片.png
表示成功,就可以在浏览器输入服务器网址和ip进行访问了;
结束任务,输入:ctrl + c
图片.png
(五)启动supervisor
- 将
web项目里面的web.conf文件复制到supervisor的配置目录下:
cp web.conf /etc/supervisor/conf.d/web.conf
图片.png
- 重启
supervisor服务:service supervisor restart - 通过
service supervisor status查看状态:
图片.png
- 按
ctrl + c进入到控制台界面,输入service supervisor status查看:
图片.png
1.可以看到程序的进程是挂在supervisor之下的;
2.supervisor先启动gunicorn,再由gunicorn启动我们的程序;
为什么有两个gunicorn进程呢?
是因为gunicorn可以实现负载均衡,一个是主进程,一个是从进程,一个主进程下可以有多个从进程。(就是多核多线程这种功能)
用gunicorn开进程肯定有一个主进程,从进程是真正干活的。如果有两个或三个从进程,那么主进程负责派发请求,由从进程去处理。
流程:
- 以前:①请求通过防火墙,到
server.py文件,处理后响应给浏览器。
- 客户端发送请求给服务器,会经过防火墙过滤(比如80端口),如果可以通过,则把请求发送给监听80端口的程序。
- 监听
80端口的程序是gunicorn,有两部分(目前),一个主进程,一个从进程,主进程会把请求转发给从进程,通过wsgi协议和flask沟通,flask再调用路由,路由调用相应的函数,再把响应返回给flask,flask再返回给gunicorn,再通过gunicorn返回给客户端。(应用服务器flask和web服务器gunicorn,通过wsgi沟通)
图片.png
如果程序出错,那么怎么查找程序输出呢?
1.linux的输出在 /var/log 下面
可以通过 ls /var/log 查看(感觉无论在哪个目录都可以)
图片.png
2.那么supervisor的输出在:
图片.png
有三个文件:
第一个是supervisor.log,记录它的状态,server supervisor status就是显示的这个文件;
第二个是具体项目的标准错误输出;第三个是项目的标准输出;这两个文件都需要查看,错误可能在其中一个。
图片.png
图片.png
图片.png
最后一个就是pycharm下面显示的。
service supervisor restart