安装环境:VMWare虚拟机
操作系统:debian10
IP地址:10.0.90.10
CTFd版本:CTFd2.5.0+汉化,亲测全文对CTFd3也完全匹配
参考链接
https://github.com/CTFd/CTFd
https://docs.ctfd.io/en/latest/index.html 帮助文档
https://github.com/ht0Ruial/CTFd_themes_Chinese 中文汉化包
安装git
apt install git
修改默认python版本为python3
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2
update-alternatives --config python #可以方便的切换版本
安装pip
apt install python3-pip
安装Flask
CTFd是基于Flask框架建造的
pip3 install Flask
下载CTFd项目
cd /var/www/html
git clone https://github.com/CTFd/CTFd.git
本文都基于如下目录结构操作: /var/www/html/CTFd-master/serve.py
优化代码(可选,建议)
CTFd项目里调用了多次 https://use.fontawesome.com/releases/v5.9.0/css/all.css ,这个网站访问很慢,所以可以下载到本地用VScode打开CTFd项目,搜索"https://use.fontawesome.com/releases/v5.9.0/css/all.css",用"https://cdn.bootcss.com/font-awesome/5.13.0/css/all.css"替换
安装&运行CTFd
cd CTFd-master
安装依赖软件
chmod 777 prepare.sh
vim prepare.sh #默认的pip源很慢,修改本次安装的pip源为豆瓣
pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
./prepare.sh
启动服务
python serve.py
此时已可以本地打开浏览器访问性能极差
http://127.0.0.1:4000
关闭服务
ctrl+c
配置mariadb(可选)
CTFd默认使用了sqlite,建议改成mariadb,方便管理
apt install mariadb-server mariadb-client
安全配置脚本
mysql_secure_installation
根据提示输入旧密码(默认为空),新密码,移除匿名账号(是),禁止root远程登录(否),移除test数据库(是),重新加载权限表(是)
修改验证方式
从5.5.7版本中mysql数据库中就开始引入plugin这项配置,用来进行用户密码验证,同时mariaDB安装的默认插件是'console'或'unix_socket',这个插件允许你在没有密码的情况下从控制台输入可以登录,禁用密码验证,但是禁止从其他客户端连接。现在需要把这个改成密码认证
mariadb -u root -p
select user,password,plugin from user;
update user set plugin='' where user='root';
update user set host='%' where user='root'; #允许root用户远程登录
select user,password,plugin from user;
flush privileges;
exit;
systemctl restart mariadb
监听远程连接(可选,方便用数据库客户端管理)
vim /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 0.0.0.0
systemctl restart mariadb
netstat -antp | grep 3306
创建数据库
mariadb -u root -p
create database CTFd;
exit;
修改CTFd的数据库配置
vim CTFd/config.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:你的密码@localhost/CTFd?charset=utf8'
启动一次服务会自动在数据库中生成表
python serve.py
修改数据库字符集
默认的字符集会导致导出数据库内容时中文乱码
mariadb -u root -p
use CTFd;
show tables;
ALTER TABLE awards CONVERT TO CHARACTER SET utf8;
ALTER TABLE challenges CONVERT TO CHARACTER SET utf8;
ALTER TABLE config CONVERT TO CHARACTER SET utf8;
ALTER TABLE containers CONVERT TO CHARACTER SET utf8;
ALTER TABLE files CONVERT TO CHARACTER SET utf8;
ALTER TABLE keys CONVERT TO CHARACTER SET utf8;
ALTER TABLE pages CONVERT TO CHARACTER SET utf8;
ALTER TABLE solves CONVERT TO CHARACTER SET utf8;
ALTER TABLE tags CONVERT TO CHARACTER SET utf8;
ALTER TABLE teams CONVERT TO CHARACTER SET utf8;
ALTER TABLE tracking CONVERT TO CHARACTER SET utf8;
ALTER TABLE wrong_keys CONVERT TO CHARACTER SET utf8;
exit;
systemctl restart mariadb
安装gunicorn开启外网访问
是一个高效的Python WSGI Server,通常用它来运行 wsgi application(由我们自己编写遵循WSGI application的编写规范) 或者 wsgi framework(如Django,Paster),地位相当于Java中的Tomcat。
pip install gunicorn
cd CTFd-master
gunicorn --bind 0.0.0.0:8000 -w 9 "CTFd:create_app()" #w表示进程数,建议 cpu核心数*2+1
此时已可以外网打开浏览器访问
http://10.0.90.10:8000
异步模式
默认是同步模式,并发性能差。当多个用户需要访问网站的时候,会卡顿,建议改成异步模式,有很强的并发能力。如果某些网站需要保持数据库连接,则建议用同步模式。
pip install gevent
gunicorn --bind 0.0.0.0:8000 -w 9 --worker-class="gevent" "CTFd:create_app()"
部署nginx(可选)
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是静态文件处理能力强,并发能力强。亲测网站延迟小了很多
让Gunicorn负责监听本地机的请求,Nginx作为代理服务器监听对外端口的请求,Nginx会把来自外部的请求转发给Gunicorn处理,接收到响应后再返回给客户端。
好处:提高处理静态文件的效率,Nginx处理静态文件的速度非常快,而且可以对静态文件设置缓存。提高程序处理能力,设置反向代理可以缓冲请求,对请求进行预处理,交给WSGI服务器一个完整的HTTP请求。还可以设置负载均衡,优化请求处理效率。
apt install nginx
cd /etc/nginx/sites-enabled/
rm default
vim ctfd.conf
server {
listen 80;
server_name 10.0.90.10; #对外IP
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
charset utf-8;
location / {
proxy_pass http://127.0.0.1:8000; # 转发的地址,即Gunicorn运行的地址
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /themes/core/static { # 处理静态文件夹中的静态文件
alias /var/www/html/CTFd-master/CTFd/themes/core/static;
expires 5m; # 设置缓存过期时间
}
location /themes/admin/static { # 处理静态文件夹中的静态文件
alias /var/www/html/CTFd-master/CTFd/themes/admin/static;
expires 5m; # 设置缓存过期时间
}
}
nginx -t 测试配置文件是否正确
ln -s /etc/nginx/sites-enabled/ctfd.conf /etc/nginx/sites-available/ctfd.conf
netstat -4anep|grep 80
systemctl stop apache2 #把其它占用80端口的软件关掉
systemctl restart nginx
需要gunicorn在正常运作
守护进程
以上都是直接通过命令行运行gunicorn,并不能够在后台运行,就是当关闭了terminal,应用就停了
nohup
nohup gunicorn --bind 0.0.0.0:8000 -w 9 --worker-class="gevent" "CTFd:create_app()"
ps -e|grep gunicorn 查看应用在后台运行
killall -9 gunicorn 结束后台应用
supervisor
让后台程序能够监控进程状态,还能在意外结束时自动重启,使用一个使用Python开发的进程管理程序supervisor。
apt install supervisor
vim /etc/supervisor/conf.d/ctfd.conf
[program:ctfd]
command=/usr/local/bin/gunicorn --bind 0.0.0.0:8000 -w 9 --worker-class="gevent" "CTFd:create_app()"
directory=/var/www/html/CTFd-master #项目目录
user=root
autorestart=true #设置随supervisor服务自动重启
startretires=3 #重启失败3次
supervisorctl update 更新配置文件
supervisorctl start ctfd 单独开启某个应用
supervisorctl stop ctfd 单独结束某个应用
systemctl start supervisor 开启所有应用
systemctl stop supervisor 结束所有应用