Node.js Express 项目现代化打包部署全指南
Node.js Express 项目现代化打包部署全指南
一、项目准备阶段
1.1 依赖管理优化
# 生产依赖安装(示例) npm install express mongoose dotenv compression helmet # 开发依赖安装 npm install nodemon eslint @types/node --save-dev
1.2 环境变量配置
// .env.production MONGODB_URI=mongodb+srv://:@cluster0.example.mongodb.net/production JWT_SECRET=prod_secure_key_here PORT=8080 NODE_ENV=production
二、核心打包流程
2.1 构建脚本配置
{ "scripts": { "build": "npm run lint && npm audit", "start:prod": "NODE_ENV=production node ./bin/www", "lint": "eslint 'src/**/*.js' --fix" } }
2.2 静态资源优化
// 生产环境配置 if (process.env.NODE_ENV === 'production') { app.use(express.static('public', { maxAge: '1y', setHeaders: (res, path) => { if (express.static.mime.lookup(path) === 'text/html') { res.setHeader('Cache-Control', 'public, max-age=0') } } })) }
三、生产环境部署
3.1 PM2 进程管理
# 安装PM2 npm install pm2 -g # 集群模式启动 pm2 start ./bin/www -i max --name "express-api"
3.2 数据库连接优化
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true, serverSelectionTimeoutMS: 5000, socketTimeoutMS: 45000 }) mongoose.connection.on('error', err => { console.error('MongoDB连接异常:', err) process.exit(1) })
四、进阶部署方案
4.1 Docker 容器化部署
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . EXPOSE 8080 CMD [ "npm", "run", "start:prod" ]
4.2 Nginx 反向代理配置
upstream nodejs_backend { server localhost:8080; keepalive 32; } server { listen 80; location / { proxy_pass http://nodejs_backend; proxy_http_version 1.1; proxy_set_header Connection ""; } }
五、自动化部署策略
5.1 GitHub Actions 配置
name: CI/CD Pipeline on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 - run: npm ci - run: npm run build - name: Deploy to Server uses: appleboy/ssh-action@v0.1.10 with: host: ${{ secrets.PROD_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} script: | cd /var/www/express-app git pull origin main npm install --production pm2 reload all
六、安全与监控
const helmet = require('helmet') const rateLimit = require('express-rate-limit') // 安全头设置 app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'", "'unsafe-inline'"] } } })) // 请求限流 const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100 // 每个IP限制100个请求 })
七、注意事项
- 环境变量安全:切勿将.env文件提交到版本库
- 日志管理:建议使用Winston进行结构化日志记录
- 性能监控:集成APM工具(如New Relic或Prometheus)
- 错误跟踪:配置Sentry进行异常捕获
- CI/CD扩展:可结合SonarQube进行代码质量检测
八、延伸工具推荐
- 性能分析工具:clinic.js
- 压力测试:artillery
- 配置管理:Consul
- 容器编排:Kubernetes
- 服务监控:Grafana + Prometheus
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。