1

私はPHP/Apache、アプリケーションの実行が非常に簡単な世界から来ています。アプリケーションがクラッシュするたびPHPに、そのリクエストを実行している Apache プロセスは停止しますが、サーバーは引き続きうまく機能せず、他のクライアントに応答します。Python アプリケーションを同様の方法で動作させる方法はありますか。wsgiサーバーをどのようにセットアップすれば、同様に機能しますTornadoCherryPy? また、異なるドメインを持つ 1 つのサーバーから複数のアプリケーションを実行するにはどうすればよいでしょうか?

4

2 に答える 2

3

あなたが求めていることは、とにかく WSGI サーバーで起こる可能性があります。これは、Python 例外が現在のリクエストにのみ影響し、フレームワークまたは WSGI サーバーが例外をキャッチしてログに記録し、HTTP 500 ステータス ページに変換するためです。アプリケーションは引き続きメモリ内にあり、今後の要求を処理し続けます。

私たちが理解しているのは、「Apacheプロセスをクラッシュさせる」とは正確には何を意味するのかということです。

プロセス全体のコア ダンプが原因でプロセスが完全に終了するなど、コードがクラッシュすることはまれです。アプリケーション言語レベルのエラーを完全なプロセスのクラッシュと同一視する際に、用語が混乱していませんか。

プロセスをクラッシュさせる方法を見つけたとしても、Apache/mod_wsgi は問題なく処理し、プロセスは置き換えられます。Gunicorn WSGI サーバーもそれを行います。CherryPy は、それを監視するプロセス マネージャーが実行されていて、プロセス モニターが再起動しない限り実行されません。シングル プロセス モードの Tornado でも同じ問題が発生します。Gunicorn のワーカーとして Tornado を使用することは、それを回避する 1 つの方法です。また、複数のプロセスを実行するために、Tornado 自体にプロセス マネージャーが組み込まれている可能性があると考えています。

Python 例外の原因となったアプリケーションのバグが深刻で、プロセス内の状態が破損している場合、後続のリクエストに問題が発生する可能性があることに注意してください。これがPHPとの唯一の違いです。PHP では、要求が成功したかどうかにかかわらず、アプリケーションは効果的に破棄され、存続しません。そのため、バグのあるコードは後続のリクエストに影響を与えることができません。Python では、ロードされたコードと保持された状態のプロセスがリクエスト間で保持されるため、技術的には、プロセスを再起動して修正する必要がある状態になる可能性があります。1 つの要求がエラー応答を返した場合にプロセスを自動的に再起動するメカニズムを備えた WSGI サーバーは知りません。

于 2012-11-29T06:06:03.193 に答える
1

UNIX ライクな環境にいる場合は、デーモン モードの Apache でmod_wsgiを実行できます。これは、Python コード用に別のプロセスが存在することを意味し、たとえそれがクラッシュしたとしても、サーバーは正常に動作し続けます (うまくいけば、WSGI プロセスが自動的に再起動します)。WSGI アプリケーションは、複数のプロセスおよびプロセスごとの複数のスレッドで実行できます。

同じサーバーで複数のドメインを実行する場合は、Name-Based Virtual Hosts を確認してください。

于 2012-11-29T04:54:26.233 に答える