1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Flask】Nginx+Gunicorn+Supervisor部署一个Flask项目:步骤总结

【Flask】Nginx+Gunicorn+Supervisor部署一个Flask项目:步骤总结

时间:2020-02-01 22:53:10

相关推荐

【Flask】Nginx+Gunicorn+Supervisor部署一个Flask项目:步骤总结

为什么要使用gunicorn?

Flask 作为一个 Web 框架,内置了一个 webserver, 但这自带的 Server 到底能不能用?

官网的介绍:

While lightweight and easy to use, Flask’s built-in server is not suitable for production as it doesn’t scale well. Some of the options available for properly running Flask in production are documented here.

很显然,内置的 webserver 是能用的。但不适合放在生产环境。这个 server 本来就是给开发者用的。框架本身并不提供生产环境的 web 服务器,SpringBoot 这种内置 Tomcat 生产级服务器 是例外。

假设我们使用的是 Nginx+Flask Run 来当作生产环境,全部部署在一台机器上。劣势如下:

单 Worker。

只有一个进程在跑所有的请求,而由于实现的简陋性,内置 webserver 很容易卡死。并且只有一个 Worker 在跑请求。在多核 CPU 下,仅仅占用一核。当然,其实也可以多起几个进程。缺乏 Worker 的管理。

接上,加入负载量上来了,Gunicorn 可以调节 Worker 的数量。而这个东西,内置的 Webserver 是不适合做这种事情的。一言以蔽之,太弱,几个请求就打满了。

Gunicorn 作为 Server 相对而言可以有什么提升?

gunicorn 的优点如下, 帮我 scale worker, 进程挂了帮我重启用 python 的框架 flask/django/webpy 配置起来都差不多。还有信号机制。可以支持多种配置。其他:在管理 worker 上,使用了 pre-fork 模型,即一个 master 进程管理多个 worker 进程,所有请求和响应均由 Worker 处理。Master 进程是一个简单的 loop, 监听 worker 不同进程信号并且作出响应。比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,发出 CHLD, 则重启失败的 worker, 同步的 Worker 一次处理一个请求。 PS: 如果没有静态资源并且无需反向代理的话,抛弃 Nginx 直接使用 Gunicorn 和 Flask app 也能搞定。

搭建步骤

本文是简化版的步骤描述。详细步骤见:【Flask】Nginx / Gunicorn入门:部署你的Flask项目

环境:Centos7,python2.7+nginx+Flask +Gunicorn+mysql5.7

1、安装Gunicorn

虚拟机里面安装完成Gunicorn后,用flask写一个python文件test.py

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return 'Hello World,test python!'if __name__ == '__main__':from werkzeug.contrib.fixers import ProxyFixapp.wsgi_app = ProxyFix(app.wsgi_app)app.run()

使用gunicorn启动这个python文件,命令是:gunicorn test:app,然后就能在虚拟机里浏览器访问127.0.0.1:8000,看到这个页面。

2、安装nginx

虚拟机里面安装完成nginx后,修改配置文件,端口改成8089(避免和Apache冲突,但是这样在访问的时候需要写上端口号,有时候跳转之后又会变成默认的80端口,还要手动修改,暂时未解决,还是用默认的80端口吧…),增加下面内容:

然后./nginx -s reload重新加载配置,虚拟机里用ifconfig查一下ip(我用的桥接模式),在实体机访问虚拟机ip:8089即可看到flask的页面

普通的运行nginx

su root切换管理员

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf指定配置文件并启动nginx

./nginx直接启动nginx

3、项目的部署

同样的原理,把项目文件整个拷贝到虚拟机中,命令gunicorn 文件名:app启动后,可以在127访问

切换到nginx目录下,以下命令运行ngnix:

su root,切换管理员权限

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,设置配置文件路径

./nginx,启动nginx

虚拟机里用ifconfig查一下ip(不知道为什么连接家里wifi只能用桥接,连接校园网只能用NAT),在实体机访问虚拟机ip:端口号,即可看到项目运行的页面

4、使用supervisor管理Nginx+Gunicorn

supervisor是一个制作守护进程的工具,用户可以在UNIX系统中监控、管理进程。

常用于管理与某个用户或项目相关的进程。

去帮我们维护各种服务器的进程,即使有软件崩了也能帮我们自动重启。

