mariadb开启root远程登录 mariadb设置root密码_nginx

安装环境: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 结束所有应用