云计算百科
云计算领域专业知识百科平台

如何在腾讯云Ubuntu服务器上部署Node.js项目

最近弄了一个Node.js项目,包含前端用户前台,管理后台和服务端API服务三个项目,本地搭建好了,于是在腾讯云上新建了个Ubuntu 24.04服务器,想要将本地的Node.js项目部署上去,包括环境配置和数据库搭建。

本文主要讲解如何部署Node.js项目,通常需要以下步骤:

  • 服务器初始设置(创建用户,SSH配置,防火墙)

  • 安装Node.js和npm

  • 安装和配置数据库(MySQL/MongoDB)

  • 部署项目代码(通过Git或SCP)

  • 安装项目依赖,配置环境变量

  • 使用PM2管理进程

  • 配置Nginx反向代理(可选)

  • 配置SSL证书(可选)

  • 最终测试和故障排除


  • 现在,开始第一步,服务器初始设置。我们需要创建新用户、配置SSH密钥、更新系统包,并设置防火墙。

    第1步:服务器初始设置(安全与基础配置)

    1.1 登录服务器
    • 使用SSH登录到你的腾讯云服务器(替换your_username和your_server_ip):ssh root@your_server_ip

      📌 如果是首次登录,腾讯云可能要求你通过Web控制台重置root密码或使用SSH密钥。

    1.2 创建新用户(避免使用root)

    # 创建新用户(例如命名为deploy)
    sudo adduser deploy

    # 赋予sudo权限
    sudo usermod -aG sudo deploy

    # 切换到新用户
    su – deploy

    1.3 配置SSH密钥登录(提高安全性)
    • 本地机器操作:生成SSH密钥(如果已有可跳过):ssh-keygen -t ed25519
    • 将公钥上传到服务器(替换your_server_ip):ssh-copy-id deploy@your_server_ip
    • 禁用密码登录(可选但推荐):sudo nano /etc/ssh/sshd_config
      找到并修改:PasswordAuthentication no
      重启SSH服务:sudo systemctl restart sshd
    1.4 更新系统

    sudo apt update && sudo apt upgrade -y

    1.5 配置防火墙(UFW)

    sudo ufw allow OpenSSH # 允许SSH
    sudo ufw allow 80 # HTTP端口(后续Web服务)
    sudo ufw allow 443 # HTTPS端口
    sudo ufw enable # 启用防火墙
    sudo ufw status # 检查规则


    第2步:安装Node.js环境

    2.1 安装Node.js(推荐使用LTS版本)

    Ubuntu 24.04 默认仓库中的Node.js可能不是最新版本,建议通过NodeSource安装指定版本(以Node.js 18.x为例):

    # 下载并运行NodeSource安装脚本
    curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash

    # 安装Node.js和npm
    sudo apt install -y nodejs

    # 验证安装
    node -v # 应输出 v18.x.x
    npm -v # 应输出对应版本

    📌 如果需要其他版本(如20.x),替换脚本中的setup_18.x为setup_20.x,详见 NodeSource文档。


    2.2 安装PM2(进程管理工具)

    PM2 用于守护Node.js进程,确保应用崩溃或重启后自动运行:

    sudo npm install -g pm2

    # 验证安装
    pm2 –version


    2.3 配置项目依赖(可选,后续步骤会详细操作)

    如果已有项目的package.json,可提前安装依赖:

    # 假设项目目录为/home/deploy/app
    cd /home/deploy/app
    npm install –production


    好的!接下来是 第3步:部署代码到服务器。这一步需要将本地的Node.js项目代码上传到服务器的 /home/lifire 目录。以下是具体操作:


    第3步:部署代码到服务器

    3.1 将本地代码传输到服务器

    有两种常用方法:SCP(直接复制文件)或 Git(从仓库拉取)。选择其中一种方式操作。


    方法1:使用SCP传输文件(推荐简单项目)
    • 本地机器操作(替换/your/local/path为本地项目路径,your_server_ip为服务器IP):# 传输整个项目目录到服务器的 /home/lifire
      scp -r /your/local/project/path deploy@your_server_ip:/home/lifire/

      # 示例:
      # scp -r ./my-node-app deploy@123.45.67.89:/home/lifire/

      📌 输入服务器用户 deploy 的密码(如果配置了SSH密钥则无需密码)。


    方法2:使用Git克隆仓库(推荐已有Git管理的项目)
    • 服务器操作(确保已安装Git):# 安装Git
      sudo apt install git -y

      # 进入项目目录
      cd /home/lifire

      # 克隆你的Git仓库(替换为你的仓库URL)
      git clone https://github.com/yourusername/your-repo.git .

      # 如果是私有仓库,配置SSH密钥:
      # 1. 在服务器生成SSH密钥(一路回车):
      # ssh-keygen -t ed25519
      # 2. 将公钥 `cat ~/.ssh/id_ed25519.pub` 添加到GitHub/GitLab的SSH Keys设置中


    3.2 安装项目依赖
    • 服务器操作:# 进入项目目录
      cd /home/lifire

      # 安装依赖(根据项目实际情况选择)
      npm install # 安装所有依赖(开发+生产)
      # 或
      npm install –production # 仅安装生产依赖


    3.3 配置环境变量(如有需要)

    如果项目使用了环境变量(如数据库密码、API密钥),需在服务器配置:

    # 创建.env文件(示例)
    nano .env

    # 填写你的环境变量,例如:
    # DB_HOST=localhost
    # DB_USER=root
    # DB_PASSWORD=your_password

    按 Ctrl+O 保存,Ctrl+X 退出。


    3.4 启动项目(使用PM2守护进程)

    # 进入项目目录
    cd /home/lifire

    # 启动项目(假设入口文件为app.js)
    pm2 start app.js –name "my-node-app"

    # 设置PM2开机自启动
    pm2 save
    pm2 startup
    # 执行最后一行输出的命令(例如 `sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy –hp /home/deploy`)


    3.5 验证服务是否运行

    # 查看PM2进程列表
    pm2 list

    # 检查应用日志
    pm2 logs my-node-app

    如果看到应用正常启动且无报错,说明部署成功。


    3.6 开放应用端口(如3000、8080等)

    如果项目监听的是非80/443端口(例如3000),需开放防火墙:

    sudo ufw allow 3000
    sudo ufw reload


    第4步:配置MySQL数据库

    4.1 安装MySQL Server

    # 更新软件包列表
    sudo apt update

    # 安装MySQL Server
    sudo apt install mysql-server -y

    # 验证安装
    sudo systemctl status mysql

    • 如果状态显示 active (running),说明安装成功。

    4.2 运行安全配置脚本

    sudo mysql_secure_installation

    按提示操作:

  • 设置密码强度验证插件(建议选择 Y)。
  • 设置root用户密码(输入一个强密码并记住)。
  • 移除匿名用户(选择 Y)。
  • 禁止远程root登录(选择 Y)。
  • 移除测试数据库(选择 Y)。
  • 重新加载权限表(选择 Y)。

  • 4.3 登录MySQL并创建专用数据库和用户

    # 以root身份登录MySQL(使用刚设置的密码)
    sudo mysql -u root -p

    在MySQL命令行中执行以下操作(替换 your_db_name、your_db_user 和 your_db_password):

    — 创建数据库
    CREATE DATABASE your_db_name;

    — 创建专用用户并设置密码(推荐强密码)
    CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';

    — 授予用户对数据库的完全权限
    GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'localhost';

    — 刷新权限
    FLUSH PRIVILEGES;

    — 退出MySQL
    EXIT;


    4.4 配置MySQL允许远程访问(可选)

    如果Node.js应用与MySQL不在同一服务器,需开放远程访问(注意:仅限内网环境或配置IP白名单):

    # 修改MySQL配置文件
    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

    找到 bind-address 并修改为:

    bind-address = 0.0.0.0

    重启MySQL服务:

    sudo systemctl restart mysql

    然后开放防火墙端口:

    sudo ufw allow 3306


    4.5 在Node.js项目中配置数据库连接

    在项目的 .env 文件中添加数据库信息:

    DB_HOST=localhost
    DB_PORT=3306
    DB_USER=your_db_user
    DB_PASSWORD=your_db_password
    DB_NAME=your_db_name


    4.6 测试数据库连接

    在Node.js代码中,使用 mysql2 或 sequelize 等库测试连接:

    const mysql = require('mysql2/promise');

    async function testConnection() {
    const connection = await mysql.createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME
    });
    console.log('数据库连接成功!');
    await connection.end();
    }

    testConnection().catch(console.error);

    运行测试:

    node test-db.js

    如果输出 数据库连接成功!,说明配置正确。


    关键注意事项

  • 安全建议:
    • 不要使用root用户直接连接应用。
    • 生产环境避免开放MySQL到公网,建议通过内网或SSH隧道访问。
  • 备份数据库:mysqldump -u your_db_user -p your_db_name > backup.sql

  • 第5步:配置Nginx反向代理

    5.1 安装Nginx

    sudo apt install nginx -y
    sudo systemctl start nginx
    sudo systemctl enable nginx # 设置开机自启


    5.2 配置反向代理
  • 创建Nginx配置文件(替换 your_domain.com 为你的域名或服务器IP):

    sudo nano /etc/nginx/sites-available/your_domain.conf

  • 粘贴以下配置(假设Node.js运行在 127.0.0.1:3000):

    server {
    listen 80;
    server_name your_domain.com www.your_domain.com; # 无域名可改为 server_name _;

    location / {
    proxy_pass http://127.0.0.1:3000; # 转发到Node.js端口
    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 /static/ {
    alias /home/lifire/blog-server/static/;
    expires 30d;
    }

    # 错误页面配置
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    }

  • 保存并退出(Ctrl+O → Enter → Ctrl+X)。


  • 5.3 启用配置并测试

    # 创建符号链接到sites-enabled目录
    sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/

    # 测试Nginx配置语法
    sudo nginx -t # 应显示 "test is successful"

    # 重启Nginx
    sudo systemctl restart nginx


    5.4 配置防火墙(如果未开放80/443端口)

    sudo ufw allow 'Nginx Full' # 允许HTTP(80)和HTTPS(443)
    sudo ufw reload


    5.5 验证反向代理

    访问 http://your_domain.com 或 http://服务器IP,应显示Node.js应用页面。


    可选:配置HTTPS(Let’s Encrypt免费证书)

    5.6 安装Certbot

    sudo apt install certbot python3-certbot-nginx -y

    5.7 获取SSL证书

    sudo certbot –nginx -d your_domain.com -d www.your_domain.com

    按提示操作(输入邮箱、同意条款等),Certbot会自动修改Nginx配置并启用HTTPS。

    5.8 验证证书自动续签

    sudo certbot renew –dry-run # 模拟续签测试


    关键检查点

  • Nginx状态:

    systemctl status nginx # 确保状态为 "active (running)"

  • 防火墙规则:

    sudo ufw status # 确保80和443端口允许

  • Node.js应用监听地址: 确保Node.js应用绑定到 0.0.0.0 或 127.0.0.1,而非仅本地回环地址。例如:

    app.listen(3000, '0.0.0.0', () => {
    console.log('Server running on port 3000');
    });


  • 第6步:部署后的优化与监控

    6.1 启用PM2集群模式(提升性能)

    如果你的应用支持多进程,使用PM2集群模式充分利用多核CPU:

    # 停止现有应用
    pm2 delete blog-server-v2

    # 启动集群模式(假设使用4个进程)
    pm2 start app.js -i 4 –name "blog-server-v2"

    # 保存配置
    pm2 save


    6.2 配置日志轮转(防止日志占满磁盘)
  • 安装PM2日志轮转模块:

    pm2 install pm2-logrotate
    pm2 set pm2-logrotate:max_size 100M # 单个日志最大100MB
    pm2 set pm2-logrotate:retain 30 # 保留30个历史日志

  • 手动触发日志切割:

    pm2 flush # 清理旧日志


  • 6.3 设置基础监控
  • PM2内置监控:

    pm2 monit # 实时查看进程资源占用

  • 系统级监控(推荐安装htop):

    sudo apt install htop
    htop # 查看CPU、内存、进程详情


  • 6.4 配置自动化备份
  • 备份数据库(每日凌晨3点备份):

    # 创建备份脚本
    nano ~/backup-db.sh

    内容:

    #!/bin/bash
    mysqldump -u your_db_user -p'your_db_password' your_db_name > /home/deploy/backups/db_$(date +\\%Y\\%m\\%d).sql
    # 赋予执行权限
    chmod +x ~/backup-db.sh

    # 添加定时任务
    crontab -e

    添加一行:

    0 3 * * * /home/deploy/backup-db.sh

  • 备份项目代码(每周日备份):

    crontab -e

    添加:

    0 4 * * 0 tar -czf /home/deploy/backups/app_$(date +\\%Y\\%m\\%d).tar.gz /home/lifire/blog-server


  • 6.5 安全加固
  • 定期更新系统:

    # 配置自动安全更新
    sudo apt install unattended-upgrades
    sudo dpkg-reconfigure unattended-upgrades # 选择"Yes"

  • 防火墙加固:

    sudo ufw deny 3306 # 禁止MySQL默认端口暴露(如果之前开放过)
    sudo ufw limit OpenSSH # 防止SSH暴力破解


  • 6.6 配置健康检查端点(可选)

    在Node.js应用中添加一个健康检查路由:

    app.get('/health', (req, res) => {
    res.status(200).json({ status: 'ok', timestamp: Date.now() });
    });

    然后通过Nginx或外部监控服务定期访问 http://your_domain.com/health 确认应用存活。


    后续建议

  • 持续集成/部署(CI/CD): 可配置GitHub Actions或Jenkins,实现代码推送后自动部署。

  • 高级监控: 使用 Prometheus + Grafana 或 New Relic 监控应用性能。

  • 负载均衡: 流量大时,可在腾讯云添加多个服务器并使用负载均衡器。


  • 至此,你的Node.js应用已完成完整部署!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 如何在腾讯云Ubuntu服务器上部署Node.js项目
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!