手动部署全攻略:前端与Node服务端协同部署实践指南

前端部署(包括Node服务端部署)—-手动部署

一、环境准备与基础配置

1.1 服务器环境选择

手动部署的核心在于对服务器的完全控制。建议选择Linux系统(如Ubuntu 22.04 LTS),其稳定性与社区支持远超Windows Server。配置时需考虑:

  • CPU/内存:根据项目规模选择,一般前端项目2核4G即可,Node服务端需根据并发量调整(建议4核8G起)
  • 磁盘空间:预留至少50GB空间(含系统盘与数据盘分离)
  • 网络带宽:公网带宽建议10Mbps起,内网通信需确保千兆网络

1.2 基础软件安装

  1. # 基础工具链
  2. sudo apt update && sudo apt install -y git curl wget nginx pm2 build-essential
  3. # Node环境安装(使用nvm管理多版本)
  4. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
  5. source ~/.bashrc
  6. nvm install --lts

1.3 安全配置要点

  • 防火墙规则:仅开放必要端口(80/443/22/3000)
    1. sudo ufw allow 22/tcp
    2. sudo ufw allow 80/tcp
    3. sudo ufw allow 443/tcp
    4. sudo ufw enable
  • SSH密钥认证:禁用密码登录
    1. # 生成密钥对
    2. ssh-keygen -t ed25519 -C "deploy@yourdomain.com"
    3. # 将公钥添加到服务器~/.ssh/authorized_keys

二、前端项目部署流程

2.1 构建优化策略

  • 代码分割:使用React.lazy/Suspense或Vue动态导入
    1. // React示例
    2. const OtherComponent = React.lazy(() => import('./OtherComponent'));
    3. function MyComponent() {
    4. return (
    5. <div>
    6. <Suspense fallback={<div>Loading...</div>}>
    7. <OtherComponent />
    8. </Suspense>
    9. </div>
    10. );
    11. }
  • 资源压缩:配置webpack生产模式
    1. module.exports = {
    2. mode: 'production',
    3. optimization: {
    4. minimize: true,
    5. splitChunks: {
    6. chunks: 'all',
    7. },
    8. },
    9. };

2.2 Nginx反向代理配置

  1. server {
  2. listen 80;
  3. server_name yourdomain.com;
  4. # 前端静态资源
  5. location / {
  6. root /var/www/frontend;
  7. try_files $uri $uri/ /index.html;
  8. expires 1y;
  9. add_header Cache-Control "public";
  10. }
  11. # Node服务端代理
  12. location /api/ {
  13. proxy_pass http://127.0.0.1:3000;
  14. proxy_set_header Host $host;
  15. proxy_set_header X-Real-IP $remote_addr;
  16. }
  17. }

2.3 自动化部署脚本示例

  1. #!/bin/bash
  2. # 部署脚本deploy.sh
  3. REPO_URL="git@github.com:yourname/frontend.git"
  4. DEPLOY_DIR="/var/www/frontend"
  5. # 拉取最新代码
  6. git clone $REPO_URL $DEPLOY_DIR || exit 1
  7. cd $DEPLOY_DIR
  8. # 安装依赖并构建
  9. npm install --production
  10. npm run build
  11. # 重启Nginx
  12. sudo systemctl restart nginx

三、Node服务端部署要点

3.1 生产环境配置

  • PM2进程管理
    1. npm install pm2 -g
    2. pm2 start app.js --name "api-service" -i max
    3. pm2 save
    4. pm2 startup
  • 环境变量管理
    1. // .env文件示例
    2. DB_HOST=localhost
    3. DB_PORT=5432
    4. JWT_SECRET=your_secure_secret

3.2 数据库连接优化

  1. // 使用连接池
  2. const { Pool } = require('pg');
  3. const pool = new Pool({
  4. user: process.env.DB_USER,
  5. host: process.env.DB_HOST,
  6. database: process.env.DB_NAME,
  7. password: process.env.DB_PASSWORD,
  8. port: process.env.DB_PORT,
  9. max: 20, // 连接池最大数量
  10. idleTimeoutMillis: 30000,
  11. connectionTimeoutMillis: 2000,
  12. });

