跳到主要内容

分布式部署

本文档介绍如何将卷王问卷系统部署为分布式架构,支持多台服务器负载均衡部署,提高系统的可用性和性能。

分布式架构概述

架构特点

  • 负载均衡: 使用 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 实现文件共享。

配置路径,基础设置 -> 文件管理 -> 文件配置

1758086897500

2.1 OSS 对象存储配置(推荐)

2.2 FTP 文件服务配置

如果无法使用 OSS,可以使用 FTP 服务器实现文件共享:

2.2.1 搭建 FTP 服务器

  1. 安装 vsftpd

    # CentOS/RHEL
    sudo dnf install -y vsftpd

    # Ubuntu/Debian
    sudo apt-get install -y vsftpd
  2. 配置 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
  3. 创建 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
  4. 启动 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 网络文件系统

  1. 安装 NFS 服务器(在文件服务器上)

    # CentOS/RHEL
    sudo dnf install -y nfs-utils

    # Ubuntu/Debian
    sudo apt-get install -y nfs-kernel-server
  2. 配置 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)
  3. 启动 NFS 服务

    sudo systemctl start nfs-server
    sudo systemctl enable nfs-server
    sudo exportfs -a
  4. 在应用服务器上挂载 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 实现文件同步:

  1. 配置 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
  2. 创建认证文件

    sudo vim /etc/rsyncd.secrets

    添加内容:

    surveyking:your-password
    sudo chmod 600 /etc/rsyncd.secrets
  3. 启动 rsync 服务

    sudo systemctl start rsync
    sudo systemctl enable rsync
  4. 在应用服务器上同步文件

    # 创建同步脚本
    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 对象存储,这样可以避免文件同步的复杂性,提供更好的性能和可靠性。