CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目
- 在Flask框架下,直接运行app即可利用localhost进行访问,但是该解析器仅仅适用于调试, 可以说比较简陋,不能直接在生产环境中使用。因为其实单线程处理,一个请求没有结束,其他的请求全都进不来,所以需要Gunicorn的多进程来提升处理能力. 关于Flask的调试,我利用Chrome的Advanced Rest clien进行api调试
- Nginx: 其实刚看到Gunicorn,已经能够处理http请求了,为什么还需要它呢?一句话:性能和可拓展性。可能你只是一台server,只是简单的套一个Nginx并且不进行配置,可能用处真的不大,不过考虑到 (参考:https://www.zhihu.com/question/38528616):
- 静态文件: Nginx可以直接处理静态文件请求,那么通过配置让Nginx直接处理静态文件。
- Hold住并发:Nginx可能并不能提升处理能力,但是在一些高并发的场景下,通过nginx保持住请求可以为后端处理赢取时间而不是直接挂掉。由Nginx来缓存发起的请求直到请求接收完全再交给Gunicorn去处理,避免Gunicorn处理请求和响应到客户端的时间消耗,提升Gunicorn的处理能力。
- 负载均衡:这个在单服务器下可能用处不大,但是谁保不会拓展到多服务器,那么利用Nginx对请求进行分发实现反向负载均衡就意义重大了。
- 多域名处理:通过Nginx的分发,可以在一台服务器上挂多个域名,以免80端口冲突:即Nginx占用80并分发不同的请求到不同的内部端口。
- 访问控制,限流等,我暂时没有用到
- Supervisor: 利用它,对Gunicorn的进程进行管理。例如CentOS重启的情况,我们自然需要Gunicorn自动开始运行提供服务而不是每次重启都要手动输入再去启动一遍。
- Mysql: 数据持久化和一致性的存储的关系数据库
- Redis: 我只是利用其做cache(之前用的Memcached)
- Git: 用来做版本控制,同时方便本机开发的东西从hub上clone和pull
- Anaconda: 我利用conda来进行虚拟环境管理 (可以利用virtualenv, 总之就是为了防止你不同的项目(不同的版本)之间不同的python库的相互干扰,利用conda/virtualenv来隔离不同的运行环境)
- 各种环境的安装细节我就不表了,善用搜索引擎。
#for conda
source activate my_project_env
conda install -r requirements.txt #for virtualenv
activate my_project_env
pip install -r requirements.txt
gunicorn -w 4 -b 0.0.0.0:8080 run:app
server {listen 80; # nginx监听的端口
server_name _;location / {proxy_pass http://127.0.0.1:8080; # 表名nginx接收到请求去哪里找gunicorn的服务
proxy_redirect off;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
service nginx start/stop/restart/reload/status #check status: ps -aux | grep nginx
(nginx收到客户端发来的请求,根据nginx中配置的路由,将其转发给WSGI)nginx:"WSGI,找你的来了!"(WSGI服务器根据WSGI协议解析请求,配置好环境变量,调用start_response方法呼叫flask框架)WSGI服务器:"flask,快来接客,客户资料我都给你准备好了!"(flask根据env环境变量,请求参数和路径找到对应处理函数,生成html)flask:"!@#$%^......WSGI,html文档弄好了,拿去吧。"(WSGI拿到html,再组装根据env变量组装成一个http响应,发送给nginx)WSGI服务器:"nginx,刚才谁找我来着?回他个话,!@#$%^....."(nginx再将响应发送给客户端)
- 配置supervisor启动Gunicorn来提供Flask的服务
- 配置Supervisor的开机启动,从而实现重启后你的web继续提供服务
- 安装supervisor(pip or conda)
###生成一个supervisord服务的配置文件echo_supervisord_conf > supervisord.conf###将配置文件统一放在/etc下cpsupervisord.conf/etc/supervisord.conf###修改配置文件vi/etc/supervisord.conf##加入以下配置信息,[include]files =/etc/supervisord.d/*.conf###为了不将所有新增配置信息全写在一个配置文件里###每个配置信息新增一个配置文件,都会被上面那个include添加进去
mkdir/etc/supervisord.d/### 在此目录下增加本app的confsudo vi /etc/supervisord.d/my_flask.conf#加入, 注意其中的路径和用户名:[program:my_flask_app]directory=/home/leslie/flask-project-directorycommand=/your-gunicorn-whole-path-here/gunicorn app:app -b 127.0.0.1:8080 --workers 8 --max-requests 1000user=leslieautostart=true
autorestart=true
redirect_stderr=True
- 创建supervisor作为一个service的启动脚本( 位置
/etc/init.d/supervisord):
#!/bin/sh## /etc/init.d/supervisord## Supervisor is a client/server system that# allows its users to monitor and control a# number of processes on UNIX-like operating# systems.## chkconfig: - 64 36# description: Supervisor Server# processname: supervisord# Source init functions./etc/rc.d/init.d/functionsprog="supervisord"prefix="/usr/leslie"exec_prefix="${prefix}"prog_bin="${exec_prefix}/your-path-of-supervisor/bin/supervisord"# PIDFILE="/var/run/$prog.pid" # 博客推荐的这个设置对我来说不行,我检查自己的supervisord.conf发现pidfile在tmpPIDFILE="/tmp/$prog.pid"CONF= "/etc/supervisord.conf" # 让启动的时候知道去哪里找配置文件 文章2没有这个start(){echo-n $"Starting $prog: "###注意下面这一行一定得有-c /etc/supervisord.confdaemon $prog_bin -c $CONF--pidfile $PIDFILE[ -f $PIDFILE ] && success $"$prog startup"|| failure $"$prog startup"echo}stop(){echo-n $"Shutting down $prog: "[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"echo}case"$1"instart)start;;stop)stop;;status)status $prog;;restart)stopstart;;*)echo"Usage: $0 {start|stop|restart|status}";;esac
- 然后加入该service到centos的启动项并启动
sudo chmod +x /etc/rc.d/init.d/supervisord
sudo chkconfig --add supervisord
sudo chkconfig supervisord on
sudo service supervisord start
- 就可以查看了:
ps -ef | grep supervisord
## 同时也可以有service supervisord restart/stop/stats
ps -ef | grep supervisord # 通过这个来获得supervisord的进程pid 然后杀掉之前的进程后再启动。
kill (-s SIGTERM) pid
CentOS 下部署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 应用高效的运行起来.现在记录 ...
- flask部署:Ubuntu下使用nginx+uwsgi+supervisor部署flask应用
之前一直用的Centos或者Red hat,自从使用Ubuntu后,发现Ubuntu使用起来更方便,自此爱上Ubuntu. 一.从github上下载flask应用 1.我已经成功将自己编写好的应用上传 ...
- 2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略
本攻略基于ubuntu1804的版本,服务器用的华为云的服务器,python3(python2已经在2020彻底停止维护了,所以转到python3是必须的)欢迎加我的QQ6398903,或QQ群讨论相 ...
- CentOS 下用 Nginx 和 uwsgi 部署 flask 项目
前几天利用flask 写了几个调用salt-api 的接口,需要上线到正式环境,搜了一下 都是 用 nginx + uwsgi 来部署,这里记录下关键的配置项. 1.首先将代码上传到服务器上目录为: ...
- 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django
0.准备工作 在一台全新的服务器中新建用户以及用户的工作目录,之后的操作都以这个用户的身份进行,而不是直接用root. 举个栗子: 在服务器下新建用户rinka并赋予sudo权限 1) root登陆, ...
- Nginx+uwsgi+supervisor+Ubuntu+flask
Nginx+uwsgi+supervisor+Ubuntu+flask Nginx+uwsgi+supervisor在Ubuntu上部署flask应用 网上找了许多讲关于Flask应用部署的文章几乎都 ...
- linux/centos下安装nginx(rpm安装和源码安装)详细步骤
Centos下安装nginx rpm包 ...
- Ubuntu/CentOS下编译Nginx最基本参数
Ubuntu/CentOS下编译Nginx安装基本参数,做个记录: groupadd www useradd -g www www ./configure --user=www --group=www ...
随机推荐
- Drupal 安装过程
php.ini 文件 https://drupal.stackexchange.com/questions/164172/problem-installing-in-local-the-transla ...
- Android进程的生命周期
Android系统想要永久的保留一个应用进程差点儿是不可能的.所以系统就须要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来执行新的或者更重要的进程,那么系统怎样决定哪个进程应该保留哪个应该杀 ...
- 宿舍更换的新淋浴喷头"水温vs旋钮角度"关系的研究(曲线)
版权声明:我极少创造新知识,大部分情况下是个知识的二道贩子 https://blog.csdn.net/stereohomology/article/details/24478825 应该非常一目了然 ...
- JDK动态proxy原理解析
转: 之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白 ...
- SpringBoot学习笔记(1):配置Mybatis
SpringBoot学习笔记(1):配置Mybatis 反思:如果自己写的笔记自己都看不懂,那就不要拿出来丢人现眼! IDEA插件 Free MyBatis Plugin插件可以让我们的MyBatis ...
- 同源策略 , CORS
一 . 同源策略 同源策略( Same origin policy ) 是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响,可以说Web是构建在同源 ...
- 在win7下使用git和gitlab进行code review
1.安装 Git-2.6.3-64-bit.exe 下载地址:http://pan.baidu.com/s/1hqGvwnq 2.根据收到的邮件进入gitlab网站,并修改密码登陆 3.新建一个文件 ...
- 【C】四则运算生成和核对器----by郁卓、谢明浩
[Github项目地址] 完成功能: 1. 使用 -n 参数控制生成题目的个数 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围 3. 生成的题目中计算过程不能产生负数,也就是 ...
- codeforces 660B B. Seating On Bus(模拟)
题目链接: B. Seating On Bus time limit per test 1 second memory limit per test 256 megabytes input stand ...
- xgboost算法原理
XGBoost是2014年3月陈天奇博士提出的,是基于CART树的一种boosting算法,XGBoost使用CART树有两点原因:对于分类问题,CART树的叶子结点对应的值是一个实际的分数,而非一个 ...