root権限なしでポート80をリスン
rootとしてnodeを実行すべきではないという一般的なルールがあります。しかし、1024未満のポートにバインドできるのはrootユーザーのみです。ここでauthbindが登場します。Authbindを使用すると、root以外のユーザーも1024未満のポートにバインドできます。%user%
をpm2
を実行するユーザーに置き換えてください。
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
pm2
を実行するユーザーのプロファイル(例:~/.bashrc
または~/.zshrc
)にエイリアスを追加する必要があります。(~/.bashrc
または~/.zshrc
を実行した直後にsource ~/.bashrc
またはsource ~/.zshrc
を実行する必要があります。)
+alias pm2='authbind --deep pm2'
最後に、authbind
を使用してpm2
を更新してください。
authbind --deep pm2 update
または、ユーザーのプロファイルにエイリアスを追加した場合は、単にpm2 update
を実行してください。
これで、root権限なしでポート80にバインドできるアプリケーションをPM2を使用して開始できます!
同じサーバー上の複数のPM2
クライアントとデーモンは、$HOME/.pm2/pub.sockと$HOME/.pm2/rpc.sockにあるソケットファイル経由で通信します。
PM2_HOME
環境変数を変更することで、複数のPM2インスタンスを開始できます。
PM2_HOME='.pm2' pm2 start echo.js --name="echo-node-1"
PM2_HOME='.pm3' pm2 start echo.js --name="echo-node-2"
これにより、2つの異なるPM2インスタンスが起動します。各インスタンスによって管理されているプロセスを一覧表示するには、以下を実行します。
PM2_HOME='.pm2' pm2 list
PM2_HOME='.pm3' pm2 list
デーモンモードなしでPM2を起動
デーモンモードなしでPM2を開始する前に、すべてのPM2インスタンスを停止してください(pm2 kill
)。
デーモン化せずにPM2を起動
pm2 start app.js --no-daemon
PM2のインストール時にデフォルトでインストールされるCLI pm2-runtime
もあり、これはNode.jsバイナリのドロップイン置換です。
ステートレスアプリ
本番アプリケーションはステートレスであるべきだという一般的なルールがあります。すべてのデータ、状態、WebSocketセッション、セッションデータは、あらゆる種類のデータベースまたはPUB/SUBシステムを介して共有する必要があります。
そうでない場合、アプリケーションは同じサーバー上や複数のサーバー間でスケールするのが困難になります。
たとえば、connect-redisを使用してセッションを共有できます。
12ファクターアプリの規約に従うこともお勧めします。http://12factor.net/
サーバーへのpm2のセットアップ
Ubuntu VPSでNode.js本番環境を設定するためのpm2の使い方.
ログとPIDファイル
デフォルトでは、ログ(エラーと出力)、pidファイル、ダンプ、PM2ログは~/.pm2/
にあります。
.pm2/
├── dump.pm2
├── custom_options.sh
├── pm2.log
├── pm2.pid
├── logs
└── pids
Harmony ES6の有効化
--node-args
オプションを使用すると、nodeインタープリターに引数を追加できます。プロセスのHarmonyを有効にするには、次のコマンドを入力します。
pm2 start my_app.js --node-args="--harmony"
そして、JSON宣言内では
[{
"name" : "ES6",
"script" : "es6.js",
"node_args" : "--harmony"
}]
CoffeeScript
CoffeeScript v1
pm2 install coffee-script
pm2 start app.coffee
CoffeeScript v2
pm2 install coffeescript
pm2 start app.coffee
以上です!
JSONのパイプ処理
プルリクエスト
#!/bin/bash
read -d '' my_json <<_EOF_
[{
"name" : "app1",
"script" : "/home/projects/pm2_nodetest/app.js",
"instances" : "4",
"error_file" : "./logz/child-err.log",
"out_file" : "./logz/child-out.log",
"pid_file" : "./logz/child.pid",
"exec_mode" : "cluster_mode",
"port" : 4200
}]
_EOF_
echo $my_json | pm2 start -
プロセスタイトル
アプリケーションをPM2で開始する際に環境変数PROCESS_TITLE
を指定できます。これにより、プロセスタイトルが設定されます。これは、プロセスから特定のデータを取得しようとする際に非常に役立ちます。たとえば、ps -fC name
を使用できます。
トランスパイラ
PM2でのトランスパイラの使用チュートリアルを参照してください。
ユーザーからのヒント(Issueより)
- Vagrantとpm2 #289
- 異なるポートで同じアプリケーションを起動する #322
- Ansibleとpm2の使用
- 引数としてのCron文字列
- プロセスが特定のメモリ量に達したときに再起動
- スティッキセッションとsocket.ioに関する議論
- EACCESS - pm2のユーザー/root権限の理解
外部リソースと記事
- PM2 — ユーティリティの概要とインストール
- Ubuntu 16.04でNode.jsアプリケーションを本番環境用に設定する方法
- チュートリアル:AWSでNode.jsサーバーを作成および管理する(パート2)
- node-foreverに別れを告げ、pm2へようこそ
- https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/
- https://serversforhackers.com/editions/2014/11/04/pm2/
- http://www.allaboutghost.com/keep-ghost-running-with-pm2/
- http://blog.ponyfoo.com/2013/09/19/deploying-node-apps-to-aws-using-grunt
- http://www.allaboutghost.com/keep-ghost-running-with-pm2/
- http://bioselemental.com/keeping-ghost-alive-with-pm2/
- http://blog.chyld.net/installing-ghost-on-ubuntu-13-10-aws-ec2-instance-with-pm2/
- http://blog.marvinroger.fr/gerer-ses-applications-node-en-production-pm2/
- https://www.codersgrid.com/2013/06/29/pm2-process-manager-for-node-js/
- http://www.z-car.com/blog/programming/how-to-rotate-logs-using-pm2-process-manager-for-node-js
- http://yosoftware.com/blog/7-tips-for-a-node-js/
- https://www.exponential.io/blog/nodeday-2014-moving-a-large-developer-workforce-to-nodejs
- http://blog.rapsli.ch/posts/2013/2013-10-17-node-monitor-pm2.html
- https://coderwall.com/p/igdqyw
- http://revdancatt.com/2013/09/17/node-day-1-getting-the-server-installing-node-and-pm2/
- https://medium.com/tech-talk/e7c0b0e5ce3c