2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略
本攻略基于ubuntu1804的版本,服务器用的华为云的服务器,python3(python2已经在2020彻底停止维护了,所以转到python3是必须的)欢迎加我的QQ6398903,或QQ群讨论相关技术
一、准备项目所需要的模块
你需要把开发环境下用到的包信息全部导出
`` pip freeze > requirements.txt
然后,把requirements.txt文件上传服务器
二、准备生产环境的python虚拟环境
毕竟生产环境,也可能运行多个python项目,所以需要准备好python的虚拟环境
ubuntu1804默认只有python3哈,安装虚拟环境需要先安装venv
``sudo apt install python3-venv
创建一个目录用于存放虚拟环境
mkdir -p /opt/python/
sudo python3 -m venv myprj #最后是项目的名字
. /opt/python/myprj/bin/activate #激活虚拟环境, 别忘记了前面的点【.】激活之后命令行前面又虚拟环境的名字,说明成功
pip install --upgrade pip #先升级一下Pip
pip intall -r requirements.txt # 一次安装全部的python模块
三、安装gunicorn
gunicorn是基于wsgi(web 服务网关接口)web服务器,与flask是绝配(一般django用uwsgi)
pip install gevent #如果你的项目中没有用到gevent,那么安装gunicorn之前,需要安装一下
pip install gunicorn
deactivate #退出虚拟环境
可以直接使用gunicorn命令来启动程序,例如
``gunicorn -w 4 -b 127.0.0.1:5000 main:app
【注意】上面的命令,需要在激活虚拟环境的情况下,到项目目录中运行,项目启动文件是main.py 里面又变量名是app的flask的实例
特别要注意,main.py里面要有
if __name__ == "__main__":
app.run()
否则,gunicorn启动项目时,会报错
下面是常用命令说明:
-c CONFIG, --config=CONFIG
# 设定配置文件。
-b BIND, --bind=BIND
# 设定服务需要绑定的端口。建议使用HOST:PORT
-w WORKERS, --workers=WORKERS
# 设置工作进程数。建议服务器每一个核心可以设置2-4个。
-k MODULE
# 选定异步工作方式使用的模块。
四、配置gunicorn的配置信息
gunicorn直接使用.py文件作为配置文件,所以,里面是支持py语法的
from gevent import monkey
monkey.patch_all()
import multiprocessing
#debug = True
loglevel = 'debug'
bind = '127.0.0.1:6000' #绑定与Nginx通信的端口
pidfile = 'log/gunicorn.pid'
accesslog = 'log/access.log'
errorlog = 'log/debug.log'
#daemon = True
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent' #默认为阻塞模式,最好选择gevent模式
保存到,项目目录下的conf/guni.conf
上面的配置文件中,又两个注释的地方,一个注意事项
- debug=True 很好理解,就是刚上线时,可以开启,方便发现错误,正式启用要注销
- daemon=True 意思是以守护进程的形式运行,适合直接输入gunicorn命令来运行,【注意】但如果您想用supervisor来管理的话,这个要注销
- 需要在项目文件中,建立一个log的文件夹,否则报错无法启动,因为我们的日志文件和pid都需要保存在Log目录中
五、通过配置文件启动gunicorn以及守护进程启动
把之前的命令,修改一下,
gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app 如果conf文件中,又deamon=True,那么将以守护进程在后台中运行 或者使用
nohup gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app
这个时候,就可以退出python虚拟环境了
``deactivate #退出虚拟环境
六、配置nginx
nginx的安装、配置、使用,请看我之前教程2020年ubuntu1804安装nginx最新稳定版1.16详细教程笔记
接着之前文件接续补充
在/etc/nginx/conf.d/目录下,新建一个myprj.conf文件,填入下信息
server {
listen 80;
root /data/python/myprj;
server_name xxx.xx.xxx.xxx;
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://localhost:6000/; # gunicorn绑定的端口号
}
# 配置static的静态文件:
location ~ ^\/static\/.*$ {
root /data/python/myprj;
}
}
在配置nginx最容易出现的问题是,静态文件的配置,一旦没有配好,导致图片,css文件无法访问
Nginx路径location配置中,使用root目录与alias目录的区别
- alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
location /static/ {
alias /var/www/static/;
}
#注意:alias指定的目录后面必须要加上"/",即/var/www/static/不能改成/var/www/static
- root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
location /static/ {
root /var/www/;
}
#注意:location中指定的/static/必须是在root指定的/var/www/目录中真实存在的。
#两者配置后的访问效果是一样的。
- 配置习惯
一般情况下,在nginx配置中的良好习惯是:- 在location / 中配置root目录
- 在location /somepath/ 中配置alias虚拟目录
- nginx加载新的配置
nginx -t #一定要先检查,看到成功的信息,
nginx -s reload
七、安装和配置supervisor
supervisor是一个python开发的进程管理工具,不光可以管理python项目,java项目,php-pfm后台启动程序都可以管理哦
- 安装
`` sudo apt install supervisor - 配置文件
到/ect/supervisor/conf.d/目录下,新建myprj.conf文件
``vim myprj.conf
填入如下内容
[program:aijiaoyu]
command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app
directory=/data/python/myprj
user=root
autorestart=true
startsecs=10
startretires=3
redirect_stderr=true
stdout_logfile_maxbytes=100MB
stdout_logfile_backups = 20
stdout_logfile=/var/log/supervisor/myprj.log
配置文件的简单说明
program:myprj] #登记项目名称
directory=/data/python/myprj
command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=root ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=100MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/var/log/supervisor/myprj.log
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
让supervisor更新配置
sudo supervisorctl update #更新配置
sudo supervisorctl reload #重启
sudo supervisorctl status #查看所有项目的情况
sudo supervisorctl stop/start/restart 项目名称
【注意】一定不能以守护进程启动,否则supervisor会检测不到进程,从而认为进程启动失败
总结
每次看别人的博客,都是觉得不完整,所以自己重写了这个教程。一个完成的流程
如果对你有用,请点个赞,或者关注,欢迎加群一起交流技术
参考文档:
2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略的更多相关文章
- flask +gevent+nginx+Gunicorn+supervisor部署flask应用
上篇 可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...
- Nginx+Gunicorn+Supervisor部署Flask应用
Flask 内置了简单的 Web 环境,让我们在开发的时候只需要专注于应用实现,而真正要在生产环境运行时这个简单的 Web 环境就不够用了,还需要一系列操作才能让 Web 应用高效的运行起来.现在记录 ...
- CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目
原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...
- 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django
0.准备工作 在一台全新的服务器中新建用户以及用户的工作目录,之后的操作都以这个用户的身份进行,而不是直接用root. 举个栗子: 在服务器下新建用户rinka并赋予sudo权限 1) root登陆, ...
- 怎样注册uber司机 如何注册uber司机 最新详细攻略
怎样注册uber司机 如何注册加入uber司机 全国加入Uber 的要求 车辆要求:要求裸车价8万以上,车龄5年以内,第三者责任险保额30万以上,不支持20万以下的面包车/商务车,不支持4座以下车辆. ...
- 学习大牛笔记nginx + gunicorn + supervisor
安装 gunicorn pip install gunicorn pip 是一个重要的工具,python 用来管理包.还有一个最佳生产就是每次使用 pip 安装的库,都写入一个 requirement ...
- Nginx + tornado + supervisor部署
参考链接:supervisor + Tornado + Nginx 使用详解, 用tornado ,Supervisord ,nginx架网站, tornado官方文档 项目文档树: . ├── ch ...
- SVN基于Maven的Web项目更新,本地过程详细解释
周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...
- [原创]基于VueJs的前后端分离框架搭建之完全攻略
首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...
随机推荐
- istream_iterator && istream_iteratorbuf
注意 读字符时, std::istream_iterator 默认跳过空白符(除非用 std::noskipws 或等价物禁用,而 std::istreambuf_iterator 不跳过.另外, s ...
- 震撼!全网第一张源码分析全景图揭秘Nginx
不管是C/C++技术栈,还是PHP,Java技术栈,从事后端开发的朋友对nginx一定不会陌生. 想要深入学习nginx,阅读源码一定是非常重要的一环,但nginx源码量毕竟还是不算少,一不小心就容易 ...
- OpenWrite 编辑器如何配置七牛云图床
感谢用户 mutiantong.cn 的创作分享,原文链接:https://www.jianshu.com/p/29f33ca6e491 1. 配置七牛云 1.1 通过七牛云链接购买七牛云对象存储, ...
- jmeter 信息头Bearer
1.数据规则 2.登录时获取token信息 3.正则表达式获取token值 说明: (1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它. (2)正则表达式: ( ...
- 如何初学python?资深程序员浅谈,教你学会入门python
我认为python应该是现在市面上最简单,也是最值钱的一门编程语言,所以学习的人是越来越多,但是,如何初学python?这个问题困扰着很多初学python的人,今天,给大家简单聊聊这个话题. 我曾经也 ...
- 第一节:python基础
2020-03-29 python基础: 多种python版本,直接编码让c解释的是cpython,pypy是最快的python 编码:ascll码只能表示256种无法表示中文,utf8个根据字符长短 ...
- Linux 提高操作效率之 tab 命令补全
最近在使用阿里云 ECS 时,发现 Centos 无法进行 tab 补全,特别影响操作效率,本文简单记录下 Linux 下的 tab 命令补全功能,希望对 Linux 初学者有所帮助. 安装 Linu ...
- Juli函数
- 如何用python批量生成真实的手机号码
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python测试社区 1目 标 场 景 平时在工作过程中,偶尔会需要大 ...
- 将函数作为返回值的方法 - Python
有的时候,我们需要将函数作为返回值,以下为代码: def superfunc(): i = 0 def wrapper(): nonlocal i i +=1 return i return wrap ...