Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Nodeを稼働させる

6,031 views

Published on

Node.js 大阪勉強会 2014-06-14

Published in: Software
  • Be the first to comment

Nodeを稼働させる

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

×