Node.js

Simpel Hosting 的 Node.js 主機可以提供您簡易使用,且具有彈性的方式來管理您的應用程式。

前置作業

  • 請先在您的電腦內安裝好 Node.js 與 NPM

  • 您的應用程式必須使用 NPM 來管理套件相依性

版本支援

目前 Node.js 的主機已經安裝 Node.js 10 LTS 版本。您可以自行選擇其他版本的 Node.js 與 npm 套件管理軟體。

請查閱下方 Node 版本管理員章節來了解如何變更版本。

基本功能

您的 Node.js 應用程式至少必須包含一個 server.js 的檔案,但建議是使用 package.json 來管理套件與程式進入點。

當主機啟動時,或是您用 git+ssh 佈署應用程式後,就會開始執行此程式進入點。

為了要接收 HTTP 與 HTTPS 的連線,您的應用程式必須建立連線埠,請依照環境變數的 PORT 建立,或是可以在 Node.js 中使用 process.env.PORT

在您建立主機時就有一個域名可以進行連結測試。此外,您可以將不同域名或是子域名同時連結到您的 Node.js 應用程式。

初始化

Simple Hosting 會依照下列步驟初始化您的應用程式:

  1. 使用 package.json 當作初始化命令稿

  2. 使用 package.json 中定義的 main 當作程式進入點

  3. 如果根目錄中存在 server.js 當,則使用此程式進入點

請查閱下方的說明來了解更多。

使用 package.json (建議)

使用 npm 的 package.json 是起始 Node.js 應用程式的標準步驟。Simple Hosting 過去不支援此模式,但我們現在強烈建議使用該方法。

package.json 必須放置在根目錄的位置。內容必須包含 package.json["main"] 指定程式進入點,或是使用 package.json["scripts"]["start"] 指定起始命令稿。

大部分套裝的 Node.js 應用程式,像是 Ghost,都是使用這種方式,就很容易進行安裝。

定義程式進入點

您可以定義 main 欄位來自訂程式進入點,Simple Hosting 將會用 node 指令執行此程式。

例如,您想要使用 index.js 當作程式進入點:

package.json

{
  "name" : "foo",
  "version" : "1.2.3",
  "description" : "A packaged foo fooer for fooing foos",
  "main" : "index.js",
}

自訂起始命令稿

您可以使用 ['scripts']['start'] 來自訂起始命令稿。Simple Hosting 會在開機時自動執行此定義的程式。

下方範例等同於上述範例的程式進入點:

package.json

{
  "name" : "foo",
  "version" : "1.2.3",
  "description" : "A packaged foo fooer for fooing foos",
  "scripts": {
    "start": "node index.js"
  }
}

使用啟動命令稿來初始應用程式可以非常靈活,您可以自訂任何一種啟動的方式,譬如您可以在 harmony 模式下啟動 ES6。

package.json

{
  "name" : "foo-ecma-script",
  "version" : "6",
  "description" : "ES6 on Simple Hosting",
  "engines": {
    "node": "6"
  },
  "scripts": {
    "start": "node --harmony index.js"
  }
}

結合環境變數後,您就可以使用像是 pm2 這種程序控制器,或是手動控制您應用程式的生命週期。甚至使用像 libuv 等有趣的功能。

使用 server.js

最簡單的方式之一就是在您的專案根目錄中建立一個名為 server.js 的程式檔。如果您都沒有提供上述的起始設定,主機會嘗試執行此程式,以啟動您的應用程式。

環境變數

您的應用程式可以讀取到由主機或是您自己所建立的環境變數來進行自訂化設定。

以下範例是您的應用程式啟動之前就已經設定好的環境變數。

PORT=8080
NODE_ENV=production
WEB_MEMORY=128
WEB_CONCURRENCY=2

備註

WEB_MEMORYWEB_CONCURRENCY 是依照您的主機規格 (S、M、L、XL、XXL) 所決定。前者是您所選規格的最大值,後者是我們依照規格所設定的建議,但您仍可以根據您的需要進行調整。

存取環境變數

您可以使用 process.env 來在您的應用程式中直接存取環境變數,例如:

var port = process.env.PORT;
console.log(process.env.PORT);
// => 8080

設定環境變數

您可以設定 (或覆寫編輯) 環境變數,從應用程式或是使用起始命令稿。

在應用程式中,您可以使用 process.env 來直接設定環境變數,例如:

process.env.NODE_ENV = "staging";
console.log(process.env.NODE_ENV); // => "staging"

在開機時使用 package.json['scripts']['start'] 來設定環境變數,例如:

package.json

{
...
  "scripts": {
    "start": "NODE_ENV=staging node index"
  }
}

請確保您沒有覆寫 PORT 環境變數,這樣您的應用程式網路可能就會斷線。通常,在覆寫環境變數之前,請確認您沒有覆寫到重要的設定。

相依套件管理

Node.js 的 Simple Hosting 主機會在您使用 git+ssh 佈署程式碼的時候,負責安裝套件相依性。您只需要在專案中的 package.json 檔中註明相依套件即可:

package.json

{
  "name": "website",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.x"
  }
}

選擇 Node.js 版本

您可以透過 Node 版本管理員 (nvm) 來選擇 Node.js 與 npm 的版本。

您只需要在 package.json 中指定您要使用的版本即可,例如:

package.json

{
  "engines": {
    "node": "6",
    "npm": "*"
  }
}

上述的範例會強制使用 Node.js 6.x 的版本。關於更多 engines 的說明,請參閱:https://docs.npmjs.com/files/package.json#engines

您也可以前往 Node.js 的官方網站來查閱最新的版本相關說明。

Websockets

目前 Simple Hosting 無法支援 Websocket。如果您需要此功能,請透過 feedback@gandi.net 將您的需求告訴我們,謝謝。