用于在生产环境中,控制项目涉及的软件的进程。

如果不使用supervisor,重启gunicorn的步骤是:

pstree -ap|grep gunicorn

kill -9(gunicorn pid)

gunicorn -w6 -b 127.0.0.1:80 demo:app

使用supervisor

安装:pip install supervisor

生成配置文件:echo_supervisord_conf > /etc/supervisord.conf(默认是没有配置文件的)

在配置文件/etc/supervisord.conf中添加:

[program:gunicorn]command=gunicorn manage:app;supervisor启动命令directory=/home/hanquan/testPython/xxx;项目的文件夹路径startsecs=0;启动时间stopwaitsecs=0;终止等待时间autostart=true;是否自动启动autorestart=true;是否自动重启stdout_logfile=/home/hanquan/testPython/xxx/log/gunicorn.log;log日志stderr_logfile=/home/hanquan/testPython/xxx/log/gunicorn.err;error日志[program:nginx]command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;' ;前台运行directory=/home/hanquan/testPython/xxx;项目的文件夹路径startsecs=0;启动时间stopwaitsecs=0;终止等待时间autostart=true;是否自动启动autorestart=true;是否自动重启stdout_logfile=/home/hanquan/testPython/xxx/log/nginx.log;log日志stderr_logfile=/home/hanquan/testPython/xxx/log/nginx.err;error日志

开启supervisor,然后就可以访问部署后的网站了。

supervisord -c /etc/supervisord.conf

查看进程状态:

supervisorctl status

更新项目文件后,重启supervisor命令:

supervisorctl restart all

supervisor 常用命令

一、开启命令

supervisor的服务器端部分启动命令:sudo unlink /var/run/supervisor.sock(执行第二行产生文件后执行)supervisord -c /etc/supervisord.conf此时默认开启了所有服务supervisor的客户端部分命令:supervisorctl status 查看进程运行状态supervisorctl start 进程名 启动进程supervisorctl stop 进程名 关闭进程supervisorctl restart 进程名 重启进程supervisorctl update 重新载入配置文件supervisorctl shutdown 关闭supervisordsupervisorctl clear 进程名 清空进程日志supervisorctl 进入到交互模式下。使用help查看所有命令。例如:supervisorctl start all启动所有进程supervisorctl restart all重启所有进程supervisorctl stop all停止所有进程

二、关闭命令

supervisorctl stop all先关闭supervisor服务kill -9 pid之后再关闭supervisord服务

踩坑记录

正常启动Nginx后,在实体机浏览器输入ip:8089报出:xxx拒绝了我们的连接请求。但是虚拟机127.0.0.1:8089可以访问

原因:实体机浏览器在进行页面跳转后,又回到了默认使用80端口,在url中手动输入一下端口号就好了。这是原因。解决方式待定。暂定解决方式为改回到默认的80端口。或者好像在py文件里指定一下端口。

解决方法

find / -name supervisor.sock

unlink /name/supervisor.sock

页面可以正常访问,但是看了一眼log,ERROR:端口被占用。

这是因为启动了好几个gunicorn。

ps ax|grep gunicorn查看gunicorn进程

关闭 supervisor 之后,停掉所有的 gunicorn 进程,再重新启动 supervisor 即可。

kill -9 15357停止指定进程号

ps ax|grep nginx查看nginx进程

还是有gunicorn进程?gunicorn杀不掉??只好重启一下机器。。原因未知。

supervisor 监控nginx 一直在重启的问题

supervisor 监控nginx ,写好配置文件之后,发现一直在重启,排查之后发现是命令不对:

command = /usr/local/bin/nginx 这个命令默认是后台启动,但是supervisor不能监控后台程序,所以supervisor就一直执行这个命令。

加上-g 'daemon off;'这个参数可解决这问题,这个参数的意思是在前台运行。

command = /usr/local/bin/nginx -g ‘daemon off;’

(转载)完整的supervisor 监控nginx 配置如下:

[program:nginx]command = /usr/local/bin/nginx -g 'daemon off;'stdout_logfile=/Users/ddios/nginx_stdout.logstdout_logfile_maxbytes=10MBstderr_logfile=/Users/ddios/nginx_stderr.loguser = ddiosstderr_logfile_maxbytes=10MBautostart=trueautorestart=true

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。