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自带 mongodumpmongorestore,基础的用法我就不说了,简单讲讲认证的事情吧,因为数据库在实战中肯定是要设置认证的,但是网上大多关于这些的都没有写关于认证的情况怎么使用,所以我就写我的导入导出

-_-部署架构:

使用一台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 再启动就生效了。

以上几乎是我的全部配置,一个项目从建立到搭建成功,收获很多,在此记录一下。

原创粉丝点击