日誌檔

您的應用程式所產生的輸出訊息與錯誤都會儲存在硬碟內,您可以查閱訊息來為您的應用程式除錯。

  • 使用 SSH 登入時,路徑在: /srv/data/var/log/www/nodejs.log

  • 使用 SFTP 登入時,路徑在: /lamp0/var/log/www/nodejs.log

此日誌檔同樣包含了 NPM 所輸出的訊息。

另外,您可以查看下列檔案來查詢您的應用程式佈署時的歷史訊息:

  • 使用 SSH 登入時,路徑在: /srv/data/var/log/www/nodejs-watchd.log

  • 使用 SFTP 登入時,路徑在: /lamp0/var/log/www/nodejs-watchd.log

您可以透過此檔案來知道您的應用程式是否正確啟動。

資料庫

MySQL

Simple Hosting 的 Node.js 主機可以支援 MySQL 5.7 (Percona)。

您可以透過 Unix Socket 來連接資料庫,路徑在 /srv/run/mysqld/mysqld.sock。預設的帳號是 root 並且沒有密碼。但是,您應該為您的應用程式額外自訂一組帳號密碼。您可以使用 default_db 這個資料庫來進行一些測試,此資料庫在主機建立時就已自動建立。

您可以建立無數量限制的資料庫; 唯一的限制就是您的硬碟大小,您可以隨時增加硬碟大小,最大可支援 1TB。

您可以使用 SSH 終端機登入主機並且使用預設的命令 (mysqlmysqldump) 來管理資料庫,或是使用網頁的 phpMyAdmin 工具。請查閱 Simple Hosting 的 MySQL 管理工具頁面。

下方的小型 Node.js 程式碼可以測試 Simple Hosting 上的 MySQL 資料庫連線是否正常:

index.js

var http = require('http'),
    mysql = require('mysql');

var mysql_conn = mysql.createConnection({
  socketPath: '/srv/run/mysqld/mysqld.sock',
  database: 'default_db',
  user: 'root',
  password: ''
});

var test_mysql_conn = function(callback) {
  mysql_conn.connect(function(err) {
    if (err) {
      console.log(err.code);
      if (callback) callback("NOT WORKING");
    } else {
      console.log('connected...');
      if (callback) callback("OK");
    }
  });
  mysql_conn.end();
};

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_mysql_conn(function(mysql_status) {
    res.write('MySQL connection: ' + mysql_status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-mysql-app",
  "version": "1.0.0",
  "description": "Sample Node.js MySQL app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "4"
  },
  "dependencies": {
    "mysql": "*"
  }
}

PostgreSQL

Simple Hosting 上可以使用 PostgreSQL 9.6 的版本。

您可以透過 Simple Hosting 上的 5432 埠連接到 PostgreSQL 。

您可以透過預設的 hosting-db 使用者名稱 (不需要密碼) 來連結到 postgres 預設資料庫。但您應該為您的應用程式建立各別的帳號與密碼。

您可以建立無上限的使用者與資料庫,唯一的限制是您的硬碟大小,您可以隨時增加硬碟,最高可到 1TB。

您可以使用 SSH 終端機登入後使用命令 (psqlpg_dump, 等) 來管理 PostgreSQL 資料庫,或是使用網頁介面的 phpPgAdmin。

下方的小型 Node.js 程式碼可以測試 Simple Hosting 上的 PostgreSQL 資料庫連線是否正常:

index.js

var http = require('http'),
    pg = require('pg');

var pg_url = "tcp://hosting-db@localhost/postgres";
var pg_conn = new pg.Client(pg_url);

var test_pg_conn = function(callback) {
  pg_conn.connect(function(err) {
    if (err) {
      console.log(err);
      if (callback) callback("NOT WORKING");
    } else {
      console.log('Connected to PostgreSQL');
      if (callback) callback("OK");
    }
  });
};

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_pg_conn(function(pg_status) {
    res.write('PostgreSQL connection: ' + pg_status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-pgsql-app",
  "version": "1.0.0",
  "description": "Sample Node.js PostgreSQL app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "4"
  },
  "dependencies": {
    "pg": "*"
  }
}

MongoDB

Simple Hosting 上可以使用 MongoDB 3.2 的版本。

您可以透過 Simple Hosting 上的 27017 埠連接到 MongoDB 。預設沒有帳號密碼,但您應該為您的應用程式自訂一組獨立的帳號與密碼。

您可以建立無上限的使用者與資料庫,唯一的限制是您的硬碟大小,您可以隨時增加硬碟,最高可到 1TB。

您可以使用 SSH 終端機登入後使用命令 mongo 來管理資料庫,或是從控制台中使用 Adminer。

下方的小型 Node.js 程式碼可以測試 Simple Hosting 上的 MongoDB 資料庫連線是否正常:

index.js

var http = require ("http"),
    mongo = require("mongodb");

var mongo_url = "mongodb://localhost:27017/sample";
var mongo_conn = mongo.MongoClient;

var test_mongo_conn = function(callback) {
  mongo_conn.connect(mongo_url, function(err, db) {
    if (err) {
      console.log(err);
      if (callback) callback("NOT WORKING");
    } else {
      console.log("Connected to server.");
      if (callback) callback("OK");
    }
    if (db) db.close();
  });
};

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_mongo_conn(function(status) {
    res.write('MongoDB connection: ' + status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-mongodb-app",
  "version": "1.0.0",
  "description": "Sample Node.js MongoDB app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "4"
  },
  "dependencies": {
    "mongodb": "*"
  }
}

您可以參考此文章來了解 MongoDB 與 Node.js 的使用:https://docs.mongodb.org/getting-started/node/

參考資料