さくらのVPSを使ってnode.jsサーバーを立ち上げる手順です。KUSANAGIを使うことで作業量が大分少なくなります。
- ドメインの準備
- KUSANAGIのインストール
- KUSANAGIの初期化
- KUSANAGIプロビジョンの設定
- node.jsのインストール
- npmの初期化
- モジュールのインストール( express & forever )
- app.jsの作成
- 起動と確認
- リバースプロキシとクロスドメイン対策
- node.jsのデーモン化(常駐化)
1.ドメインの準備
事前にこれから立ち上げるnodeサーバー用のドメインを用意し、さくらのドメイン管理ページよりVPSサーバーのIPアドレスへ飛ぶよう設定しておきます。
作業の詳細は以下のページを参考に行って下さい。
ドメインのゾーン編集-さくらのサポート情報
2.KUSANAGIのインストール
VPSのOSをKUSANAGIとします。
KUSANAGIは本来Wordpress運用に特化したOSなのですが、LAMP環境(実際にはApatchではなくnginxなのでLEMP環境ですが)もコマンドひとつで立ち上げることがでます。
またLet’s Encryptによる無料https対応と、https契約の自動更新機能がとても便利なのでKUSANAGIを使います。
手軽さが画期的です。
3.KUSANAGIの初期化
KUSANAGIのオフィシャルドキュメントに沿って初期化を行います。
https://kusanagi.tokyo/document/kusanagi-init/
ドキュメントがわかりやすく解説しているのでこまかな手順は省きますが、初期化作業の後半では「kusanagi init」コマンドで対話形式の入力作業がありますので、以下の項目を事前に考えておくといいかと思います。
- kusanagiユーザーのパスワード
- SSHユーザ鍵のパスフレーズ(省略可)
- MySQL rootパスワード
4.KUSANAGIプロビジョンの設定
ひとつのVPSで複数のサイトやWordpressを運用できるよう、KUSANAGIでは各サイトを「プロビジョン」という単位で管理しています。
こちらもオフィシャルドキュメントを参考にプロビジョンの新規作成を行ってください。
https://kusanagi.tokyo/document/kusanagi-provision/
LAMP環境でプロビジョンを新規作成する場合のコマンドは以下のとおりです。
kusanagi provision --lamp プロファイル名
ここで、Wordpressサイトを立ち上げるのか通常のLAMP環境にするのかを選べるのですが、SSL対応サイトが1分程度で立ち上がるのは感動です。
入力の必要な項目は以下のとおりです。
- ホスト名(手順0で準備したドメイン名)
- 管理者メールアドレス(Let’s Encryptからのメール通知受信用)
- データベース名
- データベースユーザー名
- データベースパスワード
5.node.jsのインストール
node.jsをインストールします。こちらはyumでインストールできますが、だいぶ古いバージョンがインストールされてしまうので、nodesourceのレポジトリを追加してからインストールします。
curl -sL https://rpm.nodesource.com/setup_12.x | bash -
レポジトリを追加したら、yumでインストールします。
yum install -y nodejs
6.npmの初期化
node.jsはnpmという仕組みでパッケージ(追加機能)を管理しています。サイトディレクトリ内で初期化作業を行い、必要なディレクトリーやファイルなどを作成してもらいます。
これはサーバーに対して行うのではなく、サイト単位(プロビジョン単位)で行いますので、まずはサイトのルートディレクトリに移動します。
cd /home/kusanagi/プロビジョン名/DocumentRoot/
初期化コマンドを入力し、対話形式で必要事項を設定していきます。
npm init
入力する項目にはそれほど意味はないです。
ほとんど初期値を用い(Enterキーを押すだけ)、気になる項目だけ適宜入力すればOKです。
これらの入力をもとにpackage.jsonという管理ファイルができますが、テキストエディタなどで後から書き直すことができるので気にせず。
7.モジュールのインストール( express & forever )
マイAPI稼働のために最低必要なモジュールは以下の2つです。
- express ( フレームワーク )
- forever ( 常時稼働用モジュール )
expressはnode.jsをアプリサーバーとして使うときの鉄板フレームワークモジュールで、foreverはスクリプトをデーモン化(常時稼働)させるためのモジュールです。
インストールするには「npm install モジュール名 –save」コマンドを使いますが、foreverモジュールのみグローバルオプションを付けます。
npm install express --save
npm install -g forever --save
グローバルオプション「-g」を付けるのは、foreverコマンドをどの階層でも使えるようにするためです。
8.app.jsの作成
APIとしての処理を行うJavascriptファイルを用意し、「DocumentRoot」ディレクトリ内にアップロードします。
例えば以下のような内容になるかと思います。
// express
const express = require('express');
const app = express();
// GET
app.get('/', (req, res) => {
res.send('Hello World!');
});
// listen
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});
9.起動と確認
「DocumentRoot」ディレクトリ内から以下のコマンドでサーバーを起動します。
node start app.js
ここでブラウザから「https://ホスト名:3000」でアクセスし、「Hello, World!」と表示されたらOKです。
起動中はシェルがコマンドを受け付けなくなるので、終了させたいときには「Ctrl+C」でnode.jsサーバーを停止させます。
10.リバースプロキシとクロスドメイン対策
上記のapp.jsでは3000番ポートでアクセスをListenしているのですが、アドレスに「:3000」を入れなくてもアクセスできるよう、nginxにプロキシ設定を行います。
ついでに、別ドメインからのアクセスも許可するようCORS設定も行います。
これらの設定はnginxのconfファイルに書き込むのですが、http用とhttps用の設定ファイルが別々に用意されているので、これらふたつのファイルに対して同じ記述を追記します。
まずは設定ファイルのあるディレクトリへ移動し、lsコマンドで設定ファイルの名前を確認します。
cd /etc/nginx/conf.d/
ls
設定ファイルは「プロビジョン名_http.conf」と「プロビジョン名_ssl.conf」のふたつがあるかと思うので、それぞれのファイルをviコマンドで開いて編集します。
http.confの場合には、以下のコマンドでファイルを開きます。
vi プロビジョン名_http.conf
「location /」ではじまる箇所を探し出し、以下の様に追記します。
location / {
try_files $uri $uri/ /index.php?$args;
add_header Access-Control-Allow-Origin *;
proxy_pass http://サーバーのIPアドレス:3000;
}
add_headerの行がクロスドメイン対策、proxy_passの行がリバースプロキシ設定です。
同様の記述を「プロビジョン名_ssl.conf」にも行って下さい。
※proxy_passのアドレスは、ssl.confファイルの設定でも「http://」(sなし)からはじめます。
以下のコマンドでnginxを再起動させます。
kusanagi nginx
11.node.jsのデーモン化(常駐化)
動作確認では「node app.js」コマンドでサーバーを起動したのですが、そうするとシェルがコマンドを受け付けなくなるので、「forever」モジュールを使い起動し常駐させます。
「forever」モジュールはすでにインストール済みなので、app.jsを実行する際には、今後は以下のコマンドを利用します。
forever start app.js
起動しているかの確認は
forever list
です。
終了させたい場合には、上記のforever listコマンドで終了させたいjsファイルのid番号をしらべ(0からはじまる連番です)、以下のコマンドで終了させます。
forever stop 番号
最後に
これですべての設定が終わりです。PHPだと普通のレンタルサーバーにファイルをひとつアップロードすれば終わりなので、だいぶ手間が多いですかね?
でも、これで使い慣れたJavascriptを使って複雑な処理をこなすAPIも設置できるので、ぜひ試してみて下さい。
つらいサーバー設定をほぼすべてやってくれるKUSANAGIに感謝です。