flask项目部署及管理实战
来源:互联网 发布:手机版淘宝店铺装修 编辑:程序博客网 时间:2024/06/05 11:10
最近老师让部署学校CTF攻防平台,平台是用Flask写的,结合着老师给的参考经验,耗费了大约一个星期终于上线了。这里为做第一次实战纪念,也是做经验总结,写下这篇博客。
背景:
校级CTF比赛,参数人数规模百人左右,web应用是我们自己写的,本人之前没有任何搭建实战项目的经验,可能有些地方做的不好,还用了很多笨方法,还请大佬们指正。
项目组件:Flask+mongoDB+redis
思路:
部署web应用到实战中,需要考虑的问题很多。抛开web应用的功能不说,我从压力处理、测试流程、应急、备份方面说下我的做法
-_-压力的处理:
本人开发狗一个,并不懂运维等知识,但是团队给的任务,硬着头皮也要刚,部署中我使用nginx 做负载均衡和反向代理,来处理压力的问题,nginx对新手很友好,由于没有那么多流量,我只需要把请求分发到各个web应用服务器上就可以了,不知道有没有更好的方法,但我用的方法在我们的实践中证明可行。
-_-测试:
测试的重要性就不必说了,web应用在搭建的过程中肯定会遇到各种各样的问题,需要有一个与真实情况相同的测试环境,但是不能影响真实环境中的数据。
我直接copy了一个MongoDB数据库,然后直接开了另外一个python应用,调用另外一个数据库的内容,也就是说参赛人数快固定的时候,我把整个数据库和python应用copy了一份,然后进行一次整体的测试,主站继续开放注册,测试环境不影响主站的功能。
-_-应急
所谓应急,就是在平台down掉的情况下快速恢复,在压力过大的情况下立既扩展服务器接受能力。nginx可以做到快速添加服务器,linux下supervisor可以时时监控进程信息,也支持自动重启等设置,很好用。所以我就用这个快速恢复平台。
-_-备份:
备份只和数据库有关,所以这里写的就是关于数据库的备份,恢复了。MongoDB自带 mongodump
、 mongorestore
,基础的用法我就不说了,简单讲讲认证的事情吧,因为数据库在实战中肯定是要设置认证的,但是网上大多关于这些的都没有写关于认证的情况怎么使用,所以我就写我的导入导出
-_-部署架构:
使用一台nginx转发请求到两个flask应用,数据库单独一个服务器,
外部访问nginx服务器
实战
MongoDB数据库
MongoDB数据库用户管理配置
–auth启动
先建立一个admin用户
use admindb.createUser({ user:'admin', pwd:'123456', roles:[ {role:'useAdminAnyDatabase',db:'admin'} ]})
再建立一个你自己的数据库
use xxxdb.createUser({ user:'xxx', pwd:'xxx', roles:[ {role:'readWrite',db:'xxx'} ]})
使用 db.auth('username','password')
登陆
MongoDB数据库的复制:
开着认证模式一直没有copy成功,然后我把认证模式关闭了
然后执行 db.copyDatabase(fromdb,todb,fromhost)
复制出一个数据表
MongoDB数据库认证模式下的备份和恢复
备份和恢复操作不在mongo shell 里执行,直接在终端或cmd执行
备份:mongodump -h host -u 'username' -p 'password' --authenticationDatabase 'user' -d 'dbname' -o /xx/xx
恢复:mongorestore -h host -u 'username' -p 'password' --authenticationDatabase 'user' -d 'dbname' /xxx/xxx/
使用supervisor管理你的进程
apt-get updateapt-get install supervisor
安装好之后就可以配置了
查看配置文件:
vim /etc/supervisor/supervisord.conf
配置文件如下
; supervisor config file[unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) ; supervisor config file [unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) chmod=0700 ; sockef file mode (default 0700) [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ;The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or ; newlines). It can also contain wildcards. The filenames are ; interpreted as relative to this file. Included files *cannot* ; include files themselves. [include] files = /etc/supervisor/conf.d/*.conf
如上配置的没错的话,就开始下一步吧,有必要说一下的就是最后两句,[include]是将指定目录下的配置文件导入使用,这样容易配置,也不容易出错
然后就往conf.d文件夹中写入配置
cd /etc/supervisor/conf.dvim program.conf
program文件内容格式如下:
[program:usercenter];directory = /home/leon/projects/usercenter ; 程序的启动目录command = python /xxx/xxx/xxx.py ; 启动命令,可以看出与手动在命令行启动的命令是一样的autostart = true ; 在 supervisord 启动的时候也自动启动startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了autorestart = true ; 程序异常退出后自动重启startretries = 3 ; 启动失败自动重试次数,默认是 3;user = leon ; 用哪个用户启动;redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false;stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB;stdout_logfile_backups = 20 ; stdout 日志文件备份数; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件);stdout_logfile = /data/logs/usercenter_stdout.log; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere
以上是详细参数,我只用了几个,其他的都注释掉了。
配置好了之后,直接使用 supervisord -c /etc/supervisor/superviosrd.conf
启动即可
然后就是查看状态,重启,停止之类的。Flask可以起在多个端口,只要配置文件写好,就可以同时进行管理
先是superviosrctl
进入交互界面,输入help
add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version
以上就是全部命令,用法就是命令加进程号,
example:
查看状态 status program全部应用重启,就是 restart all
使用nginx服务器配置反向代理和负载均衡
nginx是现在很流行的web服务器,用nginx监听80,再将请求转发到别的服务器上,既能减轻服务器的压力,也可以起到一个隔离层的作用
下载方法我就不说了,这里只讲配置
vim /etc/nginx/nginx.conf
以下分割线中间为添加的配置内容
upstream backend{ server xx.xx.xx.xx:xx; server xx.xx.xx.xx:xx; server xx.xx.xx.xx:xx;}server { listen 80 default_server; # listen [::]:80 default_server; server_name 127.0.0.1; # root /usr/share/nginx/html; permanent; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://backend; proxy_set_header X-Real-IP $remote_addr; }
proxy_pass 后跟的是反向代理的地址
upstream 是以轮询的方式分别访问这几个服务器
nginx -s stop 停止
nginx 再启动就生效了。
以上几乎是我的全部配置,一个项目从建立到搭建成功,收获很多,在此记录一下。
- flask项目部署及管理实战
- Flask 项目实战教程。。。
- Flask 项目实战教程。。。
- ubuntu部署flask项目
- 创建web项目及tomcat部署实战
- uWSGI+Nginx部署Flask项目
- Flask零基础到项目实战(五)Flask-Script
- 商城项目实战39:solarCloud及系统部署
- Intellij Idea 2017创建web项目及tomcat部署实战
- linux下gunicorn+flask项目的部署
- Flask项目部署(Nginx+Gunicorn)
- Python Flask项目部署到 ubuntu
- flask项目部署到阿里云服务器
- Linux下使用Gunicorn部署flask项目
- SSH项目实战---图书销售及后台管理系统
- Flask部署
- Docker部署JavaWeb项目实战
- Docker部署JavaWeb项目实战
- 诉说一个站长屌丝20多年的点点滴滴
- 关于使用pulltorefreshlistview刷新的问题
- java和 javaw 以及 javaws的区别
- Windows下TensorFlow的安装
- [linux]与书上不同的奇怪问题,关于变量赋值部分
- flask项目部署及管理实战
- 在Linux下实现进度条程序
- 属性绑定的innerHTML和直接纯js的innnerHTML区别
- maven仓库安装和配置
- 算法(十四)通信网络
- git使用教程,命令教程
- 目标检测
- Harris角点检测算法详解
- 2D动态天空