nodeを稼働させる
DESCRIPTION
Node.js 大阪勉強会 2014-06-14TRANSCRIPT
Node を稼働させる
in production
2014-06-14
Yosuke Kumakura (kumatch)
@kumatch
Feedtailor inc.
Current game: Diablo3 reaper of souls
「みんなどうやって Node を (production で) 動かしているの?」
というお話があったので
Agenda
• これまでやった Node production を振り返ります。
• これから動かそうとしている人に参考になりそうな問題点をあげていきます。
2011
はじめての Node
Node v0.4, その後 v0.6
!forever で起動するようにしていたが、Node v0.6.2 に上げたらプロセス操作できなくなってしまったので、しかたなく init.d スクリプト + monit へ移行した。
node は nvm でインストール。deploy は独自 (rsync)
2012
Node 自体に慣れてきた
Node v0.6 => v0.8 !
東京 Node 学園祭で「binary install しろ」と言われて驚きながらも環境を作り直す。 プロセス管理は init.d or supervisord with monit
2013
インフラの構築&稼働方法の転換期Node v0.8 => v0.10 !Chef + Capistrano によるインフラ構築へ移行
Node も nodejs recipe を使って binary install
プロセス管理は upstart + monit へ。
(試験的に forever, pm2、最終的にはこの時は採用せず)
Production Node サーバを 作るのに出くわす問題
Node 実行環境 どうやって作るの?問題
配布バイナリを使う
• 公式配布バイナリに Windows, OSX, Linux,
Solaris 版あり
• 各種 OS パッケージマネージャでも配布
• 少し古い場合あり
配布バイナリを使う
• Chef recipe もあります。
• binary / source どちらからでも構築可能
• Version manager プログラムで入れる手も。
色んなバージョンで試せる。
導入するユーザと Path に注意
Node 起動プログラム どうするの?問題
機能性
柔軟性
pm2 / forever
upstart
init scripts
先ほど色々あげていましたが…
環境に適した/やりやすい方法を選ぶ
init scripts
• shell で出来ることなら大抵いけるはず
• 自分で頑張れば何でもできる
• 自分で全部頑張る必要あり
upstart
• init script をもう少し書きやすく
• 自動起動/プロセスが落ちたら再開など最低限のプロセス管理機能が簡単に使える
• その上で案外と色々できる
forever (Node)
• node プロセスを常駐させるための module
• プロセスが落ちても即時復帰
• 標準/エラー出力先, PID 管理なども自動で用意される or 指定可能
pm2 (Node)
• forever + もっと便利な機能
• describe process
• monitoring (CPU, memory)
• Auto cluster (or fork)
etc.
• foreman
• supervisor
• ….
自動起動させたい?
• init.d + node
• upstart + node run
• upstart + forever
• upstart + pm2
もちろん• nohup node
• forever start
• pm2 start
別に…
Node プロセス 誰で動かすの?問題
意外と悩むプロセス所有権• root or 専用ユーザ
• 利用手段次第では、目的のユーザでプロセスを動かすのにちょっとだけ苦労する
余談: root で動かせるならこんな手もvar user = “myapp”; !
if (process.getuid() == 0) { try { process.setuid(user); // 以後 myapp プロセスに
} catch (e) { // undefined user } }
Node プロセス メモリ喰い過ぎてない?問題
基本的には GC されてないだけ• V8 が自動的にタイミングを見つけて GC する
• 一応手動で GC を起こすこともできる
• --expose-gc オプション付きで Node 起動
• GC すると “Stop the world”
(現実的な量で) メモリ利用量が多い傾向の内容• (HTTP などの) クライアント数が本当に多い
• コード内で読み込む (require) ファイルが多い
• (DB などの) コネクションインスタンスを扱っている
Node プロセス
CPU 喰い過ぎてない?問題
他に影響を与えない程度に CPU をがっつり使う傾向にある
• 見てるタイミング次第で色々ある
• コード(処理のフロー)を見直す
• (稀に) 本当に張り付いてしまっていることがある
• monit 等で CPU 張り付きプロセスを落とす
Node Production サーバの ライフサイクル
create server
deploy application
start / run application
Server lifecycle 1
initial setup
stop application
update / restart server
create server (from template)
deploy application
start application ($ pm2 start)
destroy server
Server lifecycle 2
create server ($ heroku create)
deploy application ($ git push heroku)
destroy server ($ heroku destroy)
Server lifecycle 3 (heroku)
まとめ• 「Node プロセスを動かす」部分のみにフォーカスして、考えるポイントとなる問題を紹介
• 問題に対しての解法はいくつもある
• サーバ/サービスをどう運用させたいかで問題に対する解法を選ぶ