Nest.js + MongoDB 服务器部署全流程:从开发到上线的完整指南

一、部署前环境准备

1.1 服务器选择与系统配置

生产环境建议选择云服务器(如 AWS EC2、阿里云 ECS),操作系统推荐 Ubuntu 22.04 LTS 或 CentOS 8。服务器配置需根据项目规模选择:

  • 开发测试环境:2核4G内存
  • 中小型生产环境:4核8G内存+100GB SSD
  • 大型应用:8核16G内存+NVMe SSD

安装基础依赖:

  1. # Ubuntu/Debian 系统
  2. sudo apt update
  3. sudo apt install -y curl git unzip nginx
  4. # CentOS 系统
  5. sudo yum update -y
  6. sudo yum install -y curl git unzip nginx

1.2 Node.js 环境配置

推荐使用 Node.js 18.x LTS 版本,通过 nvm 进行版本管理:

  1. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
  2. source ~/.bashrc
  3. nvm install 18
  4. nvm use 18

验证安装:

  1. node -v # 应输出 v18.x.x
  2. npm -v # 应输出 9.x.x 或更高

1.3 MongoDB 数据库部署

方案一:云数据库服务(推荐)

  • MongoDB Atlas:提供免费层(512MB存储)
  • 阿里云/腾讯云 MongoDB 服务:支持自动备份和灾备

方案二:自建 MongoDB 实例

  1. # Ubuntu 安装 MongoDB 6.0
  2. wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
  3. 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.list
  4. sudo apt update
  5. sudo apt install -y mongodb-org
  6. sudo systemctl enable mongod
  7. sudo systemctl start mongod

安全配置:

  1. // 在 /etc/mongod.conf 中启用认证
  2. security:
  3. authorization: enabled

创建管理员用户:

  1. use admin
  2. db.createUser({
  3. user: "admin",
  4. pwd: "SecurePassword123!",
  5. roles: ["root"]
  6. })

二、Nest.js 项目优化

2.1 生产环境配置

创建 .env.production 文件:

  1. DB_URI=mongodb://admin:SecurePassword123!@localhost:27017/production_db
  2. PORT=3000
  3. JWT_SECRET=your_strong_secret_here

修改 main.ts 添加生产环境中间件:

  1. async function bootstrap() {
  2. const app = await NestFactory.create(AppModule, {
  3. cors: {
  4. origin: ['https://yourdomain.com'],
  5. methods: ['GET', 'POST', 'PUT', 'DELETE']
  6. },
  7. logger: ['error', 'warn'] // 生产环境减少日志
  8. });
  9. // 添加速率限制
  10. app.use(
  11. rateLimit({
  12. windowMs: 15 * 60 * 1000, // 15分钟
  13. max: 100 // 每个IP限制100个请求
  14. })
  15. );
  16. await app.listen(process.env.PORT || 3000);
  17. }

2.2 性能优化

2.2.1 依赖缓存

package.json 中添加:

  1. {
  2. "scripts": {
  3. "preinstall": "npx npm-force-resolutions",
  4. "postinstall": "npm run build"
  5. },
  6. "resolutions": {
  7. "lodash": "4.17.21"
  8. }
  9. }

2.2.2 构建优化

使用 nest build 时添加:

  1. nest build --webpack --webpackPath webpack-hmr.config.js

创建 webpack-hmr.config.js

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. splitChunks: {
  5. chunks: 'all'
  6. }
  7. },
  8. performance: {
  9. hints: false
  10. }
  11. };

三、服务器部署流程

3.1 项目上传与依赖安装

  1. # 使用 git 克隆项目
  2. git clone https://github.com/your-repo/nestjs-mongodb.git
  3. cd nestjs-mongodb
  4. # 安装生产依赖
  5. npm install --production
  6. # 构建项目
  7. npm run build

3.2 PM2 进程管理

安装 PM2:

  1. npm install -g pm2

创建启动脚本 ecosystem.config.js

  1. module.exports = {
  2. apps: [{
  3. name: 'nestjs-app',
  4. script: 'dist/main.js',
  5. env: {
  6. NODE_ENV: 'production',
  7. DB_URI: process.env.DB_URI
  8. },
  9. instances: 'max', // 根据CPU核心数自动扩展
  10. exec_mode: 'cluster',
  11. error_file: '/var/log/nestjs-app-err.log',
  12. out_file: '/var/log/nestjs-app-out.log',
  13. merge_logs: true,
  14. max_memory_restart: '1G'
  15. }]
  16. };

