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

問題に対する解法を選ぶ

More Related Content

What's hot

サーバ構築自動化 On aws sqaleの場合
サーバ構築自動化 On aws   sqaleの場合サーバ構築自動化 On aws   sqaleの場合
サーバ構築自動化 On aws sqaleの場合
Ryo Kuroda
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
irix_jp
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDと
sters
 
20120731 c4 saリリースパーティlt
20120731 c4 saリリースパーティlt20120731 c4 saリリースパーティlt
20120731 c4 saリリースパーティlt
Kaz Watanabe
 
20131019 Eucalyptus in OSC 2013 Tokyo/Fall
20131019 Eucalyptus in OSC 2013 Tokyo/Fall20131019 Eucalyptus in OSC 2013 Tokyo/Fall
20131019 Eucalyptus in OSC 2013 Tokyo/Fall
Osamu Habuka
 

What's hot (20)

RancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにかRancherでMesosクラスタをデプロイしてみる的ななにか
RancherでMesosクラスタをデプロイしてみる的ななにか
 
boot2docker の format-me の話
boot2docker の format-me の話boot2docker の format-me の話
boot2docker の format-me の話
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
LXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoyaLXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoya
 
初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話
 
これから始める人のための自動化入門~Ubuntu Jujuを使って〜– OpenStack最新情報セミナー 2015年7月
これから始める人のための自動化入門~Ubuntu Jujuを使って〜– OpenStack最新情報セミナー 2015年7月これから始める人のための自動化入門~Ubuntu Jujuを使って〜– OpenStack最新情報セミナー 2015年7月
これから始める人のための自動化入門~Ubuntu Jujuを使って〜– OpenStack最新情報セミナー 2015年7月
 
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
 
これから始める人のための自動化入門 〜Ubuntu Jujuを使って〜
これから始める人のための自動化入門 〜Ubuntu Jujuを使って〜これから始める人のための自動化入門 〜Ubuntu Jujuを使って〜
これから始める人のための自動化入門 〜Ubuntu Jujuを使って〜
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
サーバ構築自動化 On aws sqaleの場合
サーバ構築自動化 On aws   sqaleの場合サーバ構築自動化 On aws   sqaleの場合
サーバ構築自動化 On aws sqaleの場合
 
Ubuntu Jujuを使ったOpenStack環境構築 – OpenStack最新情報セミナー 2015年7月
Ubuntu Jujuを使ったOpenStack環境構築 – OpenStack最新情報セミナー 2015年7月Ubuntu Jujuを使ったOpenStack環境構築 – OpenStack最新情報セミナー 2015年7月
Ubuntu Jujuを使ったOpenStack環境構築 – OpenStack最新情報セミナー 2015年7月
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDと
 
Dockerstart
DockerstartDockerstart
Dockerstart
 
20120731 c4 saリリースパーティlt
20120731 c4 saリリースパーティlt20120731 c4 saリリースパーティlt
20120731 c4 saリリースパーティlt
 
Eucalyptus 2.0 始めました!
Eucalyptus 2.0 始めました!Eucalyptus 2.0 始めました!
Eucalyptus 2.0 始めました!
 
shinken monitoringについて真剣に調べてみた結果
shinken monitoringについて真剣に調べてみた結果shinken monitoringについて真剣に調べてみた結果
shinken monitoringについて真剣に調べてみた結果
 
openSUSEの紹介とサーバ構築
openSUSEの紹介とサーバ構築openSUSEの紹介とサーバ構築
openSUSEの紹介とサーバ構築
 
SIerにおけるKubernetes活用(OSSユーザーによる勉強会-公開版)
SIerにおけるKubernetes活用(OSSユーザーによる勉強会-公開版)SIerにおけるKubernetes活用(OSSユーザーによる勉強会-公開版)
SIerにおけるKubernetes活用(OSSユーザーによる勉強会-公開版)
 
20131019 Eucalyptus in OSC 2013 Tokyo/Fall
20131019 Eucalyptus in OSC 2013 Tokyo/Fall20131019 Eucalyptus in OSC 2013 Tokyo/Fall
20131019 Eucalyptus in OSC 2013 Tokyo/Fall
 

Viewers also liked

Iketeru Gopher 5 points
Iketeru Gopher 5 pointsIketeru Gopher 5 points
Iketeru Gopher 5 points
Takuya Ueda
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
Mitsuru Ogawa
 
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
Amazon Web Services Japan
 
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
 

Viewers also liked (17)

