349 lines
7.5 KiB
Plaintext
349 lines
7.5 KiB
Plaintext
|
|
# PromptForge 服务器稳定性优化方案
|
|||
|
|
|
|||
|
|
## 📊 当前服务器资源分析
|
|||
|
|
|
|||
|
|
### 硬件配置
|
|||
|
|
- **CPU**: 2 核心
|
|||
|
|
- **内存**: 3.6GB 总内存,1.9GB 可用
|
|||
|
|
- **磁盘**: 89GB 总容量,62GB 可用 (28% 使用率)
|
|||
|
|
- **负载**: 0.24 (低负载,运行良好)
|
|||
|
|
|
|||
|
|
### 当前应用资源使用
|
|||
|
|
- **Next.js 服务**: 323MB 内存 (8.5%)
|
|||
|
|
- **总内存使用**: 1.4GB (38.9%)
|
|||
|
|
- **可用内存**: 1.9GB (充足)
|
|||
|
|
|
|||
|
|
## 🎯 稳定性优化方案
|
|||
|
|
|
|||
|
|
### 方案一:PM2 进程管理 (推荐)
|
|||
|
|
|
|||
|
|
#### 1. 安装和配置 PM2
|
|||
|
|
```bash
|
|||
|
|
# 安装 PM2
|
|||
|
|
npm install -g pm2
|
|||
|
|
|
|||
|
|
# 创建 PM2 配置文件
|
|||
|
|
cat > ecosystem.config.js << 'EOF'
|
|||
|
|
module.exports = {
|
|||
|
|
apps: [{
|
|||
|
|
name: 'promptforge',
|
|||
|
|
script: 'npx',
|
|||
|
|
args: 'next@14.0.4 dev -H 0.0.0.0 -p 3000',
|
|||
|
|
cwd: '/home/renjianbo/aiapply',
|
|||
|
|
instances: 1, // 单实例,适合小服务器
|
|||
|
|
autorestart: true,
|
|||
|
|
watch: false,
|
|||
|
|
max_memory_restart: '800M', // 内存超过800MB自动重启
|
|||
|
|
min_uptime: '10s',
|
|||
|
|
max_restarts: 10,
|
|||
|
|
restart_delay: 4000,
|
|||
|
|
env: {
|
|||
|
|
NODE_ENV: 'production',
|
|||
|
|
PORT: 3000
|
|||
|
|
},
|
|||
|
|
error_file: '/home/renjianbo/aiapply/logs/err.log',
|
|||
|
|
out_file: '/home/renjianbo/aiapply/logs/out.log',
|
|||
|
|
log_file: '/home/renjianbo/aiapply/logs/combined.log',
|
|||
|
|
time: true
|
|||
|
|
}]
|
|||
|
|
}
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# 创建日志目录
|
|||
|
|
mkdir -p logs
|
|||
|
|
|
|||
|
|
# 启动服务
|
|||
|
|
pm2 start ecosystem.config.js
|
|||
|
|
|
|||
|
|
# 设置开机自启动
|
|||
|
|
pm2 startup
|
|||
|
|
pm2 save
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. PM2 监控和管理
|
|||
|
|
```bash
|
|||
|
|
# 查看服务状态
|
|||
|
|
pm2 status
|
|||
|
|
|
|||
|
|
# 查看实时日志
|
|||
|
|
pm2 logs promptforge
|
|||
|
|
|
|||
|
|
# 重启服务
|
|||
|
|
pm2 restart promptforge
|
|||
|
|
|
|||
|
|
# 停止服务
|
|||
|
|
pm2 stop promptforge
|
|||
|
|
|
|||
|
|
# 监控资源使用
|
|||
|
|
pm2 monit
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案二:系统级优化
|
|||
|
|
|
|||
|
|
#### 1. 系统资源限制
|
|||
|
|
```bash
|
|||
|
|
# 创建系统限制配置
|
|||
|
|
sudo tee /etc/security/limits.d/promptforge.conf << 'EOF'
|
|||
|
|
# PromptForge 用户资源限制
|
|||
|
|
renjianbo soft nofile 65536
|
|||
|
|
renjianbo hard nofile 65536
|
|||
|
|
renjianbo soft nproc 32768
|
|||
|
|
renjianbo hard nproc 32768
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# 应用限制
|
|||
|
|
ulimit -n 65536
|
|||
|
|
ulimit -u 32768
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 内存优化
|
|||
|
|
```bash
|
|||
|
|
# 调整系统内存参数
|
|||
|
|
sudo tee -a /etc/sysctl.conf << 'EOF'
|
|||
|
|
# 内存优化
|
|||
|
|
vm.swappiness = 10
|
|||
|
|
vm.dirty_ratio = 15
|
|||
|
|
vm.dirty_background_ratio = 5
|
|||
|
|
vm.overcommit_memory = 1
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# 应用配置
|
|||
|
|
sudo sysctl -p
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案三:Nginx 反向代理优化
|
|||
|
|
|
|||
|
|
#### 1. 创建优化的 Nginx 配置
|
|||
|
|
```bash
|
|||
|
|
# 创建 Nginx 配置文件
|
|||
|
|
sudo tee /etc/nginx/conf.d/promptforge.conf << 'EOF'
|
|||
|
|
upstream promptforge_backend {
|
|||
|
|
server 127.0.0.1:3000;
|
|||
|
|
keepalive 32;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
server {
|
|||
|
|
listen 80;
|
|||
|
|
server_name 101.43.95.130;
|
|||
|
|
|
|||
|
|
# 重定向到 HTTPS
|
|||
|
|
return 301 https://$server_name$request_uri;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
server {
|
|||
|
|
listen 443 ssl http2;
|
|||
|
|
server_name 101.43.95.130;
|
|||
|
|
|
|||
|
|
# SSL 配置
|
|||
|
|
ssl_certificate /path/to/your/cert.pem;
|
|||
|
|
ssl_certificate_key /path/to/your/key.pem;
|
|||
|
|
ssl_protocols TLSv1.2 TLSv1.3;
|
|||
|
|
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
|
|||
|
|
|
|||
|
|
# 性能优化
|
|||
|
|
client_max_body_size 10M;
|
|||
|
|
client_body_timeout 60s;
|
|||
|
|
client_header_timeout 60s;
|
|||
|
|
keepalive_timeout 65s;
|
|||
|
|
send_timeout 60s;
|
|||
|
|
|
|||
|
|
# 压缩配置
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
# 缓存配置
|
|||
|
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
|||
|
|
expires 1y;
|
|||
|
|
add_header Cache-Control "public, immutable";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 反向代理
|
|||
|
|
location / {
|
|||
|
|
proxy_pass http://promptforge_backend;
|
|||
|
|
proxy_http_version 1.1;
|
|||
|
|
proxy_set_header Upgrade $http_upgrade;
|
|||
|
|
proxy_set_header Connection 'upgrade';
|
|||
|
|
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_cache_bypass $http_upgrade;
|
|||
|
|
|
|||
|
|
# 超时设置
|
|||
|
|
proxy_connect_timeout 60s;
|
|||
|
|
proxy_send_timeout 60s;
|
|||
|
|
proxy_read_timeout 60s;
|
|||
|
|
|
|||
|
|
# 缓冲设置
|
|||
|
|
proxy_buffering on;
|
|||
|
|
proxy_buffer_size 4k;
|
|||
|
|
proxy_buffers 8 4k;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
EOF
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案四:监控和告警
|
|||
|
|
|
|||
|
|
#### 1. 创建监控脚本
|
|||
|
|
```bash
|
|||
|
|
# 创建监控脚本
|
|||
|
|
cat > monitor.sh << 'EOF'
|
|||
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
# 监控脚本
|
|||
|
|
LOG_FILE="/home/renjianbo/aiapply/logs/monitor.log"
|
|||
|
|
DATE=$(date '+%Y-%m-%d %H:%M:%S')
|
|||
|
|
|
|||
|
|
# 检查服务状态
|
|||
|
|
if ! netstat -tlnp | grep -q :3000; then
|
|||
|
|
echo "[$DATE] 服务未运行,尝试重启..." >> $LOG_FILE
|
|||
|
|
cd /home/renjianbo/aiapply
|
|||
|
|
pm2 restart promptforge
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 检查内存使用
|
|||
|
|
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
|
|||
|
|
if (( $(echo "$MEMORY_USAGE > 80" | bc -l) )); then
|
|||
|
|
echo "[$DATE] 内存使用率过高: ${MEMORY_USAGE}%" >> $LOG_FILE
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 检查磁盘空间
|
|||
|
|
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
|
|||
|
|
if [ $DISK_USAGE -gt 80 ]; then
|
|||
|
|
echo "[$DATE] 磁盘使用率过高: ${DISK_USAGE}%" >> $LOG_FILE
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "[$DATE] 监控检查完成" >> $LOG_FILE
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
chmod +x monitor.sh
|
|||
|
|
|
|||
|
|
# 添加到 crontab (每5分钟检查一次)
|
|||
|
|
(crontab -l 2>/dev/null; echo "*/5 * * * * /home/renjianbo/aiapply/monitor.sh") | crontab -
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案五:并发访问优化
|
|||
|
|
|
|||
|
|
#### 1. 连接池配置
|
|||
|
|
```bash
|
|||
|
|
# 创建环境变量配置
|
|||
|
|
cat >> .env.local << 'EOF'
|
|||
|
|
# 数据库连接池
|
|||
|
|
DATABASE_POOL_SIZE=5
|
|||
|
|
DATABASE_POOL_TIMEOUT=20000
|
|||
|
|
|
|||
|
|
# 应用配置
|
|||
|
|
NEXT_PUBLIC_MAX_CONCURRENT_REQUESTS=10
|
|||
|
|
NEXT_PUBLIC_REQUEST_TIMEOUT=30000
|
|||
|
|
EOF
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 系统连接优化
|
|||
|
|
```bash
|
|||
|
|
# 调整系统连接参数
|
|||
|
|
sudo tee -a /etc/sysctl.conf << 'EOF'
|
|||
|
|
# 网络连接优化
|
|||
|
|
net.core.somaxconn = 65535
|
|||
|
|
net.core.netdev_max_backlog = 5000
|
|||
|
|
net.ipv4.tcp_max_syn_backlog = 65535
|
|||
|
|
net.ipv4.tcp_keepalive_time = 600
|
|||
|
|
net.ipv4.tcp_keepalive_intvl = 60
|
|||
|
|
net.ipv4.tcp_keepalive_probes = 3
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
sudo sysctl -p
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📈 预期性能提升
|
|||
|
|
|
|||
|
|
### 并发访问能力
|
|||
|
|
- **当前**: 5-10 并发用户
|
|||
|
|
- **优化后**: 15-25 并发用户
|
|||
|
|
- **响应时间**: 减少 30-50%
|
|||
|
|
|
|||
|
|
### 稳定性提升
|
|||
|
|
- **自动重启**: 进程异常时自动恢复
|
|||
|
|
- **内存监控**: 防止内存泄漏
|
|||
|
|
- **负载均衡**: Nginx 反向代理
|
|||
|
|
- **监控告警**: 实时状态监控
|
|||
|
|
|
|||
|
|
## 🚀 实施步骤
|
|||
|
|
|
|||
|
|
### 第一步:PM2 部署 (立即实施)
|
|||
|
|
```bash
|
|||
|
|
# 停止当前服务
|
|||
|
|
pkill -f "next dev"
|
|||
|
|
|
|||
|
|
# 安装 PM2
|
|||
|
|
npm install -g pm2
|
|||
|
|
|
|||
|
|
# 启动 PM2 服务
|
|||
|
|
pm2 start ecosystem.config.js
|
|||
|
|
pm2 startup
|
|||
|
|
pm2 save
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 第二步:系统优化 (可选)
|
|||
|
|
```bash
|
|||
|
|
# 应用系统限制
|
|||
|
|
sudo tee /etc/security/limits.d/promptforge.conf << 'EOF'
|
|||
|
|
renjianbo soft nofile 65536
|
|||
|
|
renjianbo hard nofile 65536
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# 调整内存参数
|
|||
|
|
sudo tee -a /etc/sysctl.conf << 'EOF'
|
|||
|
|
vm.swappiness = 10
|
|||
|
|
net.core.somaxconn = 65535
|
|||
|
|
EOF
|
|||
|
|
sudo sysctl -p
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 第三步:监控部署 (推荐)
|
|||
|
|
```bash
|
|||
|
|
# 创建监控脚本
|
|||
|
|
./monitor.sh
|
|||
|
|
|
|||
|
|
# 设置定时监控
|
|||
|
|
(crontab -l 2>/dev/null; echo "*/5 * * * * /home/renjianbo/aiapply/monitor.sh") | crontab -
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
1. **内存限制**: 当前服务器内存有限,避免过度优化
|
|||
|
|
2. **CPU 核心**: 2核心服务器,建议单实例运行
|
|||
|
|
3. **磁盘空间**: 定期清理日志文件
|
|||
|
|
4. **网络带宽**: 监控带宽使用情况
|
|||
|
|
5. **备份策略**: 定期备份重要数据
|
|||
|
|
|
|||
|
|
## 📊 监控指标
|
|||
|
|
|
|||
|
|
### 关键指标
|
|||
|
|
- **内存使用率**: < 80%
|
|||
|
|
- **CPU 使用率**: < 70%
|
|||
|
|
- **响应时间**: < 2秒
|
|||
|
|
- **并发连接**: < 25
|
|||
|
|
- **错误率**: < 1%
|
|||
|
|
|
|||
|
|
### 监控命令
|
|||
|
|
```bash
|
|||
|
|
# 实时监控
|
|||
|
|
pm2 monit
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
pm2 logs promptforge --lines 100
|
|||
|
|
|
|||
|
|
# 系统资源
|
|||
|
|
htop
|
|||
|
|
iostat -x 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
**创建时间**: $(date)
|
|||
|
|
**服务器配置**: 2核3.6GB内存
|
|||
|
|
**预期并发**: 15-25用户
|
|||
|
|
**优化目标**: 稳定性 + 性能
|