最近弄了一個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
重啟SSH服務:PasswordAuthentication no
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應用已完成完整部署!