SurveyKing企业级部署架构:前后端分离与二级目录配置实战指南
【免费下载链接】SurveyKingOne command to deploy a more powerful, self‑hosted alternative to SurveyMonkey.项目地址: https://gitcode.com/gh_mirrors/su/SurveyKing
SurveyKing作为一款功能强大的开源问卷系统和考试系统,为技术决策者和架构师提供了企业级自托管解决方案。本指南将深入探讨如何通过前后端分离架构和二级目录配置,实现高性能、可扩展的生产环境部署。通过容器化部署、负载均衡和自动化运维策略,确保系统在高并发场景下的稳定运行。
项目概述与技术价值主张
SurveyKing是一个全功能的调查问卷和在线考试系统,支持20多种题型、复杂逻辑设置、数据分析和多终端适配。相比商业问卷产品,SurveyKing提供了私有化部署、无限制使用、完全源代码控制的核心优势。系统采用Java Spring Boot后端和Vue.js前端的技术栈,支持MySQL、PostgreSQL等多种数据库,具备完善的RBAC权限控制体系。
对于企业技术决策者而言,SurveyKing的价值不仅在于成本节约,更在于数据安全可控、功能可定制扩展、性能可优化调优。系统支持单jar部署、Docker容器化、前后端分离等多种部署方式,适应从中小型企业到大型组织的不同技术架构需求。
架构设计理念与技术选型
SurveyKing采用微服务友好的单体应用架构,通过模块化设计实现了高内聚低耦合。后端基于Spring Boot 2.x构建,提供RESTful API接口;前端采用Vue.js 3.x实现响应式界面;数据库层支持多种关系型数据库,通过MyBatis Plus实现数据访问。
技术选型理由:
- Spring Boot:快速开发、内嵌容器、生产级特性
- Vue.js 3:组件化开发、响应式数据绑定、优秀性能
- MyBatis Plus:简化CRUD操作、支持多数据库
- Gradle:灵活的构建工具、多模块项目管理
- Nginx:高性能反向代理、静态资源服务、负载均衡
系统架构支持水平扩展,可通过Nginx负载均衡实现多实例部署,满足高并发访问需求。前后端分离设计使得前端可以独立部署和更新,后端API服务可以单独扩展和维护。
环境准备与前置条件
基础环境要求
- JDK 11+:推荐OpenJDK 11或Oracle JDK 11
- Node.js 14+:用于前端构建和开发
- MySQL 8.0+或PostgreSQL 12+:生产环境推荐MySQL 8.0
- Nginx 1.18+:反向代理和静态资源服务
- Git:代码版本管理
系统资源规划
- CPU:4核以上,建议8核用于生产环境
- 内存:8GB以上,建议16GB
- 存储:100GB以上,根据问卷附件数量调整
- 网络:100Mbps以上带宽
源码获取与准备
git clone https://gitcode.com/gh_mirrors/su/SurveyKing cd SurveyKing核心组件部署策略
后端服务部署
数据库配置与初始化
创建数据库并配置连接信息,编辑server/api/src/main/resources/application-pro.yml:
spring: datasource: url: jdbc:mysql://localhost:3306/surveyking?useSSL=false&serverTimezone=UTC&characterEncoding=utf8 username: surveyking_user password: your_secure_password driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000执行数据库初始化脚本,位于scripts/database/目录,根据数据库类型选择相应脚本。
后端服务构建与启动
使用Gradle构建生产环境JAR包:
cd server # 生产环境构建 ./gradlew bootJar -Ppro # 启动服务 java -jar api/build/libs/surveyking.jar \ --server.port=8080 \ --spring.profiles.active=pro \ --file-storage.local.root-path=/data/surveyking/files \ --sk.security.url-token-authentication.enabled=true关键配置说明:
--server.port:服务监听端口--spring.profiles.active:激活生产环境配置--file-storage.local.root-path:文件存储路径--sk.security.url-token-authentication.enabled:启用URL token认证
前端应用部署
环境变量配置
修改前端环境配置文件client/.env.production:
# API基础路径,对应Nginx配置的二级目录 VUE_APP_API_BASE_URL=/surveyking/api VUE_APP_BASE_URL=/surveyking/ VUE_APP_TITLE=SurveyKing企业版 VUE_APP_VERSION=1.8.0前端构建优化
cd client # 安装依赖 npm ci --production # 生产环境构建 npm run build:prod # 构建输出目录:client/dist/构建完成后,dist目录包含以下关键文件:
index.html:应用入口static/:静态资源文件favicon.ico:网站图标
Nginx二级目录配置与集成
核心配置文件
创建Nginx配置文件/etc/nginx/conf.d/surveyking.conf:
upstream surveyking_backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; keepalive 32; } server { listen 80; server_name your-domain.com; # 全局配置 client_max_body_size 2048m; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; # 二级目录:前端静态资源 location /surveyking/ { alias /opt/surveyking/client/dist/; index index.html; # 解决Vue Router History模式刷新404问题 try_files $uri $uri/ /surveyking/index.html; # 静态资源缓存优化 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } } # 二级目录:后端API代理 location /surveyking/api/ { proxy_pass http://surveyking_backend/api/; 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; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 超时设置 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } # 健康检查端点 location /surveyking/health { proxy_pass http://surveyking_backend/actuator/health; access_log off; } # 禁止直接访问后端服务 location = /api/ { return 403; } }SSL/TLS配置(可选但推荐)
server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/ssl/certs/your-domain.crt; ssl_certificate_key /etc/ssl/private/your-domain.key; # SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 其他配置与HTTP版本相同 # ... # HTTP重定向到HTTPS if ($scheme = http) { return 301 https://$server_name$request_uri; } }配置验证与重载
# 检查Nginx配置语法 nginx -t # 重载Nginx配置 systemctl reload nginx # 查看Nginx状态 systemctl status nginx性能优化建议
数据库优化
- 索引优化:为常用查询字段创建索引
- 连接池配置:根据并发量调整HikariCP参数
- 查询缓存:启用MySQL查询缓存或使用Redis
JVM优化
# 生产环境JVM参数 java -jar surveyking.jar \ -Xms2g -Xmx4g \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -XX:InitiatingHeapOccupancyPercent=45 \ -XX:+UseStringDeduplication \ -Djava.security.egd=file:/dev/./urandom前端性能优化
- 代码分割:按路由懒加载组件
- 资源压缩:启用Gzip/Brotli压缩
- CDN加速:静态资源使用CDN分发
- 浏览器缓存:合理设置缓存策略
Nginx优化
# 启用Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; # 连接优化 keepalive_timeout 65; keepalive_requests 100; client_header_timeout 60; client_body_timeout 60; send_timeout 60;故障排查与诊断指南
常见问题及解决方案
1. 跨域问题
症状:前端访问API时出现CORS错误解决方案:在后端启用CORS配置或通过Nginx代理解决
// 后端CORS配置(可选) @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("https://your-domain.com") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600); } }2. 静态资源加载失败
症状:CSS、JS文件返回404解决方案:检查Nginx alias路径和文件权限
# 检查文件权限 ls -la /opt/surveyking/client/dist/ # 检查Nginx用户权限 ps aux | grep nginx # 设置正确权限 chown -R nginx:nginx /opt/surveyking/client/dist/ chmod -R 755 /opt/surveyking/client/dist/3. 数据库连接问题
症状:服务启动失败,连接数据库超时解决方案:
- 检查数据库服务状态
- 验证连接字符串和凭据
- 检查防火墙设置
- 调整连接池参数
# 测试数据库连接 mysql -h localhost -u surveyking_user -p surveyking # 查看数据库连接数 SHOW PROCESSLIST;4. 内存泄漏排查
症状:服务运行一段时间后内存持续增长解决方案:
# 生成堆转储文件 jmap -dump:live,format=b,file=heapdump.hprof <pid> # 分析GC日志 java -Xlog:gc*:file=gc.log -jar surveyking.jar监控与日志
应用日志配置
# application-pro.yml 中添加 logging: level: cn.surveyking: INFO org.springframework: WARN file: name: /var/log/surveyking/app.log max-size: 100MB max-history: 30 pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"Nginx访问日志
access_log /var/log/nginx/surveyking_access.log combined buffer=32k flush=5s; error_log /var/log/nginx/surveyking_error.log warn;扩展与维护方案
高可用架构设计
负载均衡配置
upstream surveyking_backend { server 192.168.1.101:8080 weight=3; server 192.168.1.102:8080 weight=2; server 192.168.1.103:8080 weight=2; # 健康检查 check interval=3000 rise=2 fall=3 timeout=1000 type=http; check_http_send "GET /actuator/health HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }数据库主从复制
- 配置MySQL主从复制
- 使用读写分离中间件
- 定期备份和恢复测试
容器化部署方案
Docker Compose配置
version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: surveyking MYSQL_USER: surveyking_user MYSQL_PASSWORD: user_password volumes: - mysql_data:/var/lib/mysql - ./scripts/database/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - surveyking-network backend: image: surveyking/surveyking:latest depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/surveyking SPRING_DATASOURCE_USERNAME: surveyking_user SPRING_DATASOURCE_PASSWORD: user_password ports: - "8080:8080" networks: - surveyking-network restart: unless-stopped nginx: image: nginx:alpine depends_on: - backend volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./client/dist:/usr/share/nginx/html/surveyking ports: - "80:80" - "443:443" networks: - surveyking-network restart: unless-stopped networks: surveyking-network: driver: bridge volumes: mysql_data:自动化运维脚本
部署脚本示例
#!/bin/bash # deploy-surveyking.sh set -e # 环境变量 APP_NAME="surveyking" APP_VERSION="1.8.0" BACKUP_DIR="/backup/surveyking" LOG_FILE="/var/log/surveyking/deploy.log" # 备份当前版本 backup_current() { echo "$(date): 开始备份当前版本" >> $LOG_FILE tar -czf "${BACKUP_DIR}/backup_$(date +%Y%m%d_%H%M%S).tar.gz" /opt/surveyking/ } # 部署新版本 deploy_new() { echo "$(date): 开始部署新版本 $APP_VERSION" >> $LOG_FILE # 停止服务 systemctl stop surveyking # 更新代码 cd /opt/surveyking git pull origin main # 构建后端 cd server ./gradlew bootJar -Ppro # 构建前端 cd ../client npm ci --production npm run build:prod # 启动服务 systemctl start surveyking echo "$(date): 部署完成" >> $LOG_FILE } # 健康检查 health_check() { echo "$(date): 开始健康检查" >> $LOG_FILE for i in {1..30}; do if curl -f http://localhost:1991/actuator/health > /dev/null 2>&1; then echo "$(date): 服务健康检查通过" >> $LOG_FILE return 0 fi sleep 2 done echo "$(date): 健康检查失败,执行回滚" >> $LOG_FILE return 1 } # 回滚到上一个版本 rollback() { echo "$(date): 开始回滚" >> $LOG_FILE systemctl stop surveyking # 找到最新的备份文件 LATEST_BACKUP=$(ls -t ${BACKUP_DIR}/backup_*.tar.gz | head -1) if [ -f "$LATEST_BACKUP" ]; then tar -xzf "$LATEST_BACKUP" -C / systemctl start surveyking echo "$(date): 回滚完成" >> $LOG_FILE else echo "$(date): 没有找到备份文件" >> $LOG_FILE exit 1 fi } # 主流程 main() { backup_current deploy_new if health_check; then echo "$(date): 部署成功" >> $LOG_FILE exit 0 else rollback exit 1 fi } main "$@"监控告警配置
Prometheus监控指标
# prometheus.yml 配置 scrape_configs: - job_name: 'surveyking' static_configs: - targets: ['localhost:1991'] metrics_path: '/actuator/prometheus' scrape_interval: 15s - job_name: 'nginx' static_configs: - targets: ['localhost:9113'] scrape_interval: 15sGrafana仪表板
- 导入Spring Boot监控模板
- 配置Nginx监控面板
- 设置数据库性能监控
- 配置业务指标监控
总结
通过本文的详细部署指南,技术决策者和架构师可以全面了解SurveyKing企业级部署的最佳实践。前后端分离架构结合二级目录配置,不仅提升了系统的可维护性和扩展性,还为高可用、高性能的生产环境部署奠定了坚实基础。
关键要点总结:
- 架构设计:采用微服务友好的单体架构,支持水平扩展
- 部署策略:支持多种部署方式,适应不同技术环境
- 性能优化:从数据库到前端的全方位性能调优
- 监控运维:完善的监控体系和自动化运维方案
- 安全合规:数据安全、访问控制、传输加密
SurveyKing作为开源问卷系统的优秀代表,通过合理的架构设计和部署策略,能够满足企业级应用对性能、安全、可维护性的严苛要求。随着业务的增长,系统可以通过容器化、服务网格、云原生等技术进一步演进,构建更加健壮和弹性的问卷服务平台。
【免费下载链接】SurveyKingOne command to deploy a more powerful, self‑hosted alternative to SurveyMonkey.项目地址: https://gitcode.com/gh_mirrors/su/SurveyKing
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考