Nginx+Tornado部署CTFd

假期要做点简单的培训需要一个平台放题,在考虑再三后还是选择了CTFd .部署没有采用官方推荐的gunicorn而用了tornado,为了利用多核性能前面加了Nginx做反向代理,其后运行四个Tornado实例。

系统: Centos7.3

安装前准备工作

  • 因为要用到非正常端口还懒所以先关闭SELinux
    setenforce 0
    编辑/etc/sysconfig/selinux修改SELINUX=disabled

  • 安装必要软件
    sudo yum install epel-release
    sudo yum install python python-pip

安装CTFd及所需组件

  • 首先clone CTFd到本地
    git clone https://github.com/CTFd/CTFd.git

  • 安装所需python库
    切换到CTFd目录下 sudo pip install -r requirements.txt

安装并配置Tornado

  • 安装 sudo pip install tornado

修改CTFd启动脚本

修改serve.py内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from CTFd import create_app
from tornado.wsgi import WSGIContainer
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi
from tornado.options import options, define, parse_command_line
define("port", default=8000, help="run on the given port", type=int) #传入端口参数,方便后续supervisor管理
app = create_app()
server = tornado.httpserver.HTTPServer(WSGIContainer(app))
tornado.options.parse_command_line()
server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

python serve.py启动,可以本机wget一下8000端口看是否成功访问,这里由于还没添加防火墙规则外界无法访问.

利用supervisor控制Tornado进程

  • 安装supervisor sudo pip install supervisor

  • echo_supervisord_conf创建默认配置文件
    sudo sh -c "echo_supervisor_conf > /etc/supervisord.conf"
    由于有重定向这里不能直接使用sudo echo_supervisor_conf > /etc/supervisord.conf,因为sudo会只执行了重定向前面的命令,而需要利用sh -c "command"来执行。每次都要打错一边T。T

  • 向配置文件中添加进程组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [program:ctfd]
    command=python /home/leommxj/CTFd/serve.py --port=80%(process_num)02d
    directory=/home/leommxj/CTFd
    process_name = %(program_name)s%(process_num)d
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/home/leommxj/CTFd/log/tornado.log
    stdout_logfile_maxbytes=500MB
    stdout_logfile_backups=50
    stderr_logfile=/home/leommxj/CTFd/log/tornado.log
    loglevel=info
    numprocs = 4
    numprocs_start = 1

    通过传入port参数控制端口号,这里生成四个进程分别用 8001-8004四个端口

  • 启动supervisord supervisord
    查看进程状况 supervisorctl status
    运行正常如下

    1
    2
    3
    4
    ctfd:ctfd1 RUNNING pid 12451, uptime 1:27:34
    ctfd:ctfd2 RUNNING pid 12452, uptime 1:27:34
    ctfd:ctfd3 RUNNING pid 12453, uptime 1:27:34
    ctfd:ctfd4 RUNNING pid 12454, uptime 1:27:34

安装并配置Nginx反向代理

  • 安装 sudo yum install nginx

  • 编辑\etc\nginx\nginx.conf删除其中原有的80端口服务

  • 新建\etc\nginx\conf.d\ctfd.conf配置反向代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    upstream tornado{
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
    server 127.0.0.1:8004;
    }
    server{
    listen 666;
    location /{
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real_IP $remote_addr;
    proxy_pass http://tornado;
    }
    }
  • 防火墙添加规则开放端口,centos7默认使用firewall-cmd而不是iptables了,尝试一下新东西.
    firewall-cmd --permanent --add-port=666/tcp

配置完毕,不太懂ctfd静态文件位置没有配置nginx直接处理静态文件,有时间加上.