部署前准备:
- 已完成开发环境搭建(参考快速开始文档)
- 服务器满足最低硬件要求:8GB内存、50GB硬盘、4核CPU
- 已安装JDK 17、MySQL 8.x、Redis 6.x
- 已配置向量数据库和对象存储服务
- 重要: 确保Nginx配置支持流式消息传输,这对AI对话体验至关重要
部署架构
LangChat Pro采用前后端分离部署架构,支持单机部署和集群部署。后端部署
Step 1: 项目打包
1
编译打包
进入项目根目录,执行Maven打包命令:打包完成后,在
Copy
# 清理并编译
mvn clean compile
# 打包生成部署文件
mvn clean package -Dmaven.test.skip=true
langchat-bootstrap/target/ 目录下会生成以下文件:langchat-bootstrap-bin.tar.gz- 完整的部署包langchat-bootstrap.jar- 可执行JAR文件
2
解压部署包
将生成的部署包上传到服务器并解压:解压后的目录结构:
Copy
# 上传部署包到服务器
scp langchat-bootstrap-bin.tar.gz user@server:/opt/langchat/
# 在服务器上解压
cd /opt/langchat/
tar -xzf langchat-bootstrap-bin.tar.gz
Copy
.
├── bin/ # 脚本目录
│ ├── start.sh # 启动脚本
│ └── stop.sh # 停止脚本
├── config/ # 配置目录
│ ├── application-dev.yml # 开发环境配置
│ ├── application-local.yml # 本地环境配置
│ ├── application-prd.yml # 生产环境配置
│ ├── application.yml # 主配置文件
│ └── banner.txt # 启动横幅
└── lib/ # 依赖库目录
└── langchat-bootstrap.jar # 主程序JAR文件
3
配置环境
修改
config/application-prd.yml 生产环境配置文件:Copy
server:
port: 8100
spring:
# 数据库配置
datasource:
username: langchat
password: your_production_password
url: jdbc:mysql://127.0.0.1:3306/langchat_pro?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
keep-alive: true
# Redis配置
data:
redis:
port: 6379
host: 127.0.0.1
database: 1
password: your_redis_password
jedis:
pool:
max-wait: 2000
time-between-eviction-runs: 1000
langchat:
searxng:
enabled: true
duration: 10
url: http://127.0.0.1:8081
max-results: 10
max-results-limit: 50
excalidraw:
url: http://127.0.0.1:3000
oss:
# 固定填写,本地:local-plus(nginx)、七牛:qiniu-kodo、阿里OSS:aliyun-oss、腾讯OSS:tencent-cos、minio: minio
default-platform: minio
local-plus:
- platform: local-plus
# 是否启用
enable-storage: false
# 访问域名
domain: http://your-domain.com/
# 文件夹名称
base-path: langchat-oss/
# 本地存储路径
storage-path: /var/www/langchat-oss/
qiniu-kodo:
- platform: qiniu-kodo
# 是否启用
enable-storage: false
access-key: your_access_key
secret-key: your_secret_key
# 桶名称
bucket-name: your_bucket_name
# 文件夹名称
base-path: langchat-oss/
# 访问域名
domain: your_domain
aliyun-oss:
- platform: aliyun-oss
# 是否启用
enable-storage: false
access-key: your_access_key
secret-key: your_secret_key
# 桶名称
bucket-name: your_bucket_name
# 访问域名
end-point: oss-cn-hangzhou.aliyuncs.com
tencent-cos:
- platform: tencent-cos
# 是否启用
enable-storage: false
secret-id: your_secret_id
secret-key: your_secret_key
# 区域
region: ap-beijing
# 桶名称
bucket-name: your_bucket_name
# 访问域名
domain: your_domain
minio:
- platform: minio
# 是否启用
enable-storage: true
secret-key: minioadmin
access-key: minioadmin
# 桶名称
bucket-name: langchat-oss
# 访问域名
end-point: http://127.0.0.1:9000/
4
启动服务
使用提供的脚本启动服务:启动脚本会自动:
Copy
# 启动服务
./bin/start.sh
# 查看启动状态
./bin/status.sh
# 查看日志(日志文件会在运行时自动创建)
tail -f logs/langchat-bootstrap.log
- 检查Java环境
- 设置JVM参数
- 启动Spring Boot应用
- 生成PID文件用于进程管理
5
验证部署
检查服务是否正常启动:
Copy
# 检查健康状态
curl http://localhost:8100/api/health
# 检查API接口
curl http://localhost:8100/api/v1/chat/models
# 检查端口监听
netstat -tlnp | grep 8100
服务管理
启动服务
启动服务
Copy
./bin/start.sh
- 检查Java环境
- 设置JVM参数(内存、GC等)
- 启动Spring Boot应用
- 记录PID到
langchat-bootstrap.pid文件
停止服务
停止服务
Copy
./bin/stop.sh
- 读取PID文件
- 优雅关闭应用
- 清理PID文件
重启服务
重启服务
Copy
./bin/restart.sh
- 先停止服务
- 等待进程完全退出
- 再启动服务
查看状态
查看状态
Copy
./bin/status.sh
- 检查PID文件
- 验证进程是否运行
- 显示服务状态信息
前端部署
Step 1: 构建前端
1
安装依赖
Copy
cd langchat-ui
pnpm install
2
构建生产版本
Copy
# 构建生产版本
pnpm build
# 或者使用Turbo构建
pnpm turbo build --filter=langchat
apps/langchat/dist/ 目录下生成静态文件。3
配置Nginx
创建Nginx配置文件
/etc/nginx/sites-available/langchat:Copy
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name your-domain.com; # 替换为您的域名
# 前端静态文件
location / {
root /var/www/langchat;
index index.html;
try_files $uri $uri/ /index.html;
# 缓存静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# API代理 - 流式消息支持
location ^~ /api/ {
proxy_pass http://127.0.0.1:8100;
rewrite ^/api/(.*)$ /$1 break;
# 流式消息关键配置
chunked_transfer_encoding on; # 启用分块传输编码
proxy_cache off; # 关闭代理缓存
proxy_buffering off; # 关闭代理缓冲
tcp_nopush on; # 启用TCP_NOPUSH
tcp_nodelay on; # 启用TCP_NODELAY
# 超时设置(流式消息需要较长的超时时间)
proxy_connect_timeout 15s;
proxy_send_timeout 15s;
proxy_read_timeout 15s;
# 请求头设置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket支持(如果需要)
location /ws/ {
proxy_pass http://127.0.0.1:8100/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
}
4
部署静态文件
Copy
# 创建部署目录
sudo mkdir -p /var/www/langchat
# 复制构建文件
sudo cp -r apps/langchat/dist/* /var/www/langchat/
# 设置权限
sudo chown -R www-data:www-data /var/www/langchat
sudo chmod -R 755 /var/www/langchat
# 启用站点
sudo ln -s /etc/nginx/sites-available/langchat /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
流式消息配置说明
关键配置项说明
关键配置项说明
流式消息核心配置:
chunked_transfer_encoding on- 启用分块传输编码,支持流式数据传输proxy_cache off- 关闭代理缓存,避免缓存影响实时数据proxy_buffering off- 关闭代理缓冲,确保数据立即转发tcp_nopush on- 启用TCP_NOPUSH,优化网络传输tcp_nodelay on- 启用TCP_NODELAY,减少延迟
超时设置
超时设置
流式消息超时配置:
proxy_connect_timeout 15s- 连接超时时间proxy_send_timeout 15s- 发送超时时间proxy_read_timeout 15s- 读取超时时间
对于长时间运行的AI对话,可能需要适当增加超时时间
性能优化
性能优化
流式消息性能优化:
- 使用
location ^~ /api/确保API请求优先匹配 - 使用
rewrite规则简化URL路径 - 设置合适的
worker_connections支持并发连接
监控和日志
日志管理
应用日志
应用日志
Copy
# 查看应用日志
tail -f /opt/langchat/logs/langchat-bootstrap.log
# 查看错误日志
grep ERROR /opt/langchat/logs/langchat-bootstrap.log
# 日志轮转(使用logrotate)
sudo vim /etc/logrotate.d/langchat
系统监控
系统监控
Copy
# 监控进程状态
ps aux | grep langchat-bootstrap
# 监控内存使用
free -h
# 监控磁盘使用
df -h
# 监控网络连接
netstat -tlnp | grep 8100
性能优化
JVM优化
根据服务器配置调整JVM参数:Copy
# 编辑启动脚本
vim /opt/langchat/bin/start.sh
Copy
# 8GB内存服务器
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"
# 16GB内存服务器
JAVA_OPTS="-Xms4g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"
# 32GB内存服务器
JAVA_OPTS="-Xms8g -Xmx16g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"
数据库优化
MySQL优化
MySQL优化
Copy
-- 检查慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 优化配置
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
SET GLOBAL innodb_log_file_size = 268435456; -- 256MB
SET GLOBAL max_connections = 200;
Redis优化
Redis优化
Copy
# Redis配置优化
vim /etc/redis/redis.conf
Copy
maxmemory 2gb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
安全配置
网络安全
防火墙配置
防火墙配置
Copy
# 开放必要端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
# 限制数据库端口访问
sudo ufw allow from 127.0.0.1 to any port 3306
sudo ufw allow from 127.0.0.1 to any port 6379
SSL证书配置
SSL证书配置
Copy
# 安装Certbot
sudo apt install certbot python3-certbot-nginx
# 获取SSL证书
sudo certbot --nginx -d your-domain.com
# 自动续期
sudo crontab -e
# 添加:0 12 * * * /usr/bin/certbot renew --quiet
备份策略
数据备份
数据库备份
数据库备份
Copy
# 创建备份脚本
vim /opt/scripts/backup.sh
Copy
#!/bin/bash
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# MySQL备份
mysqldump -u root -p langchat_pro > $BACKUP_DIR/langchat_pro_$DATE.sql
# Redis备份
cp /var/lib/redis/dump.rdb $BACKUP_DIR/redis_$DATE.rdb
# 压缩备份
tar -czf $BACKUP_DIR/langchat_backup_$DATE.tar.gz $BACKUP_DIR/langchat_pro_$DATE.sql $BACKUP_DIR/redis_$DATE.rdb
# 清理旧备份(保留30天)
find $BACKUP_DIR -name "langchat_backup_*.tar.gz" -mtime +30 -delete
应用备份
应用备份
Copy
# 备份应用配置
tar -czf /opt/backups/config_backup_$(date +%Y%m%d).tar.gz /opt/langchat/config/
# 备份上传文件
tar -czf /opt/backups/uploads_backup_$(date +%Y%m%d).tar.gz /opt/langchat/uploads/
故障排查
常见问题
服务启动失败
服务启动失败
Copy
# 检查Java环境
java -version
# 检查端口占用
netstat -tlnp | grep 8100
# 查看详细错误日志
tail -f /opt/langchat/logs/langchat-bootstrap.log
数据库连接失败
数据库连接失败
Copy
# 检查MySQL服务状态
sudo systemctl status mysql
# 测试数据库连接
mysql -u langchat -p -h localhost langchat_pro
# 检查防火墙设置
sudo ufw status
内存不足
内存不足
Copy
# 检查内存使用
free -h
# 检查JVM内存使用
jstat -gc pid
# 调整JVM参数
vim /opt/langchat/bin/start.sh
流式消息问题
流式消息问题
Copy
# 检查Nginx配置
sudo nginx -t
# 检查流式消息配置
grep -n "chunked_transfer_encoding\|proxy_buffering" /etc/nginx/sites-available/langchat
# 检查连接超时
tail -f /var/log/nginx/error.log | grep timeout
# 测试流式消息
curl -N -H "Accept: text/event-stream" http://your-domain.com/api/v1/chat/stream
如果流式消息不工作,请检查Nginx配置中的
proxy_buffering off 和 chunked_transfer_encoding on 设置集群部署
负载均衡配置
对于高并发场景,可以使用Nginx负载均衡:Copy
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream langchat_backend {
server 192.168.1.10:8100 weight=1;
server 192.168.1.11:8100 weight=1;
server 192.168.1.12:8100 weight=1;
}
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /var/www/langchat;
index index.html;
try_files $uri $uri/ /index.html;
}
# API代理 - 流式消息支持
location ^~ /api/ {
proxy_pass http://langchat_backend;
rewrite ^/api/(.*)$ /$1 break;
# 流式消息关键配置
chunked_transfer_encoding on;
proxy_cache off;
proxy_buffering off;
tcp_nopush on;
tcp_nodelay on;
# 超时设置
proxy_connect_timeout 15s;
proxy_send_timeout 15s;
proxy_read_timeout 15s;
# 请求头设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}

