Node.js Tips

アプリケーションを常時起動させて、Webアプリケーションとして機能させよう

ちょっとした小技で効率UP——アプリケーションをデーモン化〈Node.jsシリーズ vol.7〉

これまで6回に渡ってNode.jsの魅力を解説してきたこの連載。今回はこれまでの連載では伝えられなかったNode.jsの細部を解説します。

Node.jsの連載第1回目でも述べましたが、Node.jsは「サーバーサイドJavaScript」です。

これまでさまざまな形のサーバースクリプトを書いては走らせてきましたが、実行はいずれもnode (ファイル名)というコマンドを打たなければいけませんでした。

書いたスクリプトをサーバー上で継続動作させるためには、デーモン化したいところ。
そのための便利な仕組みがforeverです。

foreverは、既存のスクリプトをデーモン化するツールです。

この仕組みを使うと、スクリプトを自動起動したり、何らかのエラーで途中終了してしまった場合の再起動といった処理を自動で行なってくれます。

それではさっそくインストールしてみましょう。

foreverのインストール

npm経由でのインストールが便利です。 今回は$ sudo npm install -g foreverとして、sudo権限、かつ-gオプションでグローバルインストールにしましょう。

これで完了です。

Node.jsスクリプトをデーモンとして立ち上げる

Node.jsスクリプトをデーモンとして起動するのも簡単です。
試しに、以前作成した簡単なチャットサーバー$ forever start app.jsとしてforeverで起動してみましょう。

startの部分をstopに変えればデーモン停止、restartに変えればデーモン再起動です。

この値、設定していないけどいいの?というwarnが出ますが、-sオプション(メッセージを標準出力に出さない)を設定することで出なくなります。

パラメーターの種類については、オプションを付けないforeverコマンドで一覧することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
help:    usage: forever [action] [options] SCRIPT [script-options]
help:
help:    Monitors the script specified in the current process or as a daemon
help:
help:    actions:
help:      start               Start SCRIPT as a daemon
help:      stop                Stop the daemon SCRIPT by Id|Uid|Pid|Index|Script
help:      stopall             Stop all running forever scripts
help:      restart             Restart the daemon SCRIPT
help:      restartall          Restart all running forever scripts
help:      list                List all running forever scripts
help:      config              Lists all forever user configuration
help:      set <key> <val>     Sets the specified forever config <key>
help:      clear <key>         Clears the specified forever config <key>
help:      logs                Lists log files for all forever processes
help:      logs <script|index> Tails the logs for <script|index>
help:      columns add <col>   Adds the specified column to the output in `forever list`
help:      columns rm <col>    Removed the specified column from the output in `forever list`
help:      columns set <cols>  Set all columns for the output in `forever list`
help:      columns reset       Resets all columns to defaults for the output in `forever list`
help:      cleanlogs           [CAREFUL] Deletes all historical forever log files
help:
help:    options:
help:      -m  MAX          Only run the specified script MAX times
help:      -l  LOGFILE      Logs the forever output to LOGFILE
help:      -o  OUTFILE      Logs stdout from child script to OUTFILE
help:      -e  ERRFILE      Logs stderr from child script to ERRFILE
help:      -p  PATH         Base path for all forever related files (pid files, etc.)
help:      -c  COMMAND      COMMAND to execute (defaults to node)
help:      -a, --append     Append logs
help:      -f, --fifo       Stream logs to stdout
help:      -n, --number     Number of log lines to print
help:      --pidFile        The pid file
help:      --uid            Process uid, useful as a namespace for processes (must wrap in a string)
help:                       e.g. forever start --uid "production" app.js
help:                           forever stop production
help:      --sourceDir      The source directory for which SCRIPT is relative to
help:      --workingDir     The working directory in which SCRIPT will execute
help:      --minUptime      Minimum uptime (millis) for a script to not be considered "spinning"
help:      --spinSleepTime  Time to wait (millis) between launches of a spinning script.
help:      --colors         --no-colors will disable output coloring
help:      --plain          alias of --no-colors
help:      -d, --debug      Forces forever to log debug output
help:      -v, --verbose    Turns on the verbose messages from Forever
help:      -s, --silent     Run the child script silencing stdout and stderr
help:      -w, --watch      Watch for file changes
help:      --watchDirectory Top-level directory to watch from
help:      --watchIgnore    To ignore pattern when watch is enabled (multiple option is allowed)
help:      --killSignal     Support exit signal customization (default is SIGKILL)
help:                       used for restarting script gracefully e.g. --killSignal=SIGTERM
help:      -h, --help       You're staring at it
help:
help:    [Long Running Process]
help:      The forever process will continue to run outputting log messages to the console.
help:      ex. forever -o out.log -e err.log my-script.js
help:
help:    [Daemon]
help:      The forever process will run as a daemon which will make the target process start
help:      in the background. This is extremely useful for remote starting simple node.js scripts
help:      without using nohup. It is recommended to run start with -o -l, & -e.
help:      ex. forever start -l forever.log -o out.log -e err.log my-daemon.js
help:          forever stop my-daemon.js
help:

サーバー再起動時にデーモンが立ち上がるよう設定する

せっかくデーモン化したので、サーバーを再起動しても自動的に立ち上がるようにしましょう。

一般的なLinux環境であれば/path/to/forever start -l /path/to/logfile.log -a /path/to/chat_server.jsrc.localに起動スクリプトを書いておくのが便利です。

-lオプションでログファイルを指定し、さらにその後ろに-aオプションでログファイルへの追記を明示します。

上のコマンドは一番シンプルな構成です。必要に応じて、pidファイルの指定などを行なって下さい。

なお、OS X環境ではrc.localではなくlaunchd.plistという仕組みを使って定義します。
詳しくはAppleの公式ドキュメントを参照してください。

Tech Blog

(編集部)

株式会社リクルートライフスタイルのTech Blog編集部です。いま流行りのTechネタやちょっと使えるTipsなどをお届けしていきます。

NEXT