# 文件上传服务器 这是一个独立的文件上传服务器,用于处理头像、作品封面、视频等文件的上传。 ## 功能特性 - 支持图片上传(jpg, jpeg, png, gif, bmp, webp) - 支持视频上传(mp4, mov, avi, flv) - 自动按日期分类存储文件 - 文件大小限制:500MB - 使用 UUID 生成唯一文件名 - 支持 CORS 跨域请求 - 提供静态文件访问服务 ## 安装依赖 ```bash npm install ``` ## 启动服务 ### 开发模式(自动重启) ```bash npm run dev ``` ### 生产模式 ```bash npm start ``` ## 使用 PM2 部署(推荐) ### 安装 PM2 ```bash npm install -g pm2 ``` ### 启动服务 ```bash pm2 start server.js --name file-upload-server ``` ### 查看状态 ```bash pm2 status ``` ### 查看日志 ```bash pm2 logs file-upload-server ``` ### 停止服务 ```bash pm2 stop file-upload-server ``` ### 重启服务 ```bash pm2 restart file-upload-server ``` ### 设置开机自启 ```bash pm2 startup pm2 save ``` ## 接口说明 ### 1. 健康检查 ``` GET http://1.15.149.240:30005/health ``` 响应: ```json { "status": "ok", "message": "文件上传服务器运行正常", "timestamp": "2024-01-06T10:00:00.000Z" } ``` ### 2. 文件上传 ``` POST http://1.15.149.240:30005/upload Content-Type: multipart/form-data file: [文件] model: avatar|works|cover|video ``` 响应: ```json { "status": 200, "message": "上传成功", "data": { "url": "http://1.15.149.240/uploads/avatar/2024/01/06/xxx.jpg", "fileName": "test.jpg", "fileSize": 123456, "mimeType": "image/jpeg" } } ``` ### 3. 文件访问 ``` GET http://1.15.149.240/uploads/{model}/{year}/{month}/{day}/{filename} ``` 示例: ``` http://1.15.149.240/uploads/avatar/2024/01/06/a1b2c3d4-e5f6-7890-abcd-ef1234567890.jpg ``` ## 目录结构 ``` /data/uploads/ ├── avatar/ # 头像 │ └── 2024/01/06/ ├── works/ # 作品图片 │ └── 2024/01/06/ ├── cover/ # 封面图片 │ └── 2024/01/06/ └── video/ # 视频文件 └── 2024/01/06/ ``` ## 测试命令 ### 测试上传图片 ```bash curl -X POST http://1.15.149.240:30005/upload \ -F "file=@test.jpg" \ -F "model=avatar" ``` ### 测试上传视频 ```bash curl -X POST http://1.15.149.240:30005/upload \ -F "file=@test.mp4" \ -F "model=works" ``` ### 测试健康检查 ```bash curl http://1.15.149.240:30005/health ``` ## 配置 Nginx 在服务器上配置 Nginx 提供静态文件访问: ```nginx server { listen 80; server_name 1.15.149.240; # 文件上传大小限制 client_max_body_size 500M; # 静态文件访问 location /uploads/ { alias /data/uploads/; autoindex off; # 跨域配置 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; # 缓存设置 expires 30d; add_header Cache-Control "public, immutable"; } # 上传接口代理(可选,如果需要通过 80 端口访问) location /api/upload/ { proxy_pass http://127.0.0.1:30005/; 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_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; } } ``` 重启 Nginx: ```bash sudo nginx -t sudo systemctl restart nginx ``` ## 防火墙配置 ### Ubuntu/Debian (UFW) ```bash sudo ufw allow 30005/tcp sudo ufw allow 80/tcp ``` ### CentOS/RHEL (firewalld) ```bash sudo firewall-cmd --permanent --add-port=30005/tcp sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload ``` ## 日志 ### 查看实时日志 ```bash # 使用 PM2 pm2 logs file-upload-server # 或直接查看 tail -f /path/to/logs/file-upload-server.log ``` ## 监控 ### 磁盘使用情况 ```bash df -h /data/uploads du -sh /data/uploads/* ``` ### 文件数量统计 ```bash find /data/uploads -type f | wc -l ``` ### 最大的文件 ```bash find /data/uploads -type f -exec du -h {} + | sort -rh | head -20 ``` ## 定期清理(可选) 创建定时任务清理旧文件: ```bash # 编辑 crontab crontab -e # 添加任务:每天凌晨 2 点清理 30 天前的临时文件 0 2 * * * find /data/uploads/temp -type f -mtime +30 -delete ``` ## 故障排查 ### 1. 端口被占用 ```bash # 查看端口占用 lsof -i :30005 # 或 netstat -tulpn | grep 30005 ``` ### 2. 权限问题 ```bash # 检查目录权限 ls -la /data/uploads # 修改权限 sudo chown -R $USER:$USER /data/uploads sudo chmod -R 755 /data/uploads ``` ### 3. 磁盘空间不足 ```bash # 查看磁盘使用情况 df -h # 清理空间 sudo apt clean sudo journalctl --vacuum-time=7d ``` ### 4. 服务无法启动 ```bash # 查看错误日志 pm2 logs file-upload-server --err # 检查 Node.js 版本 node --version # 需要 v14 或更高版本 ``` ## 性能优化 ### 1. 使用 Nginx 缓存 ```nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=upload_cache:10m max_size=1g inactive=60m; location /uploads/ { proxy_cache upload_cache; proxy_cache_valid 200 30d; # ... } ``` ### 2. 启用 Gzip 压缩 ```nginx gzip on; gzip_types image/jpeg image/png image/gif; gzip_min_length 1000; ``` ### 3. 使用 CDN 将上传的文件同步到 CDN,提高访问速度。 ## 安全建议 1. **限制文件类型**:只允许特定的文件类型上传 2. **文件大小限制**:防止恶意上传大文件 3. **病毒扫描**:集成 ClamAV 等病毒扫描工具 4. **访问控制**:添加 API 认证机制 5. **HTTPS**:使用 SSL 证书加密传输 6. **防火墙**:只开放必要的端口 7. **日志审计**:记录所有上传操作 ## 备份策略 ### 定期备份到远程服务器 ```bash # 使用 rsync rsync -avz /data/uploads/ backup-server:/backup/uploads/ # 或使用 rclone(支持云存储) rclone sync /data/uploads/ remote:backup/uploads/ ``` ### 创建备份脚本 ```bash #!/bin/bash # backup-uploads.sh DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/uploads-$DATE" # 创建备份 tar -czf "$BACKUP_DIR.tar.gz" /data/uploads/ # 上传到云存储 # rclone copy "$BACKUP_DIR.tar.gz" remote:backups/ # 删除 7 天前的备份 find /backup -name "uploads-*.tar.gz" -mtime +7 -delete echo "备份完成: $BACKUP_DIR.tar.gz" ``` 添加到 crontab: ```bash 0 3 * * * /path/to/backup-uploads.sh ``` ## 环境要求 - Node.js >= 14.0.0 - npm >= 6.0.0 - 磁盘空间 >= 100GB(根据实际需求调整) - 内存 >= 512MB ## 许可证 MIT