代码测试
- 在本地用 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

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

(五)启动supervisor
- 将
web
项目里面的web.conf
文件复制到supervisor的配置目录下:
cp web.conf /etc/supervisor/conf.d/web.conf

- 重启
supervisor
服务:service supervisor restart
- 通过
service supervisor status
查看状态:

- 按
ctrl + c
进入到控制台界面,输入service supervisor status
查看:

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
沟通)

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

2.那么supervisor
的输出在:

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



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