nodeを稼働させる

35
Node を稼働させる in production 2014-06-14

Upload: kumatch-kumatch

Post on 26-Jun-2015

3.813 views

Category:

Software


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Nodeを稼働させる

Node を稼働させる

in production

2014-06-14

Page 2: Nodeを稼働させる

Yosuke Kumakura (kumatch)

@kumatch

Feedtailor inc.

Current game: Diablo3 reaper of souls

Page 3: Nodeを稼働させる

「みんなどうやって Node を (production で) 動かしているの?」

というお話があったので

Page 4: Nodeを稼働させる

Agenda

• これまでやった Node production を振り返ります。

• これから動かそうとしている人に参考になりそうな問題点をあげていきます。

Page 5: Nodeを稼働させる

2011

Page 6: Nodeを稼働させる

はじめての Node

Node v0.4, その後 v0.6

!forever で起動するようにしていたが、Node v0.6.2 に上げたらプロセス操作できなくなってしまったので、しかたなく init.d スクリプト + monit へ移行した。

node は nvm でインストール。deploy は独自 (rsync)

Page 7: Nodeを稼働させる

2012

Page 8: Nodeを稼働させる

Node 自体に慣れてきた

Node v0.6 => v0.8 !

東京 Node 学園祭で「binary install しろ」と言われて驚きながらも環境を作り直す。 プロセス管理は init.d or supervisord with monit

Page 9: Nodeを稼働させる

2013

Page 10: Nodeを稼働させる

インフラの構築&稼働方法の転換期Node v0.8 => v0.10 !Chef + Capistrano によるインフラ構築へ移行

Node も nodejs recipe を使って binary install

プロセス管理は upstart + monit へ。

(試験的に forever, pm2、最終的にはこの時は採用せず)

Page 11: Nodeを稼働させる

Production Node サーバを 作るのに出くわす問題

Page 12: Nodeを稼働させる

Node 実行環境 どうやって作るの?問題

Page 13: Nodeを稼働させる

配布バイナリを使う

• 公式配布バイナリに Windows, OSX, Linux,

Solaris 版あり

• 各種 OS パッケージマネージャでも配布

• 少し古い場合あり

Page 14: Nodeを稼働させる

配布バイナリを使う

• Chef recipe もあります。

• binary / source どちらからでも構築可能

• Version manager プログラムで入れる手も。

色んなバージョンで試せる。

導入するユーザと Path に注意

Page 15: Nodeを稼働させる

Node 起動プログラム どうするの?問題

Page 16: Nodeを稼働させる

機能性

柔軟性

pm2 / forever

upstart

init scripts

先ほど色々あげていましたが…

環境に適した/やりやすい方法を選ぶ

Page 17: Nodeを稼働させる

init scripts

• shell で出来ることなら大抵いけるはず

• 自分で頑張れば何でもできる

• 自分で全部頑張る必要あり

Page 18: Nodeを稼働させる

upstart

• init script をもう少し書きやすく

• 自動起動/プロセスが落ちたら再開など最低限のプロセス管理機能が簡単に使える

• その上で案外と色々できる

Page 19: Nodeを稼働させる

forever (Node)

• node プロセスを常駐させるための module

• プロセスが落ちても即時復帰

• 標準/エラー出力先, PID 管理なども自動で用意される or 指定可能

Page 20: Nodeを稼働させる

pm2 (Node)

• forever + もっと便利な機能

• describe process

• monitoring (CPU, memory)

• Auto cluster (or fork)

Page 21: Nodeを稼働させる

etc.

• foreman

• supervisor

• ….

Page 22: Nodeを稼働させる

自動起動させたい?

• init.d + node

• upstart + node run

• upstart + forever

• upstart + pm2

もちろん• nohup node

• forever start

• pm2 start

別に…

Page 23: Nodeを稼働させる

Node プロセス 誰で動かすの?問題

Page 24: Nodeを稼働させる

意外と悩むプロセス所有権• root or 専用ユーザ

• 利用手段次第では、目的のユーザでプロセスを動かすのにちょっとだけ苦労する

Page 25: Nodeを稼働させる

余談: root で動かせるならこんな手もvar user = “myapp”; !

if (process.getuid() == 0) { try { process.setuid(user); // 以後 myapp プロセスに

} catch (e) { // undefined user } }

Page 26: Nodeを稼働させる

Node プロセス メモリ喰い過ぎてない?問題

Page 27: Nodeを稼働させる

基本的には GC されてないだけ• V8 が自動的にタイミングを見つけて GC する

• 一応手動で GC を起こすこともできる

• --expose-gc オプション付きで Node 起動

• GC すると “Stop the world”

Page 28: Nodeを稼働させる

(現実的な量で) メモリ利用量が多い傾向の内容• (HTTP などの) クライアント数が本当に多い

• コード内で読み込む (require) ファイルが多い

• (DB などの) コネクションインスタンスを扱っている

Page 29: Nodeを稼働させる

Node プロセス

CPU 喰い過ぎてない?問題

Page 30: Nodeを稼働させる

他に影響を与えない程度に CPU をがっつり使う傾向にある

• 見てるタイミング次第で色々ある

• コード(処理のフロー)を見直す

• (稀に) 本当に張り付いてしまっていることがある

• monit 等で CPU 張り付きプロセスを落とす

Page 31: Nodeを稼働させる

Node Production サーバの ライフサイクル

Page 32: Nodeを稼働させる

create server

deploy application

start / run application

Server lifecycle 1

initial setup

stop application

update / restart server

Page 33: Nodeを稼働させる

create server (from template)

deploy application

start application ($ pm2 start)

destroy server

Server lifecycle 2

Page 34: Nodeを稼働させる

create server ($ heroku create)

deploy application ($ git push heroku)

destroy server ($ heroku destroy)

Server lifecycle 3 (heroku)

Page 35: Nodeを稼働させる

まとめ• 「Node プロセスを動かす」部分のみにフォーカスして、考えるポイントとなる問題を紹介

• 問題に対しての解法はいくつもある

• サーバ/サービスをどう運用させたいかで問題に対する解法を選ぶ