
Docker連携
コンテナを使用していますか?私たちがサポートします。本番環境でNode.jsを最大限に活用するための完璧なコンパニオンであるpm2-runtimeを今すぐ使い始めましょう。
pm2-runtimeの目標は、アプリケーションを適切なNode.js本番環境にラップすることです。コンテナ内でNode.jsアプリケーションを実行する際の主要な問題を解決します。例えば、
- 高いアプリケーション信頼性のためのセカンドプロセスフォールバック
- プロセスフロー制御
- アプリケーションを常に正常で高性能に保つための自動アプリケーション監視
- 自動ソースマップ検出と解決のサポート
さらに、コンテナとアプリケーションの間にPM2をレイヤーとして使用することで、アプリケーション宣言ファイル、カスタマイズ可能なログシステム、および本番環境でNode.jsアプリケーションを管理するためのその他の優れた機能など、PM2の強力な機能がもたらされます。
コンテナ内でPM2を使用する
Dockerfileに次の行を追加してPM2をインストールします
RUN npm install pm2 -g
次に、node
バイナリを pm2-runtime
に置き換えます
CMD ["node", "app.js"]
次のように変更します
CMD ["pm2-runtime", "app.js"]
これで準備完了です! Node.jsアプリケーションは、適切なNode.js本番環境にラップされています。
設定ファイルの起動
PM2で生のNode.jsアプリケーションを実行する代わりに、設定ファイル(またはプロセスファイル)で宣言し、クラスタモードの有効化など、いくつかの設定変数を設定できます。
次の内容でecosystem.config.jsファイルを作成しましょう
module.exports = [{
script: 'app.js',
name: 'app',
exec_mode: 'cluster',
instances: 2
}, {
script: 'worker.js',
name: 'worker'
}]
使用可能なすべてのオプションはこちらに記載されています。
その後、CMDディレクティブを次のように置き換えることができます
CMD ["pm2-runtime", "process.yml"]
各プロセスを独自のDockerに分割するには、–only [app-name]オプションを使用できます
CMD ["pm2-runtime", "process.yml", "--only", "APP"]
exec_mode clusterとnuxtjsを一緒に使用する
クラスタモードでpm2を実行すると、nuxtjsがrootDirを解析する方法により、ecosystem.config.js
がcwdパスに追加されます。これを修正するには、argsセクションで設定パスを指定する必要があります
module.exports = {
apps: [
{
name: 'my-nuxtjs-app',
exec_mode: 'cluster',
instances: 2,
cwd: '/var/www',
script: './node_modules/nuxt-start/bin/nuxt-start.js',
args: '-c /var/www/nuxt.config.js'
}
]
}
ログフォーマットオプション
ログ出力フォーマットを変更する場合は、次のオプションのいずれかを選択できます
- –json: ログをJSON形式(logstash)で出力します
- –format: ログを=スタイルの形式で出力します
- –raw: ログをそのまま出力します
これらのフラグのいずれかを使用するには、pm2-runtimeに渡すだけです
CMD ["pm2-runtime", "--json", "process.yml"]
グレースフルシャットダウンの有効化
コンテナがシャットダウンシグナルを受信すると、PM2はこのシグナルをアプリケーションに転送し、すべてのデータベース接続を閉じ、すべてのクエリが処理されるか、またはその他の最終処理が正常なグレースフルシャットダウンの前に完了するのを待ちます。
シャットダウンシグナルのキャッチは簡単です。Node.jsアプリケーションにリスナーを追加し、アプリを停止する前に必要な処理を実行する必要があります
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
デフォルトでは、PM2は1600ミリ秒待ってから、最終的なSIGKILLシグナルを送信します。アプリケーション設定ファイル内でkill_timeout
オプションを設定することで、この遅延を変更できます。
アプリケーションの状態管理の詳細については、こちらをご覧ください
開発環境
開発、テスト、本番環境間で一貫した環境を維持するために、開発者にコンテナ内でプログラミングするように指示することがあります。
pm2-runtimeをpm2-devに置き換えると、監視と再起動機能が有効になります。これは、ホストファイルがVOLUMEとしてコンテナに公開されている場合、開発コンテナでは非常に興味深いものです。
PM2.ioの使用
Keymetrics.ioは、PM2上に構築された監視サービスであり、アプリケーションの監視と管理(ログ、再起動、例外監視など)を容易にします。Keymetricsでバケットを作成すると、公開鍵と秘密鍵が取得されます。
pm2-runtimeでKeymetrics監視を有効にするには、CLIオプションの–public XXXと–secret YYYを使用するか、環境変数KEYMETRICS_PUBLICとKEYMETRICS_SECRETを渡すことができます。
Dockerfileを介したCLIオプションの使用例
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]
または、環境変数を介して
ENV PM2_PUBLIC_KEY=XXX
ENV PM2_SECRET_KEY=YYY
または、Docker runコマンドを介して
docker run --net host -e "PM2_PUBLIC_KEY=XXX" -e "PM2_SECRET_KEY=XXX" <...>
pm2-runtimeヘルパー
pm2-runtimeヘルパーは次のとおりです
>>> pm2-runtime -h
Usage: pm2-runtime app.js
pm2-runtime is a drop-in replacement node.js binary with some interesting production features
Options:
-V, --version output the version number
-i --instances <number> launch [number] of processes automatically load-balanced. Increase overall performances and performance stability.
--secret [key] [MONITORING] keymetrics secret key
--public [key] [MONITORING] keymetrics public key
--machine-name [name] [MONITORING] keymetrics machine name
--raw raw log output
--json output logs in json format
--format output logs formatted like key=val
--delay <seconds> delay start of configuration file by <seconds>
--web [port] launch process web api on [port] (default to 9615)
--only <application-name> only act on one application of configuration
--no-auto-exit do not exit if all processes are errored/stopped or 0 apps launched
--env [name] inject env_[name] env variables in process config file
--watch watch and restart application on file change
--error <path> error log file destination (default disabled)
--output <path> output log file destination (default disabled)
-h, --help output usage information
Commands:
*
start <app.js|json_file> start an application or json ecosystem file