2017-08-16 16 views
0

Djangoは同期Webフレームワークであり、デフォルトのWebサーバは遅く、安全ではなく、最悪です。 Webサーバの実装に関するDjangoのドキュメントを見ると、詳細は明らかにならない:「軽量」であり、Djangoチームは本番環境での使用を推奨していると言われている。 Stackoverflowを検索すると、単一のリクエストは、最初のリクエストが完了するまで別のリクエストがハングアップすることがわかります。デフォルトのDjango httpサーバでの不思議な振る舞い

しかし、ここで驚いたのは私が遭遇したことです。サーバーを10秒間スリープさせる要求(長時間実行するI/Oをシミュレートする)とインデックスページをロードする同時の要求他の要求が処理されている間は、索引ページを即座にロードできます。

単一のGunicornワーカープロセスでNGINX/Gunicornの背後で実行されている構成で試した場合、最初の要求(10秒間のスリープ)が完了するまでインデックスページの読み込みが停止することがわかります。この動作は、GunicornがNGINXなしで実行される3番目のテストで反映されます。これは私が期待している動作ですが、デフォルトのサーバとはまったく異なります!

どうしてですか? DjangoのデフォルトWebサーバーの裏で何が起こっていますか?

答えて

1

組み込みの開発サーバーはシングルスレッドではなく、長い間使われていません。

DjangoサブクラスPythonのWSGIServerThreadingMixinがあります。これにより、すべての要求に対して新しいスレッドが生成されるため、要求はスレッドが使用可能になるまで待つ必要はありません。これによりリクエストが遅くなります - 各スレッドには独自のデータベース接続があるため、新しいスレッドごとに新しい接続を開く必要がありますが、同時リクエスト数は使用可能なリソースによって制限されます。

オンデマンドでのスポーンスレッドは便利ですが、サービス拒否攻撃のターゲットとしても非常に簡単です。これは、開発サーバーが安全でないと考えられる理由の1つで、プロダクション対応のWSGIサーバーが同じセットアップを使用しない理由です。

関連する問題