如何在騰訊云Ubuntu服務器上部署Node.js項目

最近弄了一個Node.js項目,包含前端用戶前臺,管理后臺和服務端API服務三個項目,本地搭建好了,于是在騰訊云上新建了個Ubuntu 24.04服務器,想要將本地的Node.js項目部署上去,包括環境配置和數據庫搭建。

本文主要講解如何部署Node.js項目,通常需要以下步驟:

  1. 服務器初始設置(創建用戶,SSH配置,防火墻)

  2. 安裝Node.js和npm

  3. 安裝和配置數據庫(MySQL/MongoDB)

  4. 部署項目代碼(通過Git或SCP)

  5. 安裝項目依賴,配置環境變量

  6. 使用PM2管理進程

  7. 配置Nginx反向代理(可選)

  8. 配置SSL證書(可選)

  9. 最終測試和故障排除


現在,開始第一步,服務器初始設置。我們需要創建新用戶、配置SSH密鑰、更新系統包,并設置防火墻。

第1步:服務器初始設置(安全與基礎配置)

1.1 登錄服務器
  • 使用SSH登錄到你的騰訊云服務器(替換your_usernameyour_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.xsetup_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

按提示操作:

  1. 設置密碼強度驗證插件(建議選擇 Y)。
  2. 設置root用戶密碼(輸入一個強密碼并記住)。
  3. 移除匿名用戶(選擇 Y)。
  4. 禁止遠程root登錄(選擇 Y)。
  5. 移除測試數據庫(選擇 Y)。
  6. 重新加載權限表(選擇 Y)。

4.3 登錄MySQL并創建專用數據庫和用戶
# 以root身份登錄MySQL(使用剛設置的密碼)
sudo mysql -u root -p

在MySQL命令行中執行以下操作(替換 your_db_nameyour_db_useryour_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代碼中,使用 mysql2sequelize 等庫測試連接:

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

如果輸出 數據庫連接成功!,說明配置正確。


關鍵注意事項

  1. 安全建議
    • 不要使用root用戶直接連接應用。
    • 生產環境避免開放MySQL到公網,建議通過內網或SSH隧道訪問。
  2. 備份數據庫
    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 配置反向代理
  1. 創建Nginx配置文件(替換 your_domain.com 為你的域名或服務器IP):

    sudo nano /etc/nginx/sites-available/your_domain.conf
    
  2. 粘貼以下配置(假設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;}
    }
    
  3. 保存并退出Ctrl+OEnterCtrl+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.comhttp://服務器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  # 模擬續簽測試

關鍵檢查點

  1. Nginx狀態

    systemctl status nginx  # 確保狀態為 "active (running)"
    
  2. 防火墻規則

    sudo ufw status  # 確保80和443端口允許
    
  3. Node.js應用監聽地址
    確保Node.js應用綁定到 0.0.0.0127.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 配置日志輪轉(防止日志占滿磁盤)
  1. 安裝PM2日志輪轉模塊

    pm2 install pm2-logrotate
    pm2 set pm2-logrotate:max_size 100M  # 單個日志最大100MB
    pm2 set pm2-logrotate:retain 30     # 保留30個歷史日志
    
  2. 手動觸發日志切割

    pm2 flush  # 清理舊日志
    

6.3 設置基礎監控
  1. PM2內置監控

    pm2 monit  # 實時查看進程資源占用
    
  2. 系統級監控(推薦安裝htop

    sudo apt install htop
    htop  # 查看CPU、內存、進程詳情
    

6.4 配置自動化備份
  1. 備份數據庫(每日凌晨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
    
  2. 備份項目代碼(每周日備份):

    crontab -e
    

    添加:

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

6.5 安全加固
  1. 定期更新系統

    # 配置自動安全更新
    sudo apt install unattended-upgrades
    sudo dpkg-reconfigure unattended-upgrades  # 選擇"Yes"
    
  2. 防火墻加固

    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 確認應用存活。


后續建議

  1. 持續集成/部署(CI/CD)
    可配置GitHub Actions或Jenkins,實現代碼推送后自動部署。

  2. 高級監控
    使用 Prometheus + Grafana 或 New Relic 監控應用性能。

  3. 負載均衡
    流量大時,可在騰訊云添加多個服務器并使用負載均衡器。


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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77804.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國產AI新突破!全球首款無限時長電影生成模型SkyReels-V2開源:AI視頻進入長鏡頭時代!

在 AI 技術日新月異的今天,我們再次見證了歷史性的突破。 昆侖萬維 SkyReels 團隊于近日正式發布了全球首款支持無限時長的電影生成模型——SkyReels-V2,并免費開源。這無疑為 AI 視頻領域掀開了嶄新的一頁,標志著 AI 視頻正式邁入長鏡頭時代…

SpringAI系列 - MCP篇(一) - 什么是MCP

目錄 一、引言二、MCP核心架構三、MCP傳輸層(stdio / sse)四、MCP能力協商機制(Capability Negotiation)五、MCP Client相關能力(Roots / Sampling)六、MCP Server相關能力(Prompts / Resources / Tools)一、引言 之前我們在接入大模型時,不同的大模型通常都有自己的…

一個很簡單的機器學習任務

一個很簡單的機器學習任務 前言 基于線上colab做的一個簡單的案例,應用了線性回歸算法,預測了大概加州3000多地區的房價中位數 過程 先導入了Pandas,這是一個常見的Python數據處理函數庫 用Pandas的read_csv函數把網上一個共享數據集&…

【第十六屆 藍橋杯 省 C/Python A/Java C 登山】題解

題目鏈接:P12169 [藍橋杯 2025 省 C/Python A/Java C] 登山 思路來源 一開始想的其實是記搜,但是發現還有先找更小的再找更大的這種路徑,所以這樣可能錯過某些最優決策,這樣不行。 于是我又想能不能從最大值出發往回搜&#xf…

軟件工程師中級考試-上午知識點總結(上)

我總結的這些都是每年的考點,必須要記下來的。 1. 計算機系統基礎 1.1 碼 符號位0表示正數,符號位1表示負數。補碼:簡化運算部件的設計,最適合進行數字加減運算。移碼:與前幾種不同,1表示,0表…

Python Cookbook-6.7 有命名子項的元組

任務 Python 元組可以很方便地被用來將信息分組,但是訪問每個子項都需要使用數字索引,所以這種用法有點不便。你希望能夠創建一種可以通過名字屬性訪問的元組。 解決方案 工廠函數是生成符合要求的元組的子類的最簡單方法: #若在2.4中可使用operator…

win10設置軟件開機自啟

參考教程:windows10應用程序設置了開機啟動,但沒有自啟_win10軟件設置了自啟動但是不能自啟動-CSDN博客 主要設置是安全策略:

自注意力機制、多頭自注意力機制、填充掩碼 Python實現

原理講解 【Transformer系列(2)】注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制超詳細講解 自注意力機制 import torch import torch.nn as nn# 自注意力機制 class SelfAttention(nn.Module):def __init__(self, input…

【大模型】Browser-Use AI驅動的瀏覽器自動化工具

Browser-Use AI驅動的瀏覽器自動化工具 1. 項目概述2. 核心架構3. 實戰指南3.1 環境安裝3.2 快速啟動3.3 進階功能 4. 常見問題與解決5. 項目優勢與局限6. 擴展資源7. 總結 1. 項目概述 項目地址:browser-use Browser-Use 是一個開源工具,旨在通過 AI 代…

ubuntu20.04安裝安裝x11vnc服務基于gdm3或lightdm這兩種主流的顯示管理器。

前言:在服務端安裝vnc服務,可以方便的遠程操作服務器,而不用非要插上顯示器才行。所以在服務器上安裝vnc是很重要的。在ubuntu20中,默認的顯示管理器已經變為gdm3,它可以帶來與 GNOME 無縫銜接的體驗,強調功…

用銀河麒麟 LiveCD 快速查看原系統 IP 和打印機配置

原文鏈接:用銀河麒麟 LiveCD 快速查看原系統 IP 和打印機配置 Hello,大家好啊!今天給大家帶來一篇在銀河麒麟操作系統的 LiveCD 或系統試用鏡像環境下,如何查看原系統中電腦的 IP 地址與網絡打印機 IP 地址的實用教程。在系統損壞…

C++——STL——容器deque(簡單介紹),適配器——stack,queue,priority_queue

目錄 1.deque(簡單介紹) 1.1 deque介紹: 1.2 deque迭代器底層 1.2.1 那么比如說用迭代器實現元素的遍歷,是如何實現的呢? 1.2.2 頭插 1.2.3 尾插 1.2.4 實現 ?編輯 1.2.5 總結 2.stack 2.1 函數介紹 2.2 模…

Java并發編程-線程池

Java并發編程-線程池 線程池運行原理線程池生命周期線程池的核心參數線程池的阻塞隊列線程池的拒絕策略線程池的種類newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool 創建線程池jdk的Executors(不建議,會導致OOM)jdk的ThreadP…

【前沿】成像“跨界”測量——掃焦光場成像

01 背景 眼睛是人類認識世界的重要“窗口”,而相機作為眼睛的“延伸”,已經成為生產生活中最常見的工具之一,廣泛應用于工業檢測、醫療診斷與影音娛樂等領域。傳統相機通常以“所見即所得”的方式記錄場景,傳感器捕捉到的二維圖像…

TM1640學習手冊及示例代碼

數據手冊 TM1640數據手冊 數據手冊解讀 這里我們看管腳定義DIN和SCLK,一個數據線一個時鐘線 SEG1~SEG8為段碼,GRID1~GRID16為位碼(共陰極情況下) 這里VDD給5V 數據指令 數據命令設置 地址命令設置 顯示控制命令 共陰極硬件連接圖…

uni-app 開發企業級小程序課程

課程大小:7.7G 課程下載:https://download.csdn.net/download/m0_66047725/90616393 更多資源下載:關注我 備注:缺少兩個視頻5-14 tabs組件進行基本的數據展示和搜索歷史 處理searchData的刪除操作 1-1導學.mp4 2-10小程序內…

判斷點是否在多邊形內

代碼段解析: const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); 第一部分:(yi > y) !== (yj > y) 作用:檢查點 (x,y) 的垂直位置是否跨越多邊形的當前邊。 yi > y 和 yj > y 分別檢查邊的兩個端…

【redis】集群 如何搭建集群詳解

文章目錄 集群搭建1. 創建目錄和配置2. 編寫 docker-compose.yml完整配置文件 3. 啟動容器4. 構建集群超時 集群搭建 基于 docker 在我們云服務器上搭建出一個 redis 集群出來 當前節點&#xff0c;主要是因為我們只有一個云服務器&#xff0c;搞分布式系統&#xff0c;就比較…

[langchain教程]langchain03——用langchain構建RAG應用

RAG RAG過程 離線過程&#xff1a; 加載文檔將文檔按一定條件切割成片段將切割的文本片段轉為向量&#xff0c;存入檢索引擎&#xff08;向量庫&#xff09; 在線過程&#xff1a; 用戶輸入Query&#xff0c;將Query轉為向量從向量庫檢索&#xff0c;獲得相似度TopN信息將…

C語言復習筆記--字符函數和字符串函數(下)

在上篇我們了解了部分字符函數及字符串函數,下面我們來看剩下的字符串函數. strstr 的使用和模擬實現 老規矩,我們先了解一下strstr這個函數,下面看下這個函數的函數原型. char * strstr ( const char * str1, const char * str2); 如果沒找到就返回NULL指針. 下面我們看下它的…