Nodeを稼働させる

5,401 views

Published on

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

Published in: Software
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,401
On SlideShare
0
From Embeds
0
Number of Embeds
2,451
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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 プロセスを動かす」部分のみに フォーカスして、考えるポイントとなる問題 を紹介 • 問題に対しての解法はいくつもある • サーバ/サービスをどう運用させたいかで
 問題に対する解法を選ぶ

×