3.3 日志与监控配置

  • 日志轮转
    1. # /etc/logrotate.d/nodejs
    2. /var/log/nodejs/*.log {
    3. daily
    4. missingok
    5. rotate 14
    6. compress
    7. delaycompress
    8. notifempty
    9. copytruncate
    10. }
  • 健康检查端点
    1. // Express健康检查
    2. app.get('/health', (req, res) => {
    3. res.status(200).json({ status: 'healthy' });
    4. });

四、高级部署技巧

4.1 蓝绿部署实现

  1. 准备两套完全相同的环境(蓝/绿)
  2. 通过Nginx配置切换流量:
    1. upstream api_service {
    2. server 10.0.0.1:3000; # 蓝环境
    3. # server 10.0.0.2:3000; # 绿环境(注释状态)
    4. }
  3. 使用sed命令动态切换配置后重载Nginx

4.2 容器化基础配置(可选)

  1. # Dockerfile示例
  2. FROM node:18-alpine
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm install --production
  6. COPY . .
  7. EXPOSE 3000
  8. CMD ["node", "app.js"]

4.3 性能调优参数

  • Node.js
    1. # 启动时指定内存限制
    2. node --max-old-space-size=4096 app.js
  • Nginx
    1. worker_processes auto;
    2. worker_rlimit_nofile 65535;
    3. events {
    4. worker_connections 4096;
    5. }

五、常见问题解决方案

5.1 跨域问题处理

  1. // Express CORS中间件
  2. const cors = require('cors');
  3. app.use(cors({
  4. origin: 'https://yourdomain.com',
  5. methods: ['GET', 'POST', 'PUT', 'DELETE'],
  6. allowedHeaders: ['Content-Type', 'Authorization'],
  7. }));

5.2 静态资源404错误

  • 确保Nginx配置中root指令指向正确的构建目录
  • 检查文件权限:
    1. sudo chown -R www-data:www-data /var/www/frontend
    2. sudo chmod -R 755 /var/www/frontend

5.3 Node进程崩溃处理

  • 配置PM2自动重启策略:
    1. pm2 start app.js --max-restarts 10 --max-memory-restart 1G
  • 设置邮件报警:
    1. pm2 set pm2:email your@email.com

六、部署后验证清单

  1. 功能测试
    • 核心业务流程验证
    • 边界条件测试
  2. 性能测试
    • 使用abwrk进行压力测试
      1. wrk -t12 -c400 -d30s http://yourdomain.com/api/endpoint
  3. 安全扫描
    • 使用nmap检查开放端口
    • 进行OWASP ZAP漏洞扫描

七、运维监控体系

7.1 基础监控指标

指标类型 监控工具 告警阈值
CPU使用率 htop/nmon >85%持续5分钟
内存使用率 free -m >90%
磁盘I/O iostat >80%利用率
网络吞吐量 iftop >带宽上限80%

7.2 日志分析方案

  1. # 实时日志监控
  2. tail -f /var/log/nodejs/api.log | grep "ERROR"
  3. # 日志统计分析
  4. cat /var/log/nodejs/api.log | awk '{print $5}' | sort | uniq -c | sort -nr

八、持续改进建议

  1. 部署文档化
    • 维护DEPLOYMENT.md文件
    • 记录所有部署步骤与依赖关系
  2. 回滚机制
    • 保留最近3个成功部署版本
    • 制定快速回滚SOP
  3. 知识共享
    • 定期进行部署演练
    • 建立内部Wiki记录常见问题

通过系统化的手动部署流程,开发者可以获得对系统的完全掌控力,这在项目初期或需要高度定制化的场景中具有不可替代的价值。建议从简单项目开始实践,逐步完善部署规范,最终形成适合团队的标准化操作流程。