首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Node.js 連接遠程 MySQL 完整配置指南:驅動安裝、權限授權、防火牆與 iptables 實戰

     編輯:MySQL 綜合教學

從零建立 Node.js 應用對遠端 MySQL 的穩定連線

Node.js 專案需讀寫遠端 Linux MySQL 時,常因權限、綁定地址、防火牆三大攔截而連線失敗。本文梳理 mysql2/mysql 驅動安裝、MySQL 用戶授權、bind-address 修改、Ubuntu iptables 開放 3306 及持久化規則的完整鏈路。

1. 安裝 Node.js MySQL 驅動

npm install mysql2 --save
# 或舊版驅動: npm install mysql --save

推薦 mysql2:支援 Promise/Prepared Statement、效能更好。

2. MySQL 服務端授權遠程連線

  1. 登入 MySQL:mysql -u root -p
  2. 建立/授權用戶 (兩種方式擇一):
    -- 方式 A: GRANT 授權 (5.7+ 推薦 CREATE USER 再 GRANT)
    CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
    GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'%';
    FLUSH PRIVILEGES;
    
    -- 方式 B: 直接修改 mysql.user 表 (不推薦,易遺漏 FLUSH)
    -- UPDATE user SET host='%' WHERE user='app_user';
    
  3. 關鍵:host='%' 允許任意 IP 連線;生產環境建議限定具體應用伺服器 IP (如 '10.0.1.%')。

3. 修改 MySQL 綁定地址 (預設僅 127.0.0.1)

vim /etc/mysql/my.cnf   # 或 /etc/my.cnf
# 找到 [mysqld] 區段
bind-address = 0.0.0.0
# 或註解掉 bind-address 行 (同效果)

重啟生效:systemctl restart mysql (或 service mysql restart)。

4. Ubuntu 12.04/14.04/16.04 iptables 防火牆開放 3306

  1. 檢查現有規則:iptables -L -n -v
  2. 新增允許規則 (假設資料庫網卡為 eth0):
    iptables -A INPUT -p tcp -i eth0 --dport 3306 -j ACCEPT
    
  3. 持久化規則 (重開機不失效):
    # 存規則
    iptables-save > /etc/iptables.rules
    # 編輯網卡啟動腳本
    vim /etc/network/interfaces
    # 在對應介面 (如 iface eth0 inet static) 下加入
    pre-up iptables-restore < /etc/iptables.rules
    

驗證:應用伺服器執行 telnet db_ip 3306 或 nc -zv db_ip 3306,顯示 Connected/succeeded 即通。

5. Node.js 連線代碼範例 (使用 mysql2 Promise API)

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

const pool = mysql.createPool({
  host: '192.168.1.100',
  port: 3306,
  user: 'app_user',
  password: 'StrongPass123!',
  database: 'mydb',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

// 使用
async function queryUsers() {
  try {
    const [rows] = await pool.execute('SELECT id, name FROM users WHERE status = ?', [1]);
    console.log(rows);
  } catch (err) {
    console.error('DB Error:', err);
  }
}
queryUsers();

常見排查清單

現象可能原因排查指令
ETIMEDOUT / ECONNREFUSED防火牆阻擋 / bind-address 錯誤 / 服務未啟動telnet ip 3306 / ss -ltnp | grep 3306
ER_ACCESS_DENIED_ERROR用戶/密碼錯、host 不匹配、未 FLUSH PRIVILEGESSELECT user,host FROM mysql.user;
ER_HOST_NOT_PRIVILEGED用戶 host 非 % 或具體 IPUPDATE user SET host='%' WHERE user='...'; FLUSH PRIVILEGES;
ER_BAD_DB_ERROR資料庫名拼錯或未建立SHOW DATABASES;

完成驅動安裝、授權、bind-address、防火牆四步驟,Node.js 即可穩定連線遠端 MySQL,建議生產環境再加上 SSL/TLS 加密連線 (ssl: {rejectUnauthorized: true}) 提升安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved