私たちはかなりの数の地方紙(現在は13、次の月には30以上になる予定)のニュースポータルを作成し、それぞれ2kから100kのページビュー/日。各サイトが大きくカスタマイズされている状況から、それぞれの違いが構成やカスタムテンプレートの問題である状況に変化しているため、私たちのソフトウェアはすべてのサイトですでにほぼ同じです。現在、当社の展開戦略は、各サイト(サイトトラフィックに応じて1〜17人ずつ)、16コアサーバーと12GB RAMの1つのガンコーンインスタンスです。この設定の問題は、使用されているかどうかにかかわらず、各作業者(通常の前もって準備されたガンコーン)が110MBかかります。今では新しいサイトではそれほど多くのリクエストを処理するためにRAMを増やす必要があるので、基本的には拡張できません。また、各サイトが独立しているこのモデルから移動するので、各サイトには独自のデータベースがあり、リレーショナルデータベース(mysqlはpgsqlに移行)を使用しているので、この方法で断片化する。同じpythonプロセスで複数のサイトを実行する
1つのgunicornインスタンスですべてのサイトを実行して実験していますので、サーバーを完全に使用し、ロードバランサの後ろにサーバーを追加することができました。問題は、Djangoは私がこれまで考えてきたもの、私が実装する必要があると思いますので、ために、1つのサイトは、プロセスごとに実行されている多くの場所で想定しているということです。
- からHTTP_HOSTを取るミドルウェアスレッドのローカル変数に識別子を設定します。
- この変数を使用してカスタムテンプレートをロードするテンプレートローダー。
- Monkey patch django.db.model.Modelおそらくメタクラスが追加されているかもしれませんが(それは可能ではありませんが、ときどき使用する必要があるカスタムマネージャーのために必要と思われます)、マネージャーを上書きする最初に元のマネージャのdb_manager(識別子)を呼び出し、目的のメソッドを呼び出します。私はまた、常にusing =識別子パラメータを含めるために、saveメソッドとdeleteメソッドを上書きする必要があります。
- 大きな問題ではなくinclusion_tagデコレータの使用をやめる必要があると思いますが、私はこのようなケースについて考える必要があります。
- サイトごとにカスタムURLまたは追加URLが必要な場合は、urlresolversの重大で醜いパッチを適用してください。私は今はそれらを必要としないが、おそらくある時点でそうするだろう。
これは私がそれを実装しなくてもやって来て、どこが壊れているのか見ていて、それが働くにはさらに多くの変更が必要だと確信しています。だから私は本当にそれをやりたいとは思っていません。特に私が必要とするメンテナンスの余分な努力はありますが、私は何も見ていないし、誰かがすでにこれをより良い方法で解決したことを知りたいです。もちろん、私はDjangoの使用を止めることもできますが(私はすでにそうする理由はたくさんあります)、それは大変な書き換えを意味し、2つの互換性のないブランチを維持して新しいものがdjangoバージョンとの機能パリティに達するまで私はすべての醜いハックよりも悪いようです。
*正確に*サイトが提供しているものはありませんか? –
サイトcontribは、すべてのサイトが同じデータベースにあるとみなし、それぞれのモデルに外部キーを追加します。また、サイトごとにカスタムテンプレートを用意するという私の要求をカバーしていません。 –
それは確かです。テンプレートパス内のSiteオブジェクトから特定の部分のみを使用することができます。 –