分布式部署
本文档介绍如何将卷王问卷系统部署为分布式架构,支持多台服务器负载均衡部署,提高系统的可用性和性能。
分布式架构概述
架构特点
- 负载均衡: 使用 Nginx 实现请求分发
- 应用集群: 多台服务器部署相同的后端应用
- 共享存储: 使用 OSS 或 FTP 实现文件共享存储
- 数据库集群: MySQL 主从复制或集群部署
- 缓存共享: Redis 集群或单点部署
推荐架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 用户浏览器 │ -> │ Nginx LB │ -> │ App Server 1 │
└─────────────────┘ │ (负载均衡) │ │ (后端应用) │
└─────────────────┘ └─────────────────┘
│ │
v v
┌── ───────────────┐ ┌─────────────────┐
│ App Server 2 │ │ MySQL 主从 │
│ (后端应用) │ │ (数据库) │
└─────────────────┘ └─────────────────┘
│ │
v v
┌─────────────────┐ ┌─────────────────┐
│ App Server N │ │ Redis 集群 │
│ (后端应用) │ │ (缓存) │
└─────────────────┘ └─────────────────┘
│
v
┌─────────────────┐
│ 共享文件存储 │
│ (OSS/FTP) │
└─────────────────┘
1. Nginx 负载均衡配置
1.1 安装 Nginx
在负载均衡服务器上安装 Nginx:
# CentOS/RHEL/Rocky Linux
sudo dnf install -y nginx
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y nginx
1.2 配置负载均衡
创建 Nginx 配置文件:
sudo vim /etc/nginx/conf.d/surveyking-lb.conf
配置内容:
# 定义上游服务器组
upstream surveyking_backend {
# 使用轮询算法(默认)
server 192.168.1.10:48080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.11:48080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.12:48080 weight=1 max_fails=3 fail_timeout=30s;
# 健康检查(需要 nginx-plus 或第三方模块)
# health_check;
# 保持连接
keepalive 32;
}
# HTTP 服务器配置
server {
listen 80;
server_name surveyking.yourdomain.com; # 替换为您的域名
# 日志配置
access_log /var/log/nginx/surveyking_access.log;
error_log /var/log/nginx/surveyking_error.log;
# 客户端最大请求体大小
client_max_body_size 30m;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# 前端静态文件
location / {
root /var/www/surveyking;
index index.html;
# SPA 路由支持
try_files $uri $uri/ /index.html;
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML 文件不缓存
location ~* \.(html|htm)$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
}
# 后端 API 代理
location /admin-api {
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 60s;
proxy_read_timeout 60s;
# 缓冲配置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 错误处理
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
# 验证码代理
location /captcha {
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;
# 验证码不缓存
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
# 文件上传代理
location /files {
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 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# 健康检查端点
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
# Nginx 状态监控(可选)
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 192.168.1.0/24; # 允许内网访问
deny all;
}
}
# HTTPS 配置(推荐生产环境使用)
server {
listen 443 ssl http2;
server_name surveyking.yourdomain.com;
# SSL 证书配置
ssl_certificate /etc/ssl/certs/surveyking.crt;
ssl_certificate_key /etc/ssl/private/surveyking.key;
# SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 其他配置与 HTTP 相同...
# (复制上面的 location 配置)
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name surveyking.yourdomain.com;
return 301 https://$server_name$request_uri;
}
1.3 负载均衡算法选择
Nginx 支持多种负载均衡算法:
upstream surveyking_backend {
# 1. 轮询(默认)- 按顺序分发请求
server 192.168.1.10:48080;
server 192.168.1.11:48080;
# 2. 加权轮询 - 根据服务器性能分配权重
# server 192.168.1.10:48080 weight=3;
# server 192.168.1.11:48080 weight=1;
# 3. IP 哈希 - 基于客户端 IP 分发(会话保持)
# ip_hash;
# 4. 最少连接 - 分发到连接数最少的服务器
# least_conn;
# 5. 响应时间 - 分发到响应时间最短的服务器(需要第三方模块)
# least_time;
}
1.4 启动和验证
# 测试配置文件语法
sudo nginx -t
# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx
# 验证负载均衡
curl -I http://surveyking.yourdomain.com/health
# 查看 Nginx 状态
curl http://localhost/nginx_status
2. 文件服务配置
在分布式部署中,文件存储是关键问题。卷王问卷系统支持多种文件存储方式,推荐使用 OSS 或 FTP 实现文件共享。
配置路径,基础设置 -> 文件管理 -> 文件配置
2.1 OSS 对象存储配置(推荐)
2.2 FTP 文件服务配置
如果无法使用 OSS,可以使用 FTP 服务器实现文件共享:
2.2.1 搭建 FTP 服务器
-
安装 vsftpd
# CentOS/RHEL
sudo dnf install -y vsftpd
# Ubuntu/Debian
sudo apt-get install -y vsftpd -
配置 vsftpd
sudo vim /etc/vsftpd/vsftpd.conf
配置内容:
# 基本配置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
# 安全配置
chroot_local_user=YES
allow_writeable_chroot=YES
# 被动模式配置
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
# 日志配置
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES
# 用户配置
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO -
创建 FTP 用户
# 创建专用用户
sudo useradd -m -s /bin/bash surveyking
sudo passwd surveyking
# 设置用户目录权限
sudo chmod 755 /home/surveyking
sudo mkdir -p /home/surveyking/files
sudo chown -R surveyking:surveyking /home/surveyking/files
# 添加到 FTP 用户列表
echo "surveyking" | sudo tee -a /etc/vsftpd/user_list -
启动 FTP 服务
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
# 开放防火墙端口
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=40000-40100/tcp
sudo firewall-cmd --reload
2.2.2 系统配置 FTP
在管理后台的文件配置中添加 FTP 配置:
2.3 本地存储同步方案
如果必须使用本地存储,可以通过以下方案解决文件同步问题:
2.3.1 NFS 网络文件系统
-
安装 NFS 服务器(在文件服务器上)
# CentOS/RHEL
sudo dnf install -y nfs-utils
# Ubuntu/Debian
sudo apt-get install -y nfs-kernel-server -
配置 NFS 共享
# 创建共享目录
sudo mkdir -p /opt/surveyking/files
sudo chown -R nobody:nobody /opt/surveyking/files
# 配置共享
sudo vim /etc/exports添加配置:
/opt/surveyking/files 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
-
启动 NFS 服务
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
sudo exportfs -a -
在应用服务器上挂载 NFS
# 安装 NFS 客户端
sudo dnf install -y nfs-utils
# 创建挂载点
sudo mkdir -p /opt/surveyking/files
# 挂载 NFS
sudo mount -t nfs nfs-server-ip:/opt/surveyking/files /opt/surveyking/files
# 设置开机自动挂载
echo "nfs-server-ip:/opt/surveyking/files /opt/surveyking/files nfs defaults 0 0" | sudo tee -a /etc/fstab
2.3.2 rsync 文件同步
使用 rsync 实现文件同步:
-
配置 rsync 服务器(在文件服务器上)
sudo vim /etc/rsyncd.conf
配置内容:
[surveyking_files]
path = /opt/surveyking/files
comment = SurveyKing Files
read only = false
list = yes
uid = nobody
gid = nobody
auth users = surveyking
secrets file = /etc/rsyncd.secrets -
创建认证文件
sudo vim /etc/rsyncd.secrets
添加内容:
surveyking:your-password
sudo chmod 600 /etc/rsyncd.secrets
-
启动 rsync 服务
sudo systemctl start rsync
sudo systemctl enable rsync -
在应用服务器上同步文件
# 创建同步脚本
sudo vim /opt/surveyking/sync-files.sh脚本内容:
#!/bin/bash
rsync -avz --delete rsync://surveyking@rsync-server/surveyking_files/ /opt/surveyking/files/sudo chmod +x /opt/surveyking/sync-files.sh
# 设置定时同步
echo "*/5 * * * * /opt/surveyking/sync-files.sh" | sudo crontab -
2.3.3 系统配置本地存储
配置所有应用服务器使用相同的本地存储路径:
{
"name": "本地存储",
"storage": 10,
"master": true,
"config": {
"@class": "cn.surveyking.framework.file.core.client.local.LocalFileClientConfig",
"basePath": "/opt/surveyking/files",
"domain": "http://your-domain.com/files"
}
}
通过以上配置,您可以成功部署一个高可用的分布式卷王问卷系统。建议在生产环境中使用 OSS 对象存储,这样可以避免文件同步的复杂性,提供更好的性能和可靠性。