私の経験では、PHP サーバーはログまたはサーバー側に例外をスローしますが、node.js は単にクラッシュするだけです。すべてが非同期で行われるため、コードを try-catch で囲むことも機能しません。他のユーザーが本番サーバーで何をしているのか知りたいです。
ベストアンサー1
PM2
まず、PM2
をインストールすることを強くお勧めしますNode.js
。PM2 は、クラッシュの処理や Node アプリの監視、負荷分散に非常に優れています。PM2 は、クラッシュしたとき、何らかの理由で停止したとき、またはサーバーが再起動したときでも、Node アプリをすぐに起動します。そのため、コードを管理した後でも、アプリがクラッシュした場合、PM2 はすぐに再起動できます。詳細については、PM2のインストールと実行
他の回答はNodeのドキュメントで読むと本当に狂っています。http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception
他の回答を使用している場合は、Node Docs を読んでください。
uncaughtException
これは例外処理のための非常に粗雑なメカニズムであり、将来削除される可能性があることに注意してください。
ここで、アプリ自体がクラッシュするのを防ぐための解決策に戻ります。
そこで、いろいろ調べた結果、Node ドキュメント自体が示唆している内容にたどり着きました。
を使用せず
uncaughtException
、代わりdomains
に を使用してくださいcluster
。 を使用する場合はuncaughtException
、未処理の例外が発生するたびにアプリケーションを再起動してください。
ドメインと集まる
実際に行っているのは、エラーをトリガーしたリクエストにエラー応答を送信し、他のリクエストを通常の時間内に終了させ、そのワーカーで新しいリクエストのリッスンを停止することです。
このように、ドメインの使用はクラスタモジュールと連携して行われます。マスタープロセスは、ワーカーがエラーに遭遇したときに新しいワーカーをフォークすることができるからです。私の言っていることを理解するには、以下のコードを参照してください。
Domain
を使用し、 を使ってプログラムを複数のワーカー プロセスに分割する復元力によりCluster
、より適切に対応し、より安全にエラーを処理できるようになります。
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
ただし、Domain
Nodeのドキュメントに記載されているように、新しい代替品がリリースされると廃止予定であり、削除されます。
このモジュールは廃止予定です。代替 API が完成すると、このモジュールは完全に廃止されます。ドメインが提供する機能を絶対に必要とするユーザーは、当面はこれに頼ることができますが、将来的には別のソリューションに移行する必要が生じることを覚悟しておく必要があります。
しかし、新しい代替品が導入されるまでは、Node Documentation が提案するドメインとクラスターが唯一の適切なソリューションです。
より深く理解しDomain
、Cluster
読むには
https://nodejs.org/api/domain.html#domain_domain
(Stability: 0 - Deprecated
)
クラスターとドメインに関する素晴らしい詳細な説明を共有してくれた@Stanley Luoに感謝します。