1. NestJS项目服务器部署全流程解析
作为一名长期从事Node.js后端开发的工程师,我经历过无数次NestJS项目的部署过程。今天我将分享一套经过实战检验的完整部署方案,涵盖从本地打包到生产环境配置的全流程,以及那些官方文档不会告诉你的避坑技巧。
1.1 为什么选择NestJS
NestJS是一个渐进式的Node.js框架,它融合了OOP(面向对象编程)、FP(函数式编程)和FRP(函数响应式编程)的理念。相比Express或Koa,NestJS提供了更完善的项目结构和类型支持,特别适合构建企业级应用。但这也意味着它的部署过程需要考虑更多因素:
- 强依赖TypeScript编译系统
- 模块化架构带来的依赖管理复杂性
- 与TypeORM/Prisma等ORM工具的深度集成
2. 本地环境准备与项目打包
2.1 构建前的必要检查
在运行npm run build之前,有几个关键点需要确认:
- TypeScript配置检查:确保
tsconfig.json中的outDir指向dist目录 - 生产环境变量:检查
.env.production或NODE_ENV设置 - 依赖版本锁定:确认
package-lock.json或yarn.lock已更新
提示:永远不要在服务器上直接运行
npm install而不带--production参数,这会导致不必要的开发依赖被安装。
2.2 深度解析构建过程
当执行npm run build时,实际上发生了以下过程:
- TypeScript编译器根据
tsconfig.json配置将.ts文件转译为.js - 非.ts资源文件(如.json、.graphql等)通过配置的规则处理
- 生成最终的
dist目录结构,保持与源码相同的相对路径
常见构建问题解决方案:
bash复制# 如果遇到模块找不到错误,尝试清理缓存
rm -rf dist node_modules/.cache
npm install
npm run build
3. 服务器环境配置详解
3.1 服务器基础环境搭建
推荐使用Ubuntu 20.04/22.04 LTS作为生产环境,以下是完整的初始化步骤:
bash复制# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装Node.js(推荐使用nvm管理版本)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
source ~/.bashrc
nvm install 18 # 推荐LTS版本
# 安装PM2进程管理器
npm install -g pm2
# 安装MySQL/PostgreSQL(根据项目需求)
sudo apt install mysql-server -y
sudo mysql_secure_installation
3.2 文件传输的几种方式对比
- SCP命令(适合小型项目):
bash复制scp -r dist package.json package-lock.json .env root@yourserver:/var/www/nest-app
- rsync(适合增量更新):
bash复制rsync -avz --delete dist/ root@yourserver:/var/www/nest-app/dist
- Git部署(高级方案):
bash复制# 服务器上
git clone your-repo.git /var/www/nest-app
cd /var/www/nest-app
npm install --production
npm run build
3.3 依赖安装的注意事项
在服务器上安装依赖时,必须使用:
bash复制npm install --production
这会跳过devDependencies的安装,显著减少部署体积和潜在冲突。如果遇到node-gyp编译问题,需要安装构建工具:
bash复制sudo apt install build-essential -y
4. 项目启动与进程管理
4.1 PM2高级配置方案
基础的pm2 start命令不能满足生产环境需求,推荐使用配置文件方式:
创建ecosystem.config.js:
javascript复制module.exports = {
apps: [{
name: 'nest-app',
script: 'dist/main.js',
instances: 'max',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production'
}
}]
}
启动命令变为:
bash复制pm2 start ecosystem.config.js
4.2 日志管理技巧
PM2默认将日志存储在~/.pm2/logs中,生产环境建议:
bash复制# 按日期分割日志
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
查看实时日志:
bash复制pm2 logs nest-app --lines 1000
5. 数据库连接深度配置
5.1 TypeORM生产环境配置
最常见的数据库连接错误通常源于配置问题。正确的ormconfig.prod.js应该包含:
javascript复制module.exports = {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'prod_user',
password: process.env.DB_PASSWORD,
database: 'nest_prod',
synchronize: false, // 生产环境必须为false
logging: false,
entities: ['dist/**/*.entity.js'],
migrations: ['dist/migrations/*.js'],
cli: {
migrationsDir: 'src/migrations'
}
}
5.2 连接池优化
在app.module.ts中配置连接池:
typescript复制TypeOrmModule.forRoot({
extra: {
connectionLimit: 10, // 根据服务器配置调整
queueLimit: 5
}
})
6. Nginx高级配置技巧
6.1 完整的NestJS反向代理配置
/etc/nginx/sites-available/your-domain的推荐配置:
nginx复制upstream nest_app {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 80;
server_name yourdomain.com;
# 静态文件缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, no-transform";
root /var/www/nest-app/dist/public;
}
# API代理
location /api/ {
proxy_pass http://nest_app;
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_cache_bypass $http_upgrade;
proxy_read_timeout 300s;
}
# WebSocket支持
location /socket.io/ {
proxy_pass http://nest_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
6.2 HTTPS配置与优化
使用Let's Encrypt免费SSL证书:
bash复制sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com
配置自动续期:
bash复制sudo certbot renew --dry-run
7. 高级运维技巧
7.1 性能监控方案
安装PM2监控模块:
bash复制pm2 install pm2-server-monit
pm2 install pm2-nginx
配置自定义指标:
javascript复制// 在NestJS中添加健康检查端点
@Get('health')
healthCheck() {
return {
status: 'ok',
memory: process.memoryUsage(),
uptime: process.uptime()
};
}
7.2 零停机部署策略
使用PM2的reload命令实现无缝重启:
bash复制pm2 reload nest-app
或者更高级的蓝绿部署方案:
bash复制# 新版本部署到不同端口
PORT=3001 pm2 start dist/main.js --name nest-app-new
# 测试通过后切换Nginx配置
sed -i 's/3000/3001/g' /etc/nginx/sites-available/your-domain
nginx -t && nginx -s reload
# 最后优雅关闭旧进程
pm2 stop nest-app-old
8. 常见问题深度排查
8.1 依赖问题终极解决方案
当遇到Cannot find module错误时,按以下步骤排查:
- 检查
node_modules是否完整:
bash复制npm ls --production
- 重建依赖树:
bash复制rm -rf node_modules package-lock.json
npm cache clean --force
npm install --production
- 检查Node.js版本兼容性:
bash复制node -v
npm -v
8.2 内存泄漏排查
使用Node.js内置分析工具:
bash复制# 生成堆快照
pm2 start nest-app --node-args="--heapsnapshot-signal=SIGUSR2"
# 分析内存
node --inspect-brk -e "process._debugProcess(pid)"
9. 安全加固措施
9.1 服务器基础安全
- 禁用root远程登录
- 配置SSH密钥认证
- 启用防火墙:
bash复制sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
9.2 应用层安全
- 防止暴力破解:
bash复制sudo apt install fail2ban -y
- 设置HTTP安全头:
nginx复制add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
10. 备份与恢复策略
10.1 数据库自动备份
创建每日备份脚本/usr/local/bin/backup-db.sh:
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u prod_user -p"$DB_PASSWORD" nest_prod > /backups/db-$DATE.sql
find /backups -type f -mtime +7 -delete
添加到crontab:
bash复制0 3 * * * /usr/local/bin/backup-db.sh
10.2 应用回滚方案
使用Git标签管理版本:
bash复制# 打标签
git tag -a v1.0.1 -m "Production release 2023-08-01"
# 回滚到特定版本
git checkout v1.0.0
npm install --production
npm run build
pm2 reload all
在实际部署中,我发现配置完善的监控系统可以提前发现80%的潜在问题。建议至少监控以下指标:内存使用率、CPU负载、数据库连接数、API响应时间。当这些指标出现异常波动时,往往预示着需要及时干预的问题。