启动应用:

  1. pm2 start ecosystem.config.js
  2. pm2 save
  3. pm2 startup # 生成开机自启命令并执行

3.3 Nginx 反向代理配置

创建 /etc/nginx/sites-available/nestjs

  1. server {
  2. listen 80;
  3. server_name yourdomain.com;
  4. location / {
  5. proxy_pass http://localhost:3000;
  6. proxy_http_version 1.1;
  7. proxy_set_header Upgrade $http_upgrade;
  8. proxy_set_header Connection 'upgrade';
  9. proxy_set_header Host $host;
  10. proxy_cache_bypass $http_upgrade;
  11. # 静态文件缓存
  12. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
  13. expires 30d;
  14. add_header Cache-Control "public";
  15. }
  16. }
  17. # 启用HTTPS时添加
  18. # listen 443 ssl;
  19. # ssl_certificate /path/to/cert.pem;
  20. # ssl_certificate_key /path/to/key.pem;
  21. }

启用配置:

  1. sudo ln -s /etc/nginx/sites-available/nestjs /etc/nginx/sites-enabled/
  2. sudo nginx -t # 测试配置
  3. sudo systemctl restart nginx

四、安全加固方案

4.1 防火墙配置

  1. # 允许必要端口
  2. sudo ufw allow 22/tcp # SSH
  3. sudo ufw allow 80/tcp # HTTP
  4. sudo ufw allow 443/tcp # HTTPS
  5. sudo ufw enable

4.2 定期备份策略

创建 MongoDB 备份脚本 /usr/local/bin/mongobackup.sh

  1. #!/bin/bash
  2. TIMESTAMP=$(date +%Y%m%d_%H%M%S)
  3. BACKUP_DIR="/backups/mongodb"
  4. mkdir -p $BACKUP_DIR
  5. mongodump --uri="mongodb://admin:SecurePassword123!@localhost:27017" --out=$BACKUP_DIR/backup_$TIMESTAMP
  6. find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \; # 保留7天备份

添加到 crontab:

  1. crontab -e
  2. # 每天凌晨2点执行备份
  3. 0 2 * * * /usr/local/bin/mongobackup.sh

4.3 安全监控

安装 Fail2ban 防止暴力破解:

  1. sudo apt install -y fail2ban
  2. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑 /etc/fail2ban/jail.local

  1. [sshd]
  2. enabled = true
  3. maxretry = 3
  4. bantime = 86400 # 封禁24小时

五、部署后验证

5.1 健康检查端点

AppController 中添加:

  1. @Get('/health')
  2. @HttpCode(200)
  3. getHealth() {
  4. return {
  5. status: 'ok',
  6. uptime: process.uptime(),
  7. memoryUsage: process.memoryUsage().rss / 1024 / 1024 + 'MB'
  8. };
  9. }

5.2 性能监控

安装 PM2 监控模块:

  1. pm2 install pm2-logrotate
  2. pm2 set pm2-logrotate:max_size 10M
  3. pm2 set pm2-logrotate:retain 7

六、常见问题解决方案

6.1 MongoDB 连接失败

  1. 检查防火墙是否开放 27017 端口
  2. 验证连接字符串格式:
    1. mongodb://username:password@host:port/dbname?authSource=admin
  3. 检查 MongoDB 日志:
    1. sudo tail -f /var/log/mongodb/mongod.log

6.2 Nest.js 静态文件404

确保在 main.ts 中正确配置:

  1. import { join } from 'path';
  2. import { NestExpressApplication } from '@nestjs/platform-express';
  3. async function bootstrap() {
  4. const app = await NestFactory.create<NestExpressApplication>(
  5. AppModule
  6. );
  7. app.useStaticAssets(join(__dirname, '..', 'public'));
  8. // ...其他配置
  9. }

6.3 PM2 进程崩溃

  1. 检查日志:
    1. pm2 logs nestjs-app
  2. 增加内存限制:
    1. pm2 restart nestjs-app --node-args="--max-old-space-size=2048"

通过以上完整部署流程,开发者可以系统化地完成 Nest.js + MongoDB 的生产环境部署。建议在实际部署前先在测试环境验证所有步骤,并根据项目需求调整配置参数。定期维护包括更新依赖版本、检查安全补丁和优化数据库查询,这些措施能确保系统长期稳定运行。