网络拓扑图
本文档展示 SurveyKing Pro 问卷调研系统的网络架构和组件部署拓扑图,帮助理解系统的网络结构和数据流向。
🏗️ 系统架构概览
SurveyKing Pro 采用单体模块化架构,支持多种部署方式:
🎯 核心特性
- ✅ 单体模块化:便于部署和维护,支持水平扩展
- ✅ 无状态应用:状态存储在 Redis,支持负载均衡
- ✅ 多部署模式:单机部署、集群部署、容器化部署
- ✅ 高可用设计:支持 Nginx 负载均衡,MySQL 主从复制
- ✅ 安全可靠:HTTPS 加密,防火墙保护,数据备份
🔧 技术栈
- 前端代理: Nginx
- 应用服务: Spring Boot 3.x
- 数据库: MySQL 8.0
- 缓存/消息队列: Redis
- 文件存储: 支持本地存储、S3 协议存储
- 容器化: Docker、Kubernetes
🎨 部署架构图
基于 SurveyKing Pro 的技术特点,提供以下三种主要的部署架构:
🏠 单机部署架构
适用于小规模用户、开发测试环境或初期部署。
🏢 集群部署架构
适用于生产环境,支持高可用和负载均衡。
🐳 容器化部署架构
适用于云原生环境,支持 Docker 和 Kubernetes。
🎯 架构对比分析
部署方式对比
| 特性 | 单机部署 | 集群部署 | 容器化部署 |
|---|---|---|---|
| 复杂度 | 简单 | 中等 | 复杂 |
| 成本 | 低 | 中等 | 高 |
| 可用性 | 一般 | 高 | 很高 |
| 扩展性 | 有限 | 良好 | 优秀 |
| 维护难度 | 低 | 中等 | 高 |
| 适用场景 | 小规模、测试 | 生产环境 | 大规模、云原生 |
资源配置建议
单机部署
- CPU: 4 核心以上
- 内存: 8GB 以上
- 存储: 100GB 以上 SSD
- 网络: 10Mbps 以上
集群部署
- Nginx 服务器: 2 核心、4GB 内存
- 应用服务器: 4 核心、8GB 内存(每台)
- 数据库服务器: 8 核心、16GB 内存
- 存储: 500GB 以上 SSD
容器化部署
- Kubernetes 节点: 8 核心、16GB 内存(每个节点)
- 存储: 分布式存储,1TB 以上
- 网络: 高速网络,支持容器网络
🎯 生产环境推荐架构
基于 SurveyKing Pro 的实际部署需求,以下是推荐的生产环境架构:
🏭 标准生产环境架构
🔌 网络端口和协议说明
| 连接 | 协议 | 端口 | 说明 |
|---|---|---|---|
| 用户 → CDN | HTTPS | 443 | 用户通过域名 HTTPS 访问 |
| CDN → WAF | HTTPS | 443 | CDN 回源到 WAF |
| WAF → 负载均衡器 | HTTPS | 443 | WAF 转发到负载均衡器 |
| 负载均衡器 → Nginx | HTTPS | 443 | 负载均衡到 Nginx 服务器 |
| Nginx → 应用服务器 | HTTP | 48080 | 反向代理到应用服务 |
| 应用服务器 → MySQL | TCP | 3306 | 数据库连接 |
| 应用服务器 → Redis | TCP | 6379 | 缓存和消息队列连接 |
| MySQL 主库 → 从库 | TCP | 3306 | 主从复制 |
| 管理员 → VPN | UDP | 1194 | VPN 连接 |
| VPN → 堡垒机 | SSH | 22 | 通过堡垒机管理 |
| 堡垒机 → 各服务器 | SSH | 22 | 服务器管理和维护 |
| 监控系统 → 各服务器 | HTTP | 9100 | Prometheus 监控指标收集 |
| 日志系统 → 各服务器 | TCP | 5044 | Logstash 日志收集 |
| 应用服务器 → SMTP | TCP | 25 | 邮件发送服务 |
| 应用服务器 → SMS | HTTPS | 443 | 短信发送服务 |
🖥️ 服务器配置详情
| 服务器类型 | 数量 | 规格建议 | 主要组件 | 功能说明 |
|---|---|---|---|---|
| 负载均衡器 | 2 台 | 4 核心、8GB 内存 | SLB/F5/HAProxy | 四层负载均衡,高可用 |
| Nginx 服务器 | 2 台 | 4 核心、8GB 内存 | Nginx | 七层负载均衡、静态文件服务 |
| 应用服务器 | 4 台 | 8 核心、16GB 内存 | Spring Boot 应用 | 业务逻辑处理、API 服务 |
| MySQL 主库 | 1 台 | 16 核心、32GB 内存 | MySQL 8.0 | 数据存储,主写 |
| MySQL 从库 | 2 台 | 16 核心、32GB 内存 | MySQL 8.0 | 数据读取,主从复制备份 |
| Redis 集群 | 3 台 | 8 核心、16GB 内存 | Redis | 缓存、会话存储、消息队列 |
| 文件存储 | 1 台 | 4 核心、8GB 内存 | NFS/S3 协议存储 | 静态文件存储、文件上传 |
| 监控服务器 | 1 台 | 4 核心、8GB 内存 | Prometheus/Grafana | 系统监控、指标收集和展示 |
| 日志服务器 | 1 台 | 8 核心、16GB 内存 | ELK Stack | 日志收集、分析和检索 |
| 堡垒机 | 1 台 | 2 核心、4GB 内存 | SSH 代理 | 安全访问控制、操作审计 |
🏆 架构特点
✅ 高可用性:多层冗余设计,单点故障时系统仍可提供服务
✅ 负载均衡:四层+七层负载均衡,请求分发到可用服务器
✅ 安全防护:WAF、VPN、堡垒机多层安全防护
✅ 数据安全:MySQL 主从复制,定期备份,Redis 集群
✅ 扩展性强:支持水平扩展,容器化部署
✅ 可观测性:完整的监控和日志系统
✅ 管理便利:统一的 VPN 和堡垒机管理入口
🔧 关键配置示例
Nginx 负载均衡配置
# 上游服务器配置
upstream surveyking_backend {
# 应用服务器集群
server app1.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app2.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app3.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app4.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
# 健康检查
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
}
# 主服 务器配置
server {
listen 443 ssl http2;
server_name surveyking.example.com;
# SSL 配置
ssl_certificate /etc/ssl/certs/surveyking.crt;
ssl_certificate_key /etc/ssl/private/surveyking.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
# 限速配置
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
# API 代理
location /api/ {
limit_conn conn_limit_per_ip 20;
limit_req zone=req_limit_per_ip burst=20 nodelay;
proxy_pass http://surveyking_backend;
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;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
# 静态文件服务
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 文件上传
location /upload/ {
client_max_body_size 100M;
proxy_pass http://surveyking_backend;
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 /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name surveyking.example.com;
return 301 https://$server_name$request_uri;
}
HAProxy 负载均衡配置
# /etc/haproxy/haproxy.cfg
global
daemon
maxconn 4096
user haproxy
group haproxy
log stdout local0
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option redispatch
retries 3
frontend surveyking_frontend
bind *:443 ssl crt /etc/ssl/certs/surveyking.pem
bind *:80
redirect scheme https if !{ ssl_fc }
# 限流
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
http-request reject if { sc_http_req_rate(0) gt 20 }
default_backend surveyking_backend
backend surveyking_backend
balance roundrobin
option httpchk GET /health
http-check expect status 200
server nginx1 nginx1.internal:443 check ssl verify none
server nginx2 nginx2.internal:443 check ssl verify none backup
防火墙规则配置
#!/bin/bash
# 防火墙配置脚本
# 清除现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许外部访问的端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p udp --dport 1194 -j ACCEPT # VPN
# 内网通信规则
INTERNAL_NETWORK="10.0.0.0/8"
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 48080 -j ACCEPT # 应用服务
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 3306 -j ACCEPT # MySQL
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 6379 -j ACCEPT # Redis
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 9100 -j ACCEPT # 监控
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 5044 -j ACCEPT # 日志
# 管理访问(仅允许堡垒机)
BASTION_IP="10.0.1.100"
iptables -A INPUT -s $BASTION_IP -p tcp --dport 22 -j ACCEPT
# 防 DDoS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4