一、部署前环境准备
1.1 服务器选择与系统配置
生产环境建议选择云服务器(如 AWS EC2、阿里云 ECS),操作系统推荐 Ubuntu 22.04 LTS 或 CentOS 8。服务器配置需根据项目规模选择:
- 开发测试环境:2核4G内存
- 中小型生产环境:4核8G内存+100GB SSD
- 大型应用:8核16G内存+NVMe SSD
安装基础依赖:
# Ubuntu/Debian 系统sudo apt updatesudo apt install -y curl git unzip nginx# CentOS 系统sudo yum update -ysudo yum install -y curl git unzip nginx
1.2 Node.js 环境配置
推荐使用 Node.js 18.x LTS 版本,通过 nvm 进行版本管理:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bashsource ~/.bashrcnvm install 18nvm use 18
验证安装:
node -v # 应输出 v18.x.xnpm -v # 应输出 9.x.x 或更高
1.3 MongoDB 数据库部署
方案一:云数据库服务(推荐)
- MongoDB Atlas:提供免费层(512MB存储)
- 阿里云/腾讯云 MongoDB 服务:支持自动备份和灾备
方案二:自建 MongoDB 实例
# Ubuntu 安装 MongoDB 6.0wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.listsudo apt updatesudo apt install -y mongodb-orgsudo systemctl enable mongodsudo systemctl start mongod
安全配置:
// 在 /etc/mongod.conf 中启用认证security:authorization: enabled
创建管理员用户:
use admindb.createUser({user: "admin",pwd: "SecurePassword123!",roles: ["root"]})
二、Nest.js 项目优化
2.1 生产环境配置
创建 .env.production 文件:
DB_URI=mongodb://admin:SecurePassword123!@localhost:27017/production_dbPORT=3000JWT_SECRET=your_strong_secret_here
修改 main.ts 添加生产环境中间件:
async function bootstrap() {const app = await NestFactory.create(AppModule, {cors: {origin: ['https://yourdomain.com'],methods: ['GET', 'POST', 'PUT', 'DELETE']},logger: ['error', 'warn'] // 生产环境减少日志});// 添加速率限制app.use(rateLimit({windowMs: 15 * 60 * 1000, // 15分钟max: 100 // 每个IP限制100个请求}));await app.listen(process.env.PORT || 3000);}
2.2 性能优化
2.2.1 依赖缓存
在 package.json 中添加:
{"scripts": {"preinstall": "npx npm-force-resolutions","postinstall": "npm run build"},"resolutions": {"lodash": "4.17.21"}}
2.2.2 构建优化
使用 nest build 时添加:
nest build --webpack --webpackPath webpack-hmr.config.js
创建 webpack-hmr.config.js:
module.exports = {optimization: {minimize: true,splitChunks: {chunks: 'all'}},performance: {hints: false}};
三、服务器部署流程
3.1 项目上传与依赖安装
# 使用 git 克隆项目git clone https://github.com/your-repo/nestjs-mongodb.gitcd nestjs-mongodb# 安装生产依赖npm install --production# 构建项目npm run build
3.2 PM2 进程管理
安装 PM2:
npm install -g pm2
创建启动脚本 ecosystem.config.js:
module.exports = {apps: [{name: 'nestjs-app',script: 'dist/main.js',env: {NODE_ENV: 'production',DB_URI: process.env.DB_URI},instances: 'max', // 根据CPU核心数自动扩展exec_mode: 'cluster',error_file: '/var/log/nestjs-app-err.log',out_file: '/var/log/nestjs-app-out.log',merge_logs: true,max_memory_restart: '1G'}]};
启动应用:
pm2 start ecosystem.config.jspm2 savepm2 startup # 生成开机自启命令并执行
3.3 Nginx 反向代理配置
创建 /etc/nginx/sites-available/nestjs:
server {listen 80;server_name yourdomain.com;location / {proxy_pass http://localhost:3000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;# 静态文件缓存location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;add_header Cache-Control "public";}}# 启用HTTPS时添加# listen 443 ssl;# ssl_certificate /path/to/cert.pem;# ssl_certificate_key /path/to/key.pem;}
启用配置:
sudo ln -s /etc/nginx/sites-available/nestjs /etc/nginx/sites-enabled/sudo nginx -t # 测试配置sudo systemctl restart nginx
四、安全加固方案
4.1 防火墙配置
# 允许必要端口sudo ufw allow 22/tcp # SSHsudo ufw allow 80/tcp # HTTPsudo ufw allow 443/tcp # HTTPSsudo ufw enable
4.2 定期备份策略
创建 MongoDB 备份脚本 /usr/local/bin/mongobackup.sh:
#!/bin/bashTIMESTAMP=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="/backups/mongodb"mkdir -p $BACKUP_DIRmongodump --uri="mongodb://admin:SecurePassword123!@localhost:27017" --out=$BACKUP_DIR/backup_$TIMESTAMPfind $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \; # 保留7天备份
添加到 crontab:
crontab -e# 每天凌晨2点执行备份0 2 * * * /usr/local/bin/mongobackup.sh
4.3 安全监控
安装 Fail2ban 防止暴力破解:
sudo apt install -y fail2bansudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 /etc/fail2ban/jail.local:
[sshd]enabled = truemaxretry = 3bantime = 86400 # 封禁24小时
五、部署后验证
5.1 健康检查端点
在 AppController 中添加:
@Get('/health')@HttpCode(200)getHealth() {return {status: 'ok',uptime: process.uptime(),memoryUsage: process.memoryUsage().rss / 1024 / 1024 + 'MB'};}
5.2 性能监控
安装 PM2 监控模块:
pm2 install pm2-logrotatepm2 set pm2-logrotate:max_size 10Mpm2 set pm2-logrotate:retain 7
六、常见问题解决方案
6.1 MongoDB 连接失败
- 检查防火墙是否开放 27017 端口
- 验证连接字符串格式:
mongodb://username:password@host:port/dbname?authSource=admin
- 检查 MongoDB 日志:
sudo tail -f /var/log/mongodb/mongod.log
6.2 Nest.js 静态文件404
确保在 main.ts 中正确配置:
import { join } from 'path';import { NestExpressApplication } from '@nestjs/platform-express';async function bootstrap() {const app = await NestFactory.create<NestExpressApplication>(AppModule);app.useStaticAssets(join(__dirname, '..', 'public'));// ...其他配置}
6.3 PM2 进程崩溃
- 检查日志:
pm2 logs nestjs-app
- 增加内存限制:
pm2 restart nestjs-app --node-args="--max-old-space-size=2048"
通过以上完整部署流程,开发者可以系统化地完成 Nest.js + MongoDB 的生产环境部署。建议在实际部署前先在测试环境验证所有步骤,并根据项目需求调整配置参数。定期维护包括更新依赖版本、检查安全补丁和优化数据库查询,这些措施能确保系统长期稳定运行。