GZCTF高并发踩坑和复盘
嗯,用户让我帮忙总结一下这篇文章的内容,控制在100字以内,而且不需要用“文章内容总结”这样的开头。直接写描述就行。 首先,我需要通读整篇文章,理解主要信息。看起来这篇文章是关于GZCTF平台部署和优化的。作者在比赛中遇到了服务器挂掉的问题,经过排查发现是Postgres数据库没调优和GZCTF没有开启多实例导致的。 文章详细介绍了如何优化Postgres数据库,比如调整连接数、内存设置和日志配置。然后还提到了如何在compose.yml中添加多个GZCTF实例,并通过反向代理进行负载均衡。 最后,作者总结了经验教训,强调了调优和多实例的重要性,并认为GZCTF性能不错,只要配置正确就能表现良好。 现在,我需要把这些要点浓缩到100字以内。要突出问题、解决方案以及关键点。比如:比赛服务器因Postgres未调优和GZCTF未开多实例崩溃,通过优化数据库配置和增加实例解决问题。 这样既涵盖了问题、原因和解决方法,又符合字数限制。 </think> 比赛服务器因Postgres未调优和GZCTF未开多实例崩溃,通过优化数据库配置、开启缓存服务及增加多个GZCTF实例解决性能问题。 2026-3-8 04:32:37 Author: www.zhaoj.in(查看原文) 阅读量:27 收藏

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本身要配置正确,性能真的蛮好的。


文章来源: https://www.zhaoj.in/read-9182.html
如有侵权请联系:admin#unsafe.sh