Scalable Node.js with Redis Store
Scalable Node.js with Redis StoreScalable Node.js with Redis Store
Scalable Node.js with Redis Store
 
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話
 
Iketeru Gopher 5 points
Iketeru Gopher 5 pointsIketeru Gopher 5 points
Iketeru Gopher 5 points
 
TitaniumとNode.jsは兄弟
TitaniumとNode.jsは兄弟TitaniumとNode.jsは兄弟
TitaniumとNode.jsは兄弟
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
Node.js patterns of module export / require
Node.js patterns of module export / requireNode.js patterns of module export / require
Node.js patterns of module export / require
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koa
 
Extensible web
Extensible webExtensible web
Extensible web
 
9 anti-patterns for node.js teams
9 anti-patterns for node.js teams9 anti-patterns for node.js teams
9 anti-patterns for node.js teams
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
 
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
[AWSマイスターシリーズ]Amazon CloudWatch & Auto Scaling
 
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
 
Socket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶSocket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶ
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
 
これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
 
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
 

Similar to Nodeを稼働させる

メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012
cfm_art
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
Tadahiro Ishisaka
 
A Reseach of Openstack + Docker at recent code
A Reseach of Openstack + Docker at recent codeA Reseach of Openstack + Docker at recent code
A Reseach of Openstack + Docker at recent code
Takahiro Shida
 

Similar to Nodeを稼働させる (20)

worker_threadsを使った実装の勘所
worker_threadsを使った実装の勘所worker_threadsを使った実装の勘所
worker_threadsを使った実装の勘所
 
Node.js Tutorial at Hiroshima
Node.js Tutorial at HiroshimaNode.js Tutorial at Hiroshima
Node.js Tutorial at Hiroshima
 
Azure de debian
Azure de debianAzure de debian
Azure de debian
 
メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012
 
後期講座01
後期講座01後期講座01
後期講座01
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
 
Open vzでdr hbstudy
Open vzでdr hbstudyOpen vzでdr hbstudy
Open vzでdr hbstudy
 
Babelで先取り次世代javascript
Babelで先取り次世代javascriptBabelで先取り次世代javascript
Babelで先取り次世代javascript
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
Nuxt0501ver1
Nuxt0501ver1Nuxt0501ver1
Nuxt0501ver1
 
2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source
 
Openshift 20191128
Openshift 20191128Openshift 20191128
Openshift 20191128
 
PHP7を実際に動かしてみた@第96回PHP勉強会 #phpstudy
PHP7を実際に動かしてみた@第96回PHP勉強会 #phpstudyPHP7を実際に動かしてみた@第96回PHP勉強会 #phpstudy
PHP7を実際に動かしてみた@第96回PHP勉強会 #phpstudy
 
DevOps for Small Starter
DevOps for Small StarterDevOps for Small Starter
DevOps for Small Starter
 
「Eye」でカジュアルにプロセス監視
「Eye」でカジュアルにプロセス監視「Eye」でカジュアルにプロセス監視
「Eye」でカジュアルにプロセス監視
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
A Reseach of Openstack + Docker at recent code
A Reseach of Openstack + Docker at recent codeA Reseach of Openstack + Docker at recent code
A Reseach of Openstack + Docker at recent code
 
第7回鹿児島Node.jsの会勉強会資料
第7回鹿児島Node.jsの会勉強会資料第7回鹿児島Node.jsの会勉強会資料
第7回鹿児島Node.jsの会勉強会資料
 

More from kumatch kumatch (6)

AngularJSからReactに移ったケースの話
AngularJSからReactに移ったケースの話AngularJSからReactに移ったケースの話
AngularJSからReactに移ったケースの話
 
Node platforms
Node platformsNode platforms
Node platforms
 
Node.js Error & Debug Leveling
Node.js Error & Debug LevelingNode.js Error & Debug Leveling
Node.js Error & Debug Leveling
 
Learning a node stream
Learning a node streamLearning a node stream
Learning a node stream
 
[Node] Multiprocessing and runs continuously
[Node] Multiprocessing and runs continuously[Node] Multiprocessing and runs continuously
[Node] Multiprocessing and runs continuously
 
PHPカンファレンス関西2011/スマートフォン時代のWebシステム
PHPカンファレンス関西2011/スマートフォン時代のWebシステムPHPカンファレンス関西2011/スマートフォン時代のWebシステム
PHPカンファレンス関西2011/スマートフォン時代のWebシステム
 

Nodeを稼働させる