站点图标 glzjin

GZCTF高并发踩坑和复盘

https://gzctf.gzti.me/zh/guide/start/quick-start

按照上面的部署,得到下面的平台

https://desctf2026.wetolink.com

服务器本身配置尚可,16H24G。

早上来了大概一千人不到参加比赛,挂了。

排查服务器,负载本身不高,但 Postgres 数据库挂了,GZCTF本身 dotnet 进程占用也不高。

最后发现是 Postgres 没调优+GZCTF没开多实例,特此记录,以作复盘。

缓存

这个其实一开始有开。

GZCTF的 appsettings.json 里打开缓存设置。

{
  "ConnectionStrings": {
     "RedisCache": "cache:6379,abortConnect=false"
  }
}

然后 compose.yml 里加上缓存服务。

services:
  cache:
    # It is recommended to use garnet, you can also use redis:alpine
    image: ghcr.io/microsoft/garnet-alpine:latest
    command: ["--bind", "0.0.0.0"]
    restart: always

docker compose up -d 启动。

Postgres调优

打开 data/db/18/docker/postgresql.conf 文件,尾部添加这些,调优 Postgres。

# 连接
listen_addresses = '*'
max_connections = 200

# 内存
shared_buffers = 4GB
work_mem = 16MB
maintenance_work_mem = 512MB
autovacuum_work_mem = -1
effective_cache_size = 8GB

# WAL / checkpoint
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9

# autovacuum
autovacuum = on
track_counts = on
autovacuum_max_workers = 5
autovacuum_naptime = 30s

# 日志(调试阶段)
log_min_duration_statement = 200ms   # >200ms 的语句记录日志
log_statement = 'none'
log_connections = 'all'
log_disconnections = off

docker compose restart 重启。

GZCTF多实例

这个是重点,踩坑在这里,多实例没开,没撑住,默认GZCTF只会用到单核,性能没发挥出来。

编辑 compose.yml

services:
  gzctf:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

  gzctf1:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "81:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

  gzctf2:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "82:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache


  gzctf3:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "83:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

  gzctf4:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "84:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

  gzctf5:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "85:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

  gzctf6:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=xxx"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "86:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      # - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db
      - cache

然后 docker compose up -d 拉起,然后前面的反代(比如Nginx,Caddy)配置上这些后端,负载均衡即可。

总结

人傻了,忘记要对数据库调优和开多实例了,栽了跟头。

GZCTF本身要配置正确,性能真的蛮好的。

退